Skip to content

[codex] remove legacy frontends#302

Open
rikohomeless wants to merge 1 commit into
ProverCoderAI:mainfrom
rikohomeless:issue-298
Open

[codex] remove legacy frontends#302
rikohomeless wants to merge 1 commit into
ProverCoderAI:mainfrom
rikohomeless:issue-298

Conversation

@rikohomeless
Copy link
Copy Markdown
Contributor

Summary

  • Remove legacy frontend surfaces: API Console routes/assets, Gridland/TUI menu, and the old app SSR scaffold.
  • Keep the browser frontend as the only user-facing frontend launched by docker-git browser.
  • Rehome pure helpers still used by the browser UI into packages/app/src/web and update tests/docs/dependencies.

Closes #298

Validation

  • bun install --force
  • bun run --cwd packages/app typecheck
  • bun run --cwd packages/app build:docker-git
  • bun run --cwd packages/app build:web
  • bun run --cwd packages/app test
  • bun run --cwd packages/api typecheck
  • bun run --cwd packages/api test
  • bun run --cwd packages/lib typecheck
  • bun run --cwd packages/lib test
  • bun run check:dist-deps-prune
  • node scripts/final-build/browser-web-smoke.mjs

Notes

  • Direct push to ProverCoderAI/docker-git was not permitted for the current GitHub user, so this PR is opened from the rikohomeless/docker-git fork.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 14, 2026

📝 Walkthrough

Summary by CodeRabbit

  • Breaking Changes

    • Встроенный веб‑UI больше не подаётся API‑сервером; консольный/встраиваемый интерфейс удалён.
    • CLI перестаёт по умолчанию запускать интерактивное меню: основной пользовательский интерфейс — браузерная команда/панель.
  • Documentation

    • Обновлён README и пакетные описания: чётко описано разделение APP (CLI + browser), LIB (бизнес‑логика) и API (сервер).

Walkthrough

Удалён встроенный TUI/frontend из API и удалены многочисленные модули TUI/CLI-меню в пакете app; соответствующие потоки (create/auth/project-auth/select) и типы перенесены или объявлены в web-слое; маршрутизация CLI/парсер и конфигурации сборки/теста обновлены для единственного browser-интерфейса.

Changes

API: убрать встроенный UI и перестроить роутер

Layer / File(s) Summary
Удаление UI-модулей и тестов
packages/api/src/ui.ts, packages/api/tests/ui.test.ts, packages/api/README.md
Удалён модуль с HTML/CSS/JS UI, удалены тесты UI и инструкция про http://localhost:3334/ в README.
Перепаковка HTTP-роутера
packages/api/src/http.ts
makeRouter() больше не включает UI-эндпойнты; роутер теперь строится через withCoreRouteswithAuth → остальные API-роуты; импорт ./ui.js удалён.

Удаление TUI-меню из app (CLI) и перенаправление на browser

Layer / File(s) Summary
Удаление TUI-ядра и состояния
packages/app/src/docker-git/menu-*.ts, packages/app/src/docker-git/menu-*.tsx, packages/app/src/docker-git/menu-types.ts, packages/app/src/docker-git/menu-state.ts, packages/app/src/docker-git/menu-shared.ts
Удаление множества файлов, реализующих TUI: рендеры, обработчики ввода, state/queue, общие утилиты и типы; экспортные API и типы для меню устранены.
Удаление Gridland/Ink интеграции
packages/app/src/docker-git/gridland-bun.d.ts, packages/app/src/docker-git/menu-gridland-runtime.tsx, packages/app/src/ui/primitives-gridland.tsx
Удалены типы и runtime-обвязка для Gridland/CLI-рендера.
CLI-парсер и program
packages/app/src/docker-git/cli/parser.ts, packages/app/src/docker-git/cli/usage.ts, packages/app/src/docker-git/program.ts
Команда menu/ui удалена; пустые args теперь дают Help; Menu исключён из direct-команд в program и маршрутизируется как неподдержанный direct-tag.
Терминальный вывод и переиспользование в SSH-клиенте
packages/app/src/docker-git/terminal-output.ts, packages/app/src/docker-git/open-project-ssh.ts, packages/app/src/docker-git/terminal-session-client.ts
Добавлена функция writeToTerminal, заменяющая часть обязанностей удалённого menu-shared и используемая в SSH/session-клиентах.
Удаление тестов TUI
packages/app/tests/docker-git/menu-*.test.ts, packages/app/tests/app/main.test.ts и др.
Удалены тесты, покрывавшие TUI-логику; многие тесты переписаны на web-аналоги или удалены.

Консолидация логики в web-слой

Layer / File(s) Summary
Новые/перемещённые web-типизации и flow
packages/app/src/web/create-types.ts, packages/app/src/web/create-flow.ts, packages/app/src/web/auth-flow.ts, packages/app/src/web/project-auth-flow.ts
Типы Create/Auth/ProjectAuth и связанные константы объявлены в web-слое (перенос или локальное объявление вместо menu-types).
Переназначение импортов web-компонентов
packages/app/src/web/* (action-prompt, actions-, app-ready-, panel-, project-select-)
Массовая замена импортов: модули web теперь используют локальные create-/auth-flow, project-select-* и т.п. вместо ../docker-git/*-shared модулей.
Select / search / order для browser
packages/app/src/web/project-select-types.ts, project-select-order.ts, project-select-presenter.ts, project-select-search.ts
Введён SelectProjectRuntime и унифицированы фильтрация/сортировка/презентер для browser-панелей; удалены ProjectItem‑специфичные обёртки в web-слое.

Конфигурации, сборка, lint и тесты

Layer / File(s) Summary
Vite / tsconfig / package scripts
packages/app/vite.config.ts (удалён), packages/app/vite.docker-git.config.ts, packages/app/vite.web.config.ts, packages/app/tsconfig*.json, packages/app/package.json
Удалена общая Vite-конфигурация SSR; vite.docker-git и vite.web скорректированы (убраны gridland-плагины/external), tsconfig и package.json обновлены под docker-git browser + изменения сборки/скриптов.
ESLint surface rules
packages/app/eslint.config.mts, packages/app/eslint/no-lib-imports.mjs
Добавлен src/web/create-flow.ts в списки файлов; функция isFrontendSurfaceFile упростлена (только src/docker-git/, src/web/, tests/).
Lib-слой: удаление menu API и тестов
packages/lib/src/core/menu.ts, packages/lib/src/core/domain.ts, packages/lib/vite.config.ts, packages/lib/tests/core/menu.test.ts
Удалены menu-модуль и переэкспорты; в domain добавлен локальный ParseError; удалена lib vite.config и связанные тесты.

E2E и скрипты

Layer / File(s) Summary
E2E скрипт: controller API вместо прямых файловых write
scripts/e2e/issue-61-auth-labels.sh
E2E обновлён: для установки labeled auth используется runAuthMenuFlow/runProjectAuthFlow controller API; добавлен requireSnapshot для валидации результата.

Sequence Diagram

sequenceDiagram
    participant CLI as CLI (docker-git)
    participant Browser as Browser UI
    participant API as API server
    participant Service as Backend services
    CLI->>API: API requests (create/open/status)
    Browser->>API: Browser requests (projects, auth flows)
    API->>Service: authenticate / create session / DB reads
    Service-->>API: session/data
    API-->>Browser: JSON responses (no embedded HTML)
    API-->>CLI: JSON responses
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • ProverCoderAI/docker-git#280: модифицирует обработку ввода в menu-input-handler.ts; этот PR полностью удаляет тот модуль — сильное пересечение по TUI/input-поверхности.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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 (4)
packages/app/src/web/actions-projects.ts (1)

465-504: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Добавьте явную ветку для "Quit" и обеспечьте исчерпывающую проверку union-типа.

Сейчас обработчик "Quit" скрыт в fallback-ветке (последний globalThis.close()), что нарушает требование исчерпывающего анализа union-типов из coding guidelines. Это создаёт риск регрессии при добавлении новых пунктов меню. Используйте явный кейс для выхода с защитной проверкой типа, а затем добавьте exhaustiveness check через const _exhaustive: never = currentMenu — это гарантирует перехват всех ветвей на уровне типов.

Предлагаемый патч
 const runProjectBrowserCommand = (
   currentMenu: Exclude<
     BrowserMenuTag,
     | "Auth"
     | "ProjectAuth"
     | "Browser"
     | "Create"
     | "Databases"
     | "Select"
     | "Info"
     | "Ports"
     | "Prompts"
     | "Skills"
     | "Tasks"
   >,
   context: BrowserActionContext
 ) => {
+  if (currentMenu === "Quit") {
+    if (typeof globalThis.close === "function") {
+      globalThis.close()
+    }
+    context.setMessage("Quit requested. If the browser blocked window.close(), close the tab manually.")
+    return
+  }
+
   if (currentMenu === "Status") {
     runProjectOutputAction(context, loadProjectPs, "Loading docker compose ps", "docker compose ps loaded.")
     return
   }
   if (currentMenu === "Logs") {
     runProjectOutputAction(context, loadProjectLogs, "Loading logs", "Logs loaded.")
     return
   }
   if (currentMenu === "Down") {
     runDownProject(context)
     return
   }
   if (currentMenu === "DownAll") {
     runDownAllProjects(context)
     return
   }
   if (currentMenu === "Delete") {
     runDeleteProject(context)
     return
   }
-  globalThis.close()
-  context.setMessage("Quit requested. If the browser blocked window.close(), close the tab manually.")
+  const _exhaustive: never = currentMenu
+  context.setMessage(`Unhandled project menu action: ${_exhaustive}`)
 }
🤖 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/web/actions-projects.ts` around lines 465 - 504, The
runProjectBrowserCommand function currently hides the "Quit" branch in a
fallback path; add an explicit if-case for currentMenu === "Quit" that calls
globalThis.close() and context.setMessage(...) as before, then after all
branches add an exhaustiveness check like `const _exhaustive: never =
currentMenu` to force the compiler to catch new union members; update
runProjectBrowserCommand to remove the implicit fallback globalThis.close() and
rely on the explicit "Quit" branch plus the never-assignment to ensure
exhaustive checking of the BrowserMenuTag union.
packages/app/src/web/action-prompt.ts (1)

33-56: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Рекомендуется рефакторить на Match.exhaustive для согласованности.

Функция projectAuthTitle использует цепочку if-statements для маппинга ProjectAuthPromptAction на строки. Согласно coding guidelines, следует использовать Match.exhaustive для полного покрытия union-типов и единообразия с остальным кодом (см. projectAuthSuccessMessage в project-auth-flow.ts).

♻️ Предложенный рефакторинг
+import { Match } from "effect"
+
 const projectAuthTitle = (action: ProjectAuthPromptAction): string => {
-  if (action === "ProjectGithubConnect") {
-    return "Project GitHub connect"
-  }
-  if (action === "ProjectGithubDisconnect") {
-    return "Project GitHub disconnect"
-  }
-  if (action === "ProjectGitConnect") {
-    return "Project Git connect"
-  }
-  if (action === "ProjectGitDisconnect") {
-    return "Project Git disconnect"
-  }
-  if (action === "ProjectClaudeConnect") {
-    return "Project Claude connect"
-  }
-  if (action === "ProjectClaudeDisconnect") {
-    return "Project Claude disconnect"
-  }
-  if (action === "ProjectGeminiConnect") {
-    return "Project Gemini connect"
-  }
-  return "Project Gemini disconnect"
+  return Match.value(action).pipe(
+    Match.when("ProjectGithubConnect", () => "Project GitHub connect"),
+    Match.when("ProjectGithubDisconnect", () => "Project GitHub disconnect"),
+    Match.when("ProjectGitConnect", () => "Project Git connect"),
+    Match.when("ProjectGitDisconnect", () => "Project Git disconnect"),
+    Match.when("ProjectClaudeConnect", () => "Project Claude connect"),
+    Match.when("ProjectClaudeDisconnect", () => "Project Claude disconnect"),
+    Match.when("ProjectGeminiConnect", () => "Project Gemini connect"),
+    Match.when("ProjectGeminiDisconnect", () => "Project Gemini disconnect"),
+    Match.exhaustive
+  )
 }

As per coding guidelines, exhaustive pattern matching with Effect.Match should be used instead of switch statements or if-chains for union type analysis.

🤖 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/web/action-prompt.ts` around lines 33 - 56, Replace the
if-chain in projectAuthTitle so it uses Effect.Match.exhaustive over the
ProjectAuthPromptAction union (mirror the style used in
projectAuthSuccessMessage), mapping each variant ("ProjectGithubConnect",
"ProjectGithubDisconnect", "ProjectGitConnect", "ProjectGitDisconnect",
"ProjectClaudeConnect", "ProjectClaudeDisconnect", "ProjectGeminiConnect",
"ProjectGeminiDisconnect") to the corresponding title string; ensure the
exhaustive matcher covers every variant and returns the same strings as before
and import or reference Match.exhaustive if not already available.
packages/app/src/web/project-auth-flow.ts (1)

59-73: 🧹 Nitpick | 🔵 Trivial | 💤 Low value

Корректное использование Match.exhaustive для type-safe маппинга.

Функция правильно использует Match.exhaustive для полного покрытия всех вариантов ProjectAuthFlow. Однако отсутствует TSDoc с обязательными аннотациями (@pure, @complexity, @param, @returns).

📝 Предложение добавить TSDoc
+/**
+ * Generate success message for project auth flow action
+ * `@pure` true
+ * `@complexity` O(1) time, O(1) space
+ * `@param` flow - The project auth flow type
+ * `@param` label - The label associated with the auth action
+ * `@returns` Success message string
+ */
 export const projectAuthSuccessMessage = (
   flow: ProjectAuthFlow,
   label: string

As per coding guidelines, all exported functions must include comprehensive TSDoc with @pure marker, @complexity notation, and parameter documentation.

🤖 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/web/project-auth-flow.ts` around lines 59 - 73, Exported
function projectAuthSuccessMessage is missing the required TSDoc; add a JSDoc
block above the exported const that documents the function, marking it with
`@pure`, a `@complexity` annotation (e.g. O(1)), `@param` for flow (describe
ProjectAuthFlow) and `@param` for label (string), and an `@returns` describing the
returned success message string; keep the description concise and reference
projectAuthSuccessMessage and its use of Match.exhaustive to indicate full
pattern coverage.
packages/app/tests/docker-git/project-select.test.ts (1)

66-228: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Добавьте property-based тесты для инвариантов сортировки, фильтрации и окна просмотра.

Функции sortSelectItemsByLaunchTime, filterSelectItemsByQuery и buildSelectListWindow являются чистыми функциями CORE уровня с четко определёнными математическими инвариантами, но покрыты только фиксированными примерами. Согласно гайдлайнам, property-based тесты должны верифицировать эти инварианты на произвольных входах.

Требуются fc.property кейсы для:

  1. Сортировки: новые временные метки всегда первыми; тайбрейки по running → displayName → projectKey работают консистентно
  2. Фильтрации: результат всегда подмножество входа; пустой запрос сохраняет полный вход и порядок; каждый результат содержит все поисковые термины
  3. Окна: границы [0, total); выбранный элемент внутри окна когда возможно; размер ≤ maxVisible
Направление фикса
+import fc from "fast-check"
+
+it("property: launch-time sort preserves newest-first invariant", () => {
+  fc.assert(
+    fc.property(
+      fc.array(fc.record({ key: fc.string({ minLength: 1 }), name: fc.string() }), { minLength: 1, maxLength: 50 }),
+      fc.record({}, { maxKeys: 50 }),
+      (items, runtimesByKey) => {
+        const sorted = sortSelectItemsByLaunchTime(items, runtimesByKey, { displayName: (i) => i.name, projectKey: (i) => i.key })
+        // assert: sorted.length === items.length
+        // assert: newer timestamps come before older (including NEGATIVE_INFINITY last)
+        // assert: when timestamps equal, running projects come before stopped
+      }
+    )
+  )
+})
+
+it("property: filter result is always subset of input matching all query terms", () => {
+  fc.assert(
+    fc.property(
+      fc.array(fc.record({ key: fc.string({ minLength: 1 }), name: fc.string() }), { maxLength: 30 }),
+      fc.string({ maxLength: 20 }),
+      (items, query) => {
+        const filtered = filterSelectItemsByQuery(items, query, { displayName: (i) => i.name, projectKey: (i) => i.key, ... })
+        // assert: filtered is subset of items (every element in filtered is in items)
+        // assert: empty query => filtered.length === items.length
+        // assert: every query term appears in searchable fields of each result
+      }
+    )
+  )
+})
+
+it("property: select list window stays within bounds", () => {
+  fc.assert(
+    fc.property(fc.integer({ min: 0, max: 1000 }), fc.integer({ min: 0, max: 100 }), (total, maxVisible) => {
+      const selected = Math.floor(total * 0.5) // within bounds
+      const win = buildSelectListWindow(total, selected, maxVisible)
+      // assert: win.start >= 0 && win.end <= total
+      // assert: win.end - win.start <= maxVisible (or total if total < maxVisible)
+      // assert: selected in [win.start, win.end) when total > 0
+    })
+  )
+})
🤖 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/tests/docker-git/project-select.test.ts` around lines 66 - 228,
Add property-based tests using fast-check (fc.property) for the core pure
helpers: sortSelectItemsByLaunchTime, filterSelectItemsByQuery, and
buildSelectListWindow. For sortSelectItemsByLaunchTime assert that items with
larger startedAtEpochMs appear earlier, that running=true beats running=false,
and that ties fall back to displayName then projectKey ordering; for
filterSelectItemsByQuery assert the result is a subset of the input, an empty
query returns the input in the same order, and every returned item contains all
query terms; for buildSelectListWindow assert start/end are inside [0,total),
selected index lies inside the window when total>0, and window size ≤
maxVisible. Use randomized generators for item shapes and runtimes and add these
fc.property cases alongside the existing examples.
🤖 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/app/src/web/action-prompt.ts`:
- Around line 33-56: Replace the if-chain in projectAuthTitle so it uses
Effect.Match.exhaustive over the ProjectAuthPromptAction union (mirror the style
used in projectAuthSuccessMessage), mapping each variant
("ProjectGithubConnect", "ProjectGithubDisconnect", "ProjectGitConnect",
"ProjectGitDisconnect", "ProjectClaudeConnect", "ProjectClaudeDisconnect",
"ProjectGeminiConnect", "ProjectGeminiDisconnect") to the corresponding title
string; ensure the exhaustive matcher covers every variant and returns the same
strings as before and import or reference Match.exhaustive if not already
available.

In `@packages/app/src/web/actions-projects.ts`:
- Around line 465-504: The runProjectBrowserCommand function currently hides the
"Quit" branch in a fallback path; add an explicit if-case for currentMenu ===
"Quit" that calls globalThis.close() and context.setMessage(...) as before, then
after all branches add an exhaustiveness check like `const _exhaustive: never =
currentMenu` to force the compiler to catch new union members; update
runProjectBrowserCommand to remove the implicit fallback globalThis.close() and
rely on the explicit "Quit" branch plus the never-assignment to ensure
exhaustive checking of the BrowserMenuTag union.

In `@packages/app/src/web/project-auth-flow.ts`:
- Around line 59-73: Exported function projectAuthSuccessMessage is missing the
required TSDoc; add a JSDoc block above the exported const that documents the
function, marking it with `@pure`, a `@complexity` annotation (e.g. O(1)), `@param`
for flow (describe ProjectAuthFlow) and `@param` for label (string), and an
`@returns` describing the returned success message string; keep the description
concise and reference projectAuthSuccessMessage and its use of Match.exhaustive
to indicate full pattern coverage.

In `@packages/app/tests/docker-git/project-select.test.ts`:
- Around line 66-228: Add property-based tests using fast-check (fc.property)
for the core pure helpers: sortSelectItemsByLaunchTime,
filterSelectItemsByQuery, and buildSelectListWindow. For
sortSelectItemsByLaunchTime assert that items with larger startedAtEpochMs
appear earlier, that running=true beats running=false, and that ties fall back
to displayName then projectKey ordering; for filterSelectItemsByQuery assert the
result is a subset of the input, an empty query returns the input in the same
order, and every returned item contains all query terms; for
buildSelectListWindow assert start/end are inside [0,total), selected index lies
inside the window when total>0, and window size ≤ maxVisible. Use randomized
generators for item shapes and runtimes and add these fc.property cases
alongside the existing examples.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 7f03b1af-317c-45e6-b993-1e85bc7d751d

📥 Commits

Reviewing files that changed from the base of the PR and between 3ac4e49 and 8cc73bf.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (131)
  • README.md
  • packages/api/README.md
  • packages/api/src/http.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/api/src/ui.ts
  • packages/api/tests/ui.test.ts
  • packages/app/eslint.config.mts
  • packages/app/eslint/no-lib-imports.mjs
  • packages/app/package.json
  • packages/app/src/app/main.ts
  • packages/app/src/app/program.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/frontend-lib/core/menu.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/docker-git/gridland-bun.d.ts
  • packages/app/src/docker-git/menu-actions.ts
  • packages/app/src/docker-git/menu-api.ts
  • packages/app/src/docker-git/menu-auth-data.ts
  • packages/app/src/docker-git/menu-auth-effects.ts
  • packages/app/src/docker-git/menu-auth-helpers.ts
  • packages/app/src/docker-git/menu-auth-snapshot-builder.ts
  • packages/app/src/docker-git/menu-auth.ts
  • packages/app/src/docker-git/menu-create.ts
  • packages/app/src/docker-git/menu-errors.ts
  • packages/app/src/docker-git/menu-gridland-runtime.tsx
  • packages/app/src/docker-git/menu-input-handler.ts
  • packages/app/src/docker-git/menu-input-utils.ts
  • packages/app/src/docker-git/menu-input.ts
  • packages/app/src/docker-git/menu-labeled-env.ts
  • packages/app/src/docker-git/menu-menu.ts
  • packages/app/src/docker-git/menu-project-auth-claude.ts
  • packages/app/src/docker-git/menu-project-auth-data.ts
  • packages/app/src/docker-git/menu-project-auth-gemini.ts
  • packages/app/src/docker-git/menu-project-auth-helpers.ts
  • packages/app/src/docker-git/menu-project-auth.ts
  • packages/app/src/docker-git/menu-render-auth.ts
  • packages/app/src/docker-git/menu-render-common.ts
  • packages/app/src/docker-git/menu-render-layout.ts
  • packages/app/src/docker-git/menu-render-project-auth.ts
  • packages/app/src/docker-git/menu-render-select.ts
  • packages/app/src/docker-git/menu-render.ts
  • packages/app/src/docker-git/menu-select-actions.ts
  • packages/app/src/docker-git/menu-select-connect.ts
  • packages/app/src/docker-git/menu-select-load.ts
  • packages/app/src/docker-git/menu-select-runtime.ts
  • packages/app/src/docker-git/menu-select-view.ts
  • packages/app/src/docker-git/menu-select.ts
  • packages/app/src/docker-git/menu-shared.ts
  • packages/app/src/docker-git/menu-startup.ts
  • packages/app/src/docker-git/menu-state.ts
  • packages/app/src/docker-git/menu-types.ts
  • packages/app/src/docker-git/menu.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/lib/core/menu.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/ui/primitives-gridland.tsx
  • packages/app/src/web/action-prompt.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/web/buffer-input.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/app/main.test.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/tests/docker-git/menu-api.test.ts
  • packages/app/tests/docker-git/menu-input-handler.test.ts
  • packages/app/tests/docker-git/menu-select-actions.test.ts
  • packages/app/tests/docker-git/menu-select-connect.test.ts
  • packages/app/tests/docker-git/menu-shared.test.ts
  • packages/app/tests/docker-git/menu-startup.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tsconfig.build.json
  • packages/app/tsconfig.json
  • packages/app/vite.config.ts
  • packages/app/vite.docker-git.config.ts
  • packages/app/vite.web.config.ts
  • packages/lib/src/core/domain.ts
  • packages/lib/src/core/menu.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/lib/tests/core/menu.test.ts
  • packages/lib/vite.config.ts
  • scripts/e2e/issue-61-auth-labels.sh
💤 Files with no reviewable changes (59)
  • packages/app/src/docker-git/menu-render-project-auth.ts
  • packages/app/src/docker-git/menu-select-view.ts
  • packages/lib/tests/core/menu.test.ts
  • packages/app/src/docker-git/menu-render-auth.ts
  • packages/app/src/docker-git/frontend-lib/core/menu.ts
  • packages/app/src/docker-git/menu-menu.ts
  • packages/app/src/docker-git/menu-startup.ts
  • packages/app/src/docker-git/menu.ts
  • packages/app/vite.config.ts
  • packages/app/src/docker-git/menu-project-auth-gemini.ts
  • packages/app/src/docker-git/menu-auth-helpers.ts
  • packages/app/tests/app/main.test.ts
  • packages/app/src/docker-git/menu-render-layout.ts
  • packages/app/tests/docker-git/menu-api.test.ts
  • packages/app/src/app/main.ts
  • packages/app/vite.docker-git.config.ts
  • packages/app/src/app/program.ts
  • packages/app/src/docker-git/menu-auth-effects.ts
  • packages/app/src/docker-git/menu-input.ts
  • packages/app/src/docker-git/menu-select-actions.ts
  • packages/app/tests/docker-git/menu-shared.test.ts
  • packages/app/src/docker-git/menu-auth-snapshot-builder.ts
  • packages/app/src/docker-git/gridland-bun.d.ts
  • packages/app/src/docker-git/menu-gridland-runtime.tsx
  • packages/app/src/docker-git/menu-labeled-env.ts
  • packages/app/src/docker-git/menu-types.ts
  • packages/app/src/docker-git/menu-input-handler.ts
  • packages/app/src/docker-git/menu-auth.ts
  • packages/app/src/docker-git/menu-project-auth-helpers.ts
  • packages/app/src/docker-git/menu-select-runtime.ts
  • packages/api/tests/ui.test.ts
  • packages/app/src/docker-git/menu-render-select.ts
  • packages/app/tests/docker-git/menu-startup.test.ts
  • packages/lib/src/core/menu.ts
  • packages/lib/vite.config.ts
  • packages/app/tests/docker-git/menu-select-actions.test.ts
  • packages/app/src/docker-git/menu-select-load.ts
  • packages/app/src/lib/core/menu.ts
  • packages/app/tests/docker-git/menu-input-handler.test.ts
  • packages/app/src/ui/primitives-gridland.tsx
  • packages/app/src/docker-git/menu-render.ts
  • packages/app/src/docker-git/menu-input-utils.ts
  • packages/api/README.md
  • packages/api/src/ui.ts
  • packages/app/src/docker-git/menu-auth-data.ts
  • packages/app/src/docker-git/menu-api.ts
  • packages/app/src/docker-git/menu-project-auth.ts
  • packages/app/vite.web.config.ts
  • packages/app/src/docker-git/menu-project-auth-data.ts
  • packages/app/src/docker-git/menu-actions.ts
  • packages/app/src/docker-git/menu-select-connect.ts
  • packages/app/src/docker-git/menu-state.ts
  • packages/app/src/docker-git/menu-select.ts
  • packages/app/src/docker-git/menu-create.ts
  • packages/app/tests/docker-git/menu-select-connect.test.ts
  • packages/app/src/docker-git/menu-project-auth-claude.ts
  • packages/app/src/docker-git/menu-render-common.ts
  • packages/app/src/docker-git/menu-shared.ts
  • packages/app/src/docker-git/menu-errors.ts
📜 Review details
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/tsconfig.build.json
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/tsconfig.json
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/package.json
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/web/app-ready-shortcut-runtime.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/auth-flow.ts
  • packages/app/tsconfig.build.json
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • README.md
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-select-types.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/docker-git/api-client.ts
  • packages/app/eslint/no-lib-imports.mjs
  • packages/app/src/web/api.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/tsconfig.json
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/create-types.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/program.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/app/src/web/create-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/docker-git/cli/parser.ts
  • packages/api/src/http.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/package.json
  • packages/app/eslint.config.mts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/program.ts
  • packages/lib/src/core/domain.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/create-flow.test.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.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/create-flow.test.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
**/{package*.json,requirements*.txt,setup.py,setup.cfg,Pipfile,Pipfile.lock,pyproject.toml,pom.xml,build.gradle,Gemfile,Gemfile.lock,go.mod,go.sum,composer.json,Cargo.toml,Cargo.lock}

📄 CodeRabbit inference engine (Custom checks)

Fail if dependency or package-manager changes materially increase supply-chain risk without justification

Files:

  • packages/app/package.json
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Docker projects are organized in `~/.docker-git` directory by default
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Use `--force` flag when recreating environments and removing project volumes
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Use `--mcp-playwright` flag to enable Playwright MCP and Chromium sidecar for browser automation
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Use `--auto` flag for automatic agent selection based on available authorization; `--auto=claude` or `--auto=codex` for explicit agent selection
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Apply configuration using `docker-git apply` for single projects or `docker-git apply-all` for multiple projects, with `--no-up` to skip `docker compose up`
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Controller container GPU must be enabled separately via `DOCKER_GIT_CONTROLLER_GPU` environment variable, defaulting to `none`
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: When NVIDIA errors occur (nvidia-container-cli or libnvidia-ml.so.1), docker-git automatically rewrites managed files with `gpu: "none"` and retries `docker compose up`
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Web version is launched with `docker-git browser` and listens on all host interfaces (0.0.0.0) by default; restrict to localhost with `DOCKER_GIT_WEB_HOST=127.0.0.1`
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Application architecture: APP provides CLI and browser frontend; LIB contains core business logic; API is server-only and does not serve HTML frontend
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: Runtime design is host-Docker-backed with controller container using bind-mounted `/var/run/docker.sock`; no Docker-in-Docker isolation
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T18:24:10.193Z
Learning: User running host CLI must have permission to access host Docker socket; add user to `docker` group or use rootless Docker if permission denied errors occur
🔇 Additional comments (72)
packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts (1)

140-143: LGTM!

packages/app/src/lib/usecases/terminal-cursor.ts (1)

187-190: LGTM!

packages/app/src/web/menu.ts (1)

40-58: LGTM!

Also applies to: 60-63

packages/app/eslint/no-lib-imports.mjs (1)

16-21: LGTM!

packages/app/src/docker-git/api-client.ts (1)

109-122: LGTM!

packages/app/src/docker-git/api-auth-codec.ts (1)

2-2: ⚡ Quick win

Типы правильно перенесены в слой web.

Импорт типов AuthSnapshot и ProjectAuthSnapshot из ../web/api-types.ts корректен: оба типа экспортируются из целевого файла (строки 43–44 в web/api-types.ts), файл menu-types.js удалён, и в кодовой базе не остаётся других импортов из него. Изменение согласованно с целью PR по удалению легаси-фронтендов и консолидации типов в web-слой.

packages/app/src/docker-git/terminal-output.ts (1)

1-3: Изменение корректно и соответствует целям PR.

Дополнительных замечаний по этому сегменту нет.

packages/app/src/docker-git/terminal-session-client.ts (1)

7-7: Импорт обновлён корректно.

Дополнительных замечаний по этому сегменту нет.

packages/app/src/docker-git/open-project-ssh.ts (1)

14-14: Изменение корректное.

Дополнительных замечаний по этому сегменту нет.

packages/app/tests/docker-git/terminal-session-client.test.ts (1)

14-16: Обновление мока выполнено корректно.

Дополнительных замечаний по этому сегменту нет.

packages/app/src/lib/usecases/state-repo/git-commands.ts (1)

12-12: LGTM!

packages/app/src/web/app-ready-main-panels.tsx (1)

90-90: LGTM!

packages/lib/src/usecases/state-repo/git-commands.ts (1)

11-11: LGTM!

packages/lib/src/usecases/projects-down.ts (1)

14-14: LGTM!

packages/app/src/lib/usecases/projects-ssh.ts (1)

158-158: LGTM!

packages/app/src/lib/usecases/projects-delete.ts (1)

66-66: LGTM!

packages/app/src/lib/usecases/projects-down.ts (1)

15-15: LGTM!

packages/lib/src/usecases/projects-delete.ts (1)

65-65: LGTM!

packages/app/src/lib/usecases/auth-gemini.ts (1)

75-75: LGTM!

Also applies to: 78-78

packages/lib/src/usecases/projects-ssh.ts (1)

157-157: LGTM!

packages/app/tsconfig.build.json (1)

7-7: LGTM!

packages/app/tsconfig.json (1)

20-21: LGTM!

packages/api/src/services/auth-terminal-sessions.ts (1)

73-74: LGTM!

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

3-36: LGTM!

packages/lib/src/usecases/projects-list.ts (1)

68-69: LGTM!

Also applies to: 132-133

packages/app/src/web/panel-layout.tsx (1)

48-48: LGTM!

packages/api/src/http.ts (1)

764-799: LGTM!

README.md (1)

98-100: LGTM!

Also applies to: 102-103

packages/app/src/lib/usecases/projects-list.ts (1)

68-70: LGTM!

Also applies to: 133-134

packages/lib/src/usecases/auth-gemini.ts (1)

74-77: LGTM!

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

77-85: LGTM!

packages/app/package.json (1)

4-4: LGTM!

Also applies to: 17-17, 20-20

packages/app/src/docker-git/frontend-lib/core/domain.ts (1)

59-66: LGTM!

packages/app/src/lib/core/domain.ts (1)

59-66: LGTM!

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

54-56: LGTM!

Also applies to: 85-88

packages/app/tests/docker-git/parser-browser.test.ts (1)

4-4: LGTM!

Also applies to: 7-22

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

185-185: LGTM!

scripts/e2e/issue-61-auth-labels.sh (1)

96-97: LGTM!

Also applies to: 115-116, 128-129, 133-139, 151-163

packages/app/src/web/create-types.ts (1)

1-35: LGTM!

packages/app/tests/docker-git/actions-project-create.test.ts (1)

8-8: LGTM!

packages/app/src/web/create-flow.ts (1)

10-17: LGTM!

packages/app/src/web/app-ready-state.ts (1)

3-3: LGTM!

packages/app/tests/docker-git/app-ready-shortcuts.test.ts (1)

13-13: LGTM!

packages/app/src/web/panel-content.tsx (1)

4-4: LGTM!

packages/app/src/web/app-ready-shortcut-runtime.ts (1)

3-3: LGTM!

packages/app/src/web/app-ready-layout.tsx (1)

3-3: LGTM!

Also applies to: 143-143

packages/app/src/web/panel-create-select.tsx (1)

9-10: LGTM!

packages/app/tests/docker-git/create-flow.test.ts (1)

3-3: LGTM!

Also applies to: 38-38

packages/app/src/web/app-ready-create.ts (1)

4-4: LGTM!

Also applies to: 10-10

packages/app/src/web/actions-project-create.ts (1)

4-5: LGTM!

packages/app/tests/docker-git/app-ready-create.test.ts (1)

9-10: LGTM!

packages/app/eslint.config.mts (1)

284-284: LGTM!

Also applies to: 330-330

packages/lib/src/core/domain.ts (1)

58-64: LGTM!

packages/app/src/web/project-auth-flow.ts (2)

3-11: LGTM!


3-3: LGTM!

packages/app/src/web/auth-flow.ts (1)

3-12: LGTM!

Also applies to: 77-114

packages/app/src/web/panel-auth.tsx (1)

3-3: LGTM!

packages/app/src/web/action-prompt.ts (1)

1-2: LGTM!

packages/app/src/web/actions-auth.ts (1)

3-13: LGTM!

packages/app/src/web/github-auth-gate.ts (1)

1-1: LGTM!

packages/app/src/web/app-ready-actions.ts (2)

1-2: LGTM!


1-2: Старые menu-файлы успешно удалены из кодовой базы.

Проверка подтверждает, что файлы menu-auth-shared.ts и menu-project-auth-shared.ts удалены из packages/app/src/docker-git/, и нет оставшихся импортов из них. Новые локальные модули auth-flow.ts и project-auth-flow.ts существуют в packages/app/src/web/ и корректно используются. Миграция импортов завершена успешно.

packages/app/src/web/project-select-types.ts (1)

1-6: LGTM!

packages/app/src/web/project-select-presenter.ts (1)

3-3: LGTM!

packages/app/src/web/panel-project-details.tsx (1)

11-11: LGTM!

packages/app/src/web/panel-project-list.tsx (1)

3-3: LGTM!

packages/app/src/web/project-select-search.ts (1)

30-31: LGTM!

packages/app/src/web/project-search.ts (1)

1-1: LGTM!

Also applies to: 4-5

packages/app/src/web/project-select-order.ts (1)

1-1: LGTM!

Also applies to: 23-24, 28-28

packages/app/src/web/api.ts (1)

3-4: LGTM!

Also applies to: 84-85

packages/app/tests/docker-git/project-select.test.ts (1)

3-65: LGTM!

Also applies to: 89-89, 162-162

packages/app/src/web/panel-project-auth.tsx (1)

3-3: LGTM!

@rikohomeless rikohomeless marked this pull request as ready for review May 14, 2026 18:42
@rikohomeless
Copy link
Copy Markdown
Contributor Author

rikohomeless commented May 14, 2026

AI Session Backup

Commit: 728b5c9
Status: success
Files: 16 (8.64 MB)
Links: README | Manifest

git status

On branch issue-298
Your branch is up to date with 'fork/issue-298'.

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.

Actionable comments posted: 6

Caution

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

⚠️ Outside diff range comments (3)
packages/app/src/docker-git/api-client.ts (1)

109-122: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Добавьте тесты для инварианта "no per-project API fan-out" в listProjectDetails.

Функция имеет явный инвариант: "no per-project API fan-out is required for project selection" (O(n), не O(n²)). Связанный тест был удалён вместе с legacy TUI, но новое тестовое покрытие для этого инварианта не добавлено. В текущем наборе тестов нет ни одного теста, использующего listProjectDetails или проверяющего, что дополнительных вызовов getProject после получения списка не происходит.

🤖 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/api-client.ts` around lines 109 - 122, Add tests
that assert listProjectDetails does not trigger per-project follow-up calls:
mock/stub the underlying HTTP client used by request and also spy on any
getProject/getProjectById function, then call listProjectDetails and verify only
a single request("GET", "/projects") (and no calls to getProject / GET
/projects/:id) occurred; ensure the test exercises decodeProjectsResponse path
by returning a realistic projects payload and asserting the decoded
ApiProjectDetails result is returned, so the invariant "no per-project API
fan-out" is enforced.
packages/app/tests/docker-git/project-select.test.ts (1)

66-227: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Добавьте property-based тесты для инвариантов сортировки и фильтрации.

В тестах используются только фиксированные примеры. Согласно guidelines **/*.test.{ts,tsx}, требуется property-based тестирование для проверки математических инвариантов. Для функций вроде sortProjectItemsByLaunchTime, sortSelectItemsByLaunchTime и filterProjectItemsByQuery необходимо верифицировать:

  • неубывающий порядок времени запуска (newest-first);
  • детерминированный tie-break при одинаковом времени;
  • корректность фильтрации по токенам.

Используйте fast-check для генерации случайных проектов с разными комбинациями стартовых времён, статусов и параметров поиска. Это предотвратит регрессии на граничных и редких случаях.

Ориентир: свойство должно проверять, что для любого массива проектов с runtime информацией значения startedAtEpochMs в отсортированном массиве неубывают (т.е. prev >= curr).

🤖 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/tests/docker-git/project-select.test.ts` around lines 66 - 227,
Add property-based tests (using fast-check) covering
sortProjectItemsByLaunchTime, sortSelectItemsByLaunchTime and
filterProjectItemsByQuery: generate arrays of project items and corresponding
runtime records with randomized startedAtEpochMs, running flags,
names/containerName/keys and query tokens; assert that sorted results follow
newest-first ordering (startedAtEpochMs is non-increasing across the output,
i.e. prev >= curr), that tie-breaking is deterministic (re-running with same
input yields identical order and that items with equal startedAtEpochMs respect
the existing comparator tie rules), and that
filterProjectItemsByQuery/filterProjectSummariesByQuery accept tokenized queries
and return only items matching all tokens; place tests alongside the existing
examples so they exercise the same helper functions
(sortProjectItemsByLaunchTime, sortSelectItemsByLaunchTime,
filterProjectItemsByQuery, filterProjectSummariesByQuery) and fail on
counterexamples to prevent regressions.
packages/api/src/services/auth-terminal-sessions.ts (1)

69-75: ⚠️ Potential issue | 🟠 Major | ⚖️ Poor tradeoff

Нарушение контракта TerminalSession: поле sshCommand содержит несовместимые форматы для разных типов сессий.

Поле sshCommand теперь используется для двух разных целей: для обычных проектных сессий содержит реальную SSH-команду ("ssh -p 2222 dev@localhost"), а для auth-сессий — человекочитаемую метку ("Claude Code OAuth [label]"). Обе сессии хранятся в одном массиве terminalSessions через одноимённый тип TerminalSession, но без различия в типе.

Это нарушает типовую безопасность: если код будет итерировать terminalSessions и ожидать, что sshCommand всегда в формате SSH-команды (для парсинга хоста/порта), он молча сломается для auth-сессий. Название поля вводит в заблуждение — оно больше не гарантирует наличие исполняемой команды.

Необходимо либо:

  1. Разделить типы (например, type ProjectTerminalSession vs type AuthTerminalSession)
  2. Переименовать поле в auth-контексте на более точное (sessionLabel, displayName)
  3. Добавить тип-дискриминатор для различия формата в TerminalSession
  4. Добавить документацию о семантике поля в зависимости от типа сессии
🤖 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/api/src/services/auth-terminal-sessions.ts` around lines 69 - 75,
The terminal session code mixes display labels and real SSH commands in the same
field — update the model to a discriminated union and stop writing human labels
into sshCommand: introduce two types (e.g., AuthTerminalSession with kind:
"auth" and field sessionLabel/displayName, and ProjectTerminalSession with kind:
"project" and field sshCommand) and update resolveCommandLabel (and any code
that currently writes the label into sshCommand) to populate sessionLabel for
AuthTerminalSession; ensure terminalSessions is typed as (AuthTerminalSession |
ProjectTerminalSession)[] so callers can narrow by the kind discriminator before
parsing sshCommand.
🤖 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/docker-git/api-auth-codec.ts`:
- Line 2: The AuthSnapshot and ProjectAuthSnapshot types are shared API
contracts and should be moved out of web/api-types.js into a neutral module
(create packages/app/src/shared/api-types.ts exporting AuthSnapshot and
ProjectAuthSnapshot), then update the import in docker-git/api-auth-codec.ts to
import those types from the new shared module and update any web imports to
reference shared/api-types.ts as well; keep web/ only for UI-specific types
(components/state) and ensure all references to AuthSnapshot and
ProjectAuthSnapshot (the type names) are updated to the new import path.
- Line 2: The Docker-CLI module currently imports AuthSnapshot and
ProjectAuthSnapshot from the web layer (api-auth-codec.ts imports from
../web/api-types.js); move these DTO/type definitions into a neutral shared
module (e.g., create src/shared/api-types.ts), export AuthSnapshot and
ProjectAuthSnapshot from there, then update the import in
packages/app/src/docker-git/api-auth-codec.ts to import the types from the new
shared module instead of ../web/api-types.js; also update other modules
(including packages/app/src/web/api-types.ts) to re-export or import these types
from the shared location to remove the CLI → web dependency.

In `@packages/app/src/docker-git/terminal-output.ts`:
- Around line 1-3: The writeToTerminal function performs direct IO and should
return an Effect to match the other terminal helpers; change
writeToTerminal(text: string): void to return an Effect by wrapping the body in
Effect.sync(...) (e.g., returning an Effect.UIO<void>), add the necessary import
for Effect, and update callers to use the returned Effect (consistent with
writeProjectEventLines, setExitCode, persistControllerRevision); keep the
exported name writeToTerminal and preserve the behavior of writing to
process.stdout.

In `@packages/app/src/web/create-types.ts`:
- Line 1: Файл create-types.ts импортирует тип GpuMode из legacy-пути
../docker-git/frontend-lib, что создаёт ненужную зависимость от устаревшей
ветки; вынесите определение типа GpuMode в новый/существующий модуль web/shared
(например web/shared/types или аналог) и замените импорт в create-types.ts на
импорт из этого web/shared-модуля; обновите все места, которые используют
GpuMode (символ GpuMode в create-types.ts и любые связанные импорты) чтобы
больше не ссылаться на ../docker-git/frontend-lib и удалить legacy-зависимость.

In `@packages/lib/src/usecases/state-repo/git-commands.ts`:
- Line 11: Replace the mismatched terminology in the inline comment that
currently reads "Avoid blocking on interactive credential prompts in CI/API
contexts." so it matches the rest of the PR terminology ("CLI/API callers");
update that comment to use "CLI/API callers" (and scan other nearby comments in
this file for the same phrasing) to ensure consistent wording with the usage in
projects-down.ts where "CLI/API callers" is used.

---

Outside diff comments:
In `@packages/api/src/services/auth-terminal-sessions.ts`:
- Around line 69-75: The terminal session code mixes display labels and real SSH
commands in the same field — update the model to a discriminated union and stop
writing human labels into sshCommand: introduce two types (e.g.,
AuthTerminalSession with kind: "auth" and field sessionLabel/displayName, and
ProjectTerminalSession with kind: "project" and field sshCommand) and update
resolveCommandLabel (and any code that currently writes the label into
sshCommand) to populate sessionLabel for AuthTerminalSession; ensure
terminalSessions is typed as (AuthTerminalSession | ProjectTerminalSession)[] so
callers can narrow by the kind discriminator before parsing sshCommand.

In `@packages/app/src/docker-git/api-client.ts`:
- Around line 109-122: Add tests that assert listProjectDetails does not trigger
per-project follow-up calls: mock/stub the underlying HTTP client used by
request and also spy on any getProject/getProjectById function, then call
listProjectDetails and verify only a single request("GET", "/projects") (and no
calls to getProject / GET /projects/:id) occurred; ensure the test exercises
decodeProjectsResponse path by returning a realistic projects payload and
asserting the decoded ApiProjectDetails result is returned, so the invariant "no
per-project API fan-out" is enforced.

In `@packages/app/tests/docker-git/project-select.test.ts`:
- Around line 66-227: Add property-based tests (using fast-check) covering
sortProjectItemsByLaunchTime, sortSelectItemsByLaunchTime and
filterProjectItemsByQuery: generate arrays of project items and corresponding
runtime records with randomized startedAtEpochMs, running flags,
names/containerName/keys and query tokens; assert that sorted results follow
newest-first ordering (startedAtEpochMs is non-increasing across the output,
i.e. prev >= curr), that tie-breaking is deterministic (re-running with same
input yields identical order and that items with equal startedAtEpochMs respect
the existing comparator tie rules), and that
filterProjectItemsByQuery/filterProjectSummariesByQuery accept tokenized queries
and return only items matching all tokens; place tests alongside the existing
examples so they exercise the same helper functions
(sortProjectItemsByLaunchTime, sortSelectItemsByLaunchTime,
filterProjectItemsByQuery, filterProjectSummariesByQuery) and fail on
counterexamples to prevent regressions.
🪄 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: f8652b36-c33a-496b-8d24-f1ac47f9470e

📥 Commits

Reviewing files that changed from the base of the PR and between 8cc73bf and 728b5c9.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (131)
  • README.md
  • packages/api/README.md
  • packages/api/src/http.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/api/src/ui.ts
  • packages/api/tests/ui.test.ts
  • packages/app/eslint.config.mts
  • packages/app/eslint/no-lib-imports.mjs
  • packages/app/package.json
  • packages/app/src/app/main.ts
  • packages/app/src/app/program.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/docker-git/frontend-lib/core/menu.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/app/src/docker-git/gridland-bun.d.ts
  • packages/app/src/docker-git/menu-actions.ts
  • packages/app/src/docker-git/menu-api.ts
  • packages/app/src/docker-git/menu-auth-data.ts
  • packages/app/src/docker-git/menu-auth-effects.ts
  • packages/app/src/docker-git/menu-auth-helpers.ts
  • packages/app/src/docker-git/menu-auth-snapshot-builder.ts
  • packages/app/src/docker-git/menu-auth.ts
  • packages/app/src/docker-git/menu-create.ts
  • packages/app/src/docker-git/menu-errors.ts
  • packages/app/src/docker-git/menu-gridland-runtime.tsx
  • packages/app/src/docker-git/menu-input-handler.ts
  • packages/app/src/docker-git/menu-input-utils.ts
  • packages/app/src/docker-git/menu-input.ts
  • packages/app/src/docker-git/menu-labeled-env.ts
  • packages/app/src/docker-git/menu-menu.ts
  • packages/app/src/docker-git/menu-project-auth-claude.ts
  • packages/app/src/docker-git/menu-project-auth-data.ts
  • packages/app/src/docker-git/menu-project-auth-gemini.ts
  • packages/app/src/docker-git/menu-project-auth-helpers.ts
  • packages/app/src/docker-git/menu-project-auth.ts
  • packages/app/src/docker-git/menu-render-auth.ts
  • packages/app/src/docker-git/menu-render-common.ts
  • packages/app/src/docker-git/menu-render-layout.ts
  • packages/app/src/docker-git/menu-render-project-auth.ts
  • packages/app/src/docker-git/menu-render-select.ts
  • packages/app/src/docker-git/menu-render.ts
  • packages/app/src/docker-git/menu-select-actions.ts
  • packages/app/src/docker-git/menu-select-connect.ts
  • packages/app/src/docker-git/menu-select-load.ts
  • packages/app/src/docker-git/menu-select-runtime.ts
  • packages/app/src/docker-git/menu-select-view.ts
  • packages/app/src/docker-git/menu-select.ts
  • packages/app/src/docker-git/menu-shared.ts
  • packages/app/src/docker-git/menu-startup.ts
  • packages/app/src/docker-git/menu-state.ts
  • packages/app/src/docker-git/menu-types.ts
  • packages/app/src/docker-git/menu.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/lib/core/menu.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/app/src/ui/primitives-gridland.tsx
  • packages/app/src/web/action-prompt.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/actions-projects.ts
  • packages/app/src/web/api.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/web/buffer-input.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/panel-content.tsx
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/web/panel-project-auth.tsx
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/web/project-select-order.ts
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/app/main.test.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/tests/docker-git/menu-api.test.ts
  • packages/app/tests/docker-git/menu-input-handler.test.ts
  • packages/app/tests/docker-git/menu-select-actions.test.ts
  • packages/app/tests/docker-git/menu-select-connect.test.ts
  • packages/app/tests/docker-git/menu-shared.test.ts
  • packages/app/tests/docker-git/menu-startup.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tsconfig.build.json
  • packages/app/tsconfig.json
  • packages/app/vite.config.ts
  • packages/app/vite.docker-git.config.ts
  • packages/app/vite.web.config.ts
  • packages/lib/src/core/domain.ts
  • packages/lib/src/core/menu.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-delete.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/lib/tests/core/menu.test.ts
  • packages/lib/vite.config.ts
  • scripts/e2e/issue-61-auth-labels.sh
💤 Files with no reviewable changes (59)
  • packages/app/tests/docker-git/menu-input-handler.test.ts
  • packages/app/src/docker-git/menu-select-view.ts
  • packages/app/src/docker-git/menu-auth-snapshot-builder.ts
  • packages/app/tests/app/main.test.ts
  • packages/app/src/docker-git/menu-input.ts
  • packages/app/src/app/program.ts
  • packages/app/src/docker-git/menu-startup.ts
  • packages/app/src/docker-git/menu-actions.ts
  • packages/app/src/docker-git/menu-render-common.ts
  • packages/app/tests/docker-git/menu-shared.test.ts
  • packages/lib/tests/core/menu.test.ts
  • packages/lib/vite.config.ts
  • packages/app/src/docker-git/menu-auth-effects.ts
  • packages/app/src/docker-git/menu-input-utils.ts
  • packages/app/tests/docker-git/menu-select-actions.test.ts
  • packages/app/src/docker-git/menu-project-auth-gemini.ts
  • packages/app/src/docker-git/menu-auth-data.ts
  • packages/app/src/docker-git/menu-render-auth.ts
  • packages/app/src/docker-git/menu-errors.ts
  • packages/app/tests/docker-git/menu-select-connect.test.ts
  • packages/app/src/docker-git/menu-select-connect.ts
  • packages/app/vite.web.config.ts
  • packages/app/src/docker-git/gridland-bun.d.ts
  • packages/api/tests/ui.test.ts
  • packages/app/src/docker-git/menu.ts
  • packages/app/src/docker-git/menu-project-auth-data.ts
  • packages/app/src/lib/core/menu.ts
  • packages/app/tests/docker-git/menu-startup.test.ts
  • packages/api/README.md
  • packages/app/src/docker-git/menu-menu.ts
  • packages/app/src/docker-git/menu-types.ts
  • packages/app/src/docker-git/menu-labeled-env.ts
  • packages/app/src/docker-git/frontend-lib/core/menu.ts
  • packages/app/src/docker-git/menu-project-auth-claude.ts
  • packages/app/src/docker-git/menu-auth.ts
  • packages/app/src/docker-git/menu-project-auth.ts
  • packages/app/src/app/main.ts
  • packages/app/src/docker-git/menu-shared.ts
  • packages/app/tests/docker-git/menu-api.test.ts
  • packages/app/src/ui/primitives-gridland.tsx
  • packages/app/src/docker-git/menu-render.ts
  • packages/api/src/ui.ts
  • packages/app/src/docker-git/menu-render-project-auth.ts
  • packages/app/vite.docker-git.config.ts
  • packages/app/src/docker-git/menu-api.ts
  • packages/app/src/docker-git/menu-auth-helpers.ts
  • packages/app/src/docker-git/menu-project-auth-helpers.ts
  • packages/app/src/docker-git/menu-select-load.ts
  • packages/app/src/docker-git/menu-select-runtime.ts
  • packages/app/src/docker-git/menu-render-layout.ts
  • packages/app/src/docker-git/menu-create.ts
  • packages/app/src/docker-git/menu-gridland-runtime.tsx
  • packages/app/src/docker-git/menu-state.ts
  • packages/lib/src/core/menu.ts
  • packages/app/src/docker-git/menu-select.ts
  • packages/app/src/docker-git/menu-render-select.ts
  • packages/app/vite.config.ts
  • packages/app/src/docker-git/menu-select-actions.ts
  • packages/app/src/docker-git/menu-input-handler.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). (5)
  • GitHub Check: E2E (Login context)
  • GitHub Check: E2E (OpenCode)
  • GitHub Check: E2E (Clone auto-open SSH)
  • GitHub Check: E2E (Clone cache)
  • GitHub Check: E2E (Runtime volumes + SSH)
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tsconfig.json
  • packages/app/tsconfig.build.json
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/app/package.json
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.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/web/panel-project-auth.tsx
  • packages/lib/src/usecases/projects-delete.ts
  • packages/app/src/web/app-ready-shortcut-runtime.ts
  • packages/app/src/lib/usecases/state-repo/git-commands.ts
  • packages/app/src/lib/usecases/projects-down.ts
  • packages/app/src/lib/usecases/auth-gemini.ts
  • packages/app/src/web/panel-auth.tsx
  • packages/app/src/web/project-auth-flow.ts
  • packages/app/src/docker-git/api-auth-codec.ts
  • packages/app/src/web/actions-project-create.ts
  • packages/app/src/web/project-select-types.ts
  • packages/app/tests/docker-git/actions-project-create.test.ts
  • packages/lib/src/usecases/projects-list.ts
  • packages/app/src/web/github-auth-gate.ts
  • packages/app/src/web/panel-content.tsx
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/src/lib/usecases/projects-delete.ts
  • packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts
  • packages/lib/src/usecases/state-repo/git-commands.ts
  • packages/app/src/docker-git/terminal-output.ts
  • packages/app/src/web/panel-layout.tsx
  • packages/app/src/docker-git/terminal-session-client.ts
  • packages/app/src/lib/usecases/projects-ssh.ts
  • packages/app/src/web/app-ready-state.ts
  • packages/app/src/web/app-ready-create.ts
  • packages/lib/src/usecases/projects-down.ts
  • packages/app/src/web/app-ready-actions.ts
  • packages/app/src/web/app-ready-main-panels.tsx
  • packages/app/src/web/panel-project-list.tsx
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/eslint/no-lib-imports.mjs
  • packages/lib/src/usecases/auth-gemini.ts
  • packages/lib/src/usecases/projects-ssh.ts
  • packages/app/src/lib/usecases/projects-list.ts
  • packages/app/src/web/panel-project-details.tsx
  • packages/app/src/web/project-select-presenter.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/src/lib/usecases/terminal-cursor.ts
  • packages/api/src/services/auth-terminal-sessions.ts
  • packages/app/src/web/action-prompt.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tsconfig.json
  • packages/app/tsconfig.build.json
  • packages/app/src/web/create-flow.ts
  • packages/app/src/docker-git/open-project-ssh.ts
  • packages/app/src/web/project-search.ts
  • packages/app/eslint.config.mts
  • packages/app/src/docker-git/program.ts
  • packages/app/src/docker-git/cli/parser.ts
  • packages/app/src/web/menu.ts
  • packages/app/src/web/auth-flow.ts
  • scripts/e2e/issue-61-auth-labels.sh
  • packages/app/src/web/create-types.ts
  • packages/app/src/web/panel-create-select.tsx
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/api/src/http.ts
  • packages/app/src/web/api.ts
  • packages/app/src/docker-git/cli/usage.ts
  • packages/app/src/docker-git/api-client.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/src/web/project-select-search.ts
  • packages/app/src/web/actions-auth.ts
  • packages/app/src/web/app-ready-layout.tsx
  • packages/app/src/web/project-select-order.ts
  • packages/app/package.json
  • packages/lib/src/core/domain.ts
  • packages/app/tests/docker-git/project-select.test.ts
  • packages/app/src/docker-git/frontend-lib/core/domain.ts
  • packages/app/src/lib/core/domain.ts
  • packages/app/src/web/actions-projects.ts
  • README.md
**/*.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/actions-project-create.test.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.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/actions-project-create.test.ts
  • packages/app/tests/docker-git/create-flow.test.ts
  • packages/app/tests/docker-git/terminal-session-client.test.ts
  • packages/app/tests/docker-git/parser-browser.test.ts
  • packages/app/tests/docker-git/app-ready-shortcuts.test.ts
  • packages/app/tests/docker-git/app-ready-create.test.ts
  • packages/app/tests/docker-git/program.test.ts
  • packages/app/tests/docker-git/project-select.test.ts
**/{package*.json,requirements*.txt,setup.py,setup.cfg,Pipfile,Pipfile.lock,pyproject.toml,pom.xml,build.gradle,Gemfile,Gemfile.lock,go.mod,go.sum,composer.json,Cargo.toml,Cargo.lock}

📄 CodeRabbit inference engine (Custom checks)

Fail if dependency or package-manager changes materially increase supply-chain risk without justification

Files:

  • packages/app/package.json
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Use `DOCKER_GIT_CONTROLLER_GPU=all` environment variable to enable GPU for the controller container separately
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Override controller container resource limits using `--controller-cpu`, `--controller-ram`, and `--controller-pids` global CLI flags or corresponding environment variables
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Use `DOCKER_GIT_API_URL` environment variable to point the CLI at an existing controller when the controller container is not running locally
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Use `DOCKER_GIT_WEB_HOST=127.0.0.1` environment variable to restrict web interface access to localhost only, instead of listening on all interfaces (0.0.0.0)
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Ensure the user running `docker-git` CLI has proper Docker socket permissions: membership in the `docker` group, rootless Docker setup, or correct socket ownership (`root:docker`, mode `660`)
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Verify the host Docker daemon is reachable by running `docker info` before attempting to use `docker-git`
Learnt from: CR
Repo: ProverCoderAI/docker-git

Timestamp: 2026-05-14T19:19:26.325Z
Learning: Ensure the controller container (`docker-git-api`) is running before using `docker-git` CLI, or provide an alternative `DOCKER_GIT_API_URL` endpoint
🔇 Additional comments (67)
packages/app/src/lib/usecases/state-repo/git-commands.ts (1)

12-12: LGTM!

packages/app/src/docker-git/frontend-lib/shell/terminal-cursor.ts (1)

140-143: LGTM!

packages/app/src/lib/usecases/terminal-cursor.ts (1)

187-190: LGTM!

packages/app/src/docker-git/frontend-lib/core/domain.ts (1)

74-80: LGTM!

packages/app/src/docker-git/open-project-ssh.ts (1)

14-14: LGTM!

packages/app/src/docker-git/terminal-session-client.ts (1)

7-7: LGTM!

packages/app/tests/docker-git/terminal-session-client.test.ts (1)

14-16: LGTM!

packages/app/src/web/project-select-types.ts (1)

1-6: LGTM!

packages/app/src/web/project-select-presenter.ts (1)

3-3: LGTM!

packages/app/src/web/panel-project-details.tsx (1)

11-11: LGTM!

packages/app/src/web/panel-project-list.tsx (1)

3-3: LGTM!

packages/app/src/web/project-select-search.ts (1)

30-31: LGTM!

packages/app/src/web/project-search.ts (1)

1-1: LGTM!

Also applies to: 4-5

packages/app/src/web/project-select-order.ts (1)

1-1: LGTM!

Also applies to: 23-24, 28-28

packages/app/src/web/api.ts (1)

3-4: LGTM!

Also applies to: 84-85

packages/app/tests/docker-git/project-select.test.ts (1)

3-10: LGTM!

Also applies to: 44-51, 53-65, 89-90, 162-176

packages/app/src/web/app-ready-main-panels.tsx (1)

90-90: LGTM!

packages/app/src/lib/usecases/projects-ssh.ts (1)

158-158: LGTM!

packages/lib/src/usecases/projects-down.ts (1)

14-14: LGTM!

packages/app/src/lib/usecases/projects-down.ts (1)

15-15: LGTM!

packages/lib/src/usecases/projects-ssh.ts (1)

157-157: LGTM!

packages/app/tsconfig.build.json (1)

7-7: ⚡ Quick win

Обновление списка исключений в tsconfig.build.json соответствует архитектуре — новые конфигурации vite.docker-git.config.ts и vite.web.config.ts присутствуют в репозитории, старый vite.config.ts удалён, и скрипты в package.json корректно ссылаются на разделённые конфигурации для CLI и веб-интерфейса.

packages/app/tests/docker-git/app-ready-shortcuts.test.ts (1)

13-13: ⚡ Quick win

Модуль успешно перемещён с правильным экспортом.

Модуль packages/app/src/web/create-flow.ts существует и экспортирует функцию createInitialFlowView с совместимой сигнатурой (buffer = ""): CreateFlowView. Импорт в тестовом файле корректен, функция используется правильно. Старый модуль удалён.

packages/app/tsconfig.json (1)

20-20: LGTM!

packages/app/src/lib/usecases/projects-delete.ts (1)

66-66: LGTM!

packages/lib/src/usecases/projects-delete.ts (1)

65-65: LGTM!

packages/lib/src/usecases/projects-list.ts (1)

68-68: LGTM!

Also applies to: 132-132

packages/app/src/web/panel-layout.tsx (1)

48-48: LGTM!

README.md (1)

98-104: LGTM!

packages/app/eslint.config.mts (1)

284-284: ESLint-конфиг корректно отражает миграцию с TUI на web.

Удалённые файлы src/docker-git/menu-create-shared.ts и src/docker-git/menu-render.ts полностью убраны из кодовой базы без оставшихся импортов. Новый файл src/web/create-flow.ts правильно добавлен в оверрайды правил для сохранения смягчённых лимитов линий и сложности.

packages/api/src/http.ts (1)

798-955: ⚡ Quick win

Композиция router и доступность маршрутов подтверждены корректными.

Все 18 auth-эндпойнтов (/auth/github/status, /auth/github/login, /auth/github/login/stream, /auth/github/logout, /auth/gitlab/status, /auth/gitlab/login, /auth/gitlab/login/stream, /auth/gitlab/logout, /auth/menu (GET+POST), /auth/terminal-sessions (POST+GET/:sessionId+DELETE/:sessionId+GET/:sessionId/ws), /auth/codex/status, /auth/codex/login, /auth/codex/import, /auth/codex/logout) присутствуют в блоке withAuth = withCoreRoutes.pipe(...) и правильно композированы. Core routes (/health, /skiller/open и проектные варианты) остаются доступными через chain .pipe(). Единообразная обработка ошибок: все маршруты используют Effect.catchAll(errorResponse). Композиция структурирована корректно: withCoreRoutes → withAuth → base.

packages/app/eslint/no-lib-imports.mjs (1)

16-21: LGTM!

packages/app/src/lib/usecases/projects-list.ts (1)

68-70: LGTM!

Also applies to: 133-134

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

3-37: LGTM!

packages/app/src/web/actions-projects.ts (1)

462-504: LGTM!

packages/app/src/web/auth-flow.ts (1)

3-13: LGTM!

packages/app/src/web/panel-auth.tsx (1)

3-3: LGTM!

packages/app/src/web/github-auth-gate.ts (1)

1-1: LGTM!

packages/app/src/web/menu.ts (1)

40-63: LGTM!

packages/app/src/web/project-auth-flow.ts (1)

3-11: LGTM!

packages/app/src/web/panel-project-auth.tsx (1)

3-3: LGTM!

packages/app/src/web/actions-auth.ts (1)

8-13: LGTM!

packages/app/src/web/action-prompt.ts (1)

1-2: LGTM!

packages/app/src/web/app-ready-actions.ts (1)

1-2: LGTM!

packages/app/package.json (1)

4-4: LGTM!

Also applies to: 17-17, 20-20

scripts/e2e/issue-61-auth-labels.sh (1)

96-97: LGTM!

Also applies to: 115-116, 128-139, 151-163

packages/app/src/web/create-types.ts (1)

3-35: LGTM!

packages/app/tests/docker-git/actions-project-create.test.ts (1)

8-8: Перенос type-only импорта на src/web/create-types.js выглядит корректно и согласован с целью PR по удалению legacy frontend связей.

packages/app/src/web/create-flow.ts (1)

10-17: Рефакторинг импортов выглядит консистентным: web-flow использует актуальные источники типов/парсеров, а CreateInputs/CreateStep подтягиваются из нового create-types.

packages/app/src/web/app-ready-state.ts (1)

3-3: Импорт CreateFlowView из ./create-flow.js корректный и поддерживает единый источник create-flow в web-слое.

packages/app/src/web/app-ready-shortcut-runtime.ts (1)

3-3: Перенаправление type-импорта на web create-flow выполнено корректно; по изменённому участку рисков не вижу.

packages/app/src/web/app-ready-layout.tsx (1)

3-3: Изменения выглядят уместно: источник типа унифицирован, а текст в header теперь явно отражает browser-only позиционирование.

Also applies to: 143-143

packages/app/src/web/panel-content.tsx (1)

4-4: Type-only импорт обновлён корректно, соответствует общей миграции create-flow в src/web.

packages/app/src/web/panel-create-select.tsx (1)

9-10: Импорты в CreatePanel унифицированы с новым web-источником create-flow/create-types; изменений поведения в этом сегменте не видно.

packages/app/tests/docker-git/create-flow.test.ts (1)

3-3: Обновление теста на web-реализацию create-flow и переименование describe выполнены последовательно, с корректной привязкой к новой архитектуре.

Also applies to: 38-38

packages/app/tests/docker-git/app-ready-create.test.ts (1)

9-10: LGTM!

packages/app/src/web/actions-project-create.ts (1)

4-5: LGTM!

packages/app/src/web/app-ready-create.ts (1)

4-4: LGTM!

Also applies to: 10-10

packages/lib/src/core/domain.ts (1)

73-80: LGTM!

packages/app/src/lib/core/domain.ts (1)

74-80: LGTM!

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

55-55: LGTM!

Also applies to: 87-87

packages/app/tests/docker-git/parser-browser.test.ts (1)

4-4: LGTM!

Also applies to: 7-7, 12-22

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

185-185: LGTM!

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

77-84: LGTM!

packages/lib/src/usecases/auth-gemini.ts (2)

74-74: Те же замечания по проверке browser UI путей, что и в packages/app версии.

После устранения дублировки кода, убедитесь, что ссылки на "docker-git browser -> Auth profiles -> Gemini CLI" существуют в браузерном интерфейсе.

Also applies to: 77-77


1-120: ⚡ Quick win

Переосмыслить назначение packages/app/src/lib: это локальная копия, а не импорт из packages/lib.

auth-gemini.ts действительно дублируется в двух местах (packages/app/src/lib и packages/lib/src/usecases), но это НЕ проблема синхронизации между зависимостями:

  • packages/lib помечен как private: true и не используется в качестве зависимости packages/app
  • packages/app/src/lib — это локальная копия кода, а не импорт из packages/lib (path alias @lib./src/lib/index.ts)
  • Дублированные файлы (auth-gemini-helpers.ts, auth-gemini-oauth.ts и др.) присутствуют в обеих директориях

Вопрос архитектуры: зачем в packages/app поддерживается отдельная копия business logic, если она существует в packages/lib? Нужна ясность:

  • Что переиспользует packages/app/src/lib и почему это не импортируется из packages/lib?
  • Является ли packages/lib устаревшей, или она предназначена для другого назначения (API server)?

Маркеры jscpd:ignore указывают на осознанное игнорирование дублирования, но это требует документирования.

packages/app/src/lib/usecases/auth-gemini.ts (1)

75-75: ⚡ Quick win

UI пути для аутентификации Gemini подтверждены и правильно используются.

Проверка показала, что все упомянутые UI-пути реально реализованы в браузерном интерфейсе:

  • "Auth profiles" присутствует в меню браузера (panel-layout.tsx, menu.ts, panel-auth.tsx)
  • "Gemini CLI: set API key" определён как действие в auth-flow.ts (строка 38)
  • "Gemini CLI: login via OAuth" определён как действие в auth-flow.ts (строка 37)

Инструкции в логе соответствуют фактической структуре UI и не требуют изменений.

Comment on lines +73 to +74
? `Claude Code OAuth${suffix}`
: `Gemini CLI OAuth${suffix}`
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift

Рассмотрите переименование поля или добавление отдельного displayLabel.

Поскольку поле sshCommand больше не содержит исполняемую SSH/CLI команду, рассмотрите одно из решений:

  1. Переименовать sshCommanddisplayLabel или sessionLabel
  2. Добавить отдельное поле displayLabel и сохранить sshCommand для обратной совместимости
  3. Обновить документацию контракта, явно указав, что sshCommand — это человекочитаемая метка, а не команда

@@ -1,5 +1,5 @@
import { asObject, asString, type JsonValue } from "./api-json.js"
import type { AuthSnapshot, ProjectAuthSnapshot } from "./menu-types.js"
import type { AuthSnapshot, ProjectAuthSnapshot } from "../web/api-types.js"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial | ⚖️ Poor tradeoff

Рассмотрите вынос общих API-типов в нейтральное расположение.

Типы AuthSnapshot и ProjectAuthSnapshot описывают API-контракт, используемый и CLI (docker-git), и браузерным фронтендом. Размещение их в web/api-types.js создаёт зависимость CLI-слоя от веб-слоя.

Для улучшения архитектурной чистоты рекомендуется:

  • Создать packages/app/src/shared/api-types.ts для типов API-контракта.
  • Импортировать их оттуда и в CLI, и в web.
  • Сохранить web/ только для UI-специфичных типов (компоненты, состояния, события).

Это необязательное улучшение и может быть адресовано в последующих рефакторингах.

🤖 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/api-auth-codec.ts` at line 2, The AuthSnapshot
and ProjectAuthSnapshot types are shared API contracts and should be moved out
of web/api-types.js into a neutral module (create
packages/app/src/shared/api-types.ts exporting AuthSnapshot and
ProjectAuthSnapshot), then update the import in docker-git/api-auth-codec.ts to
import those types from the new shared module and update any web imports to
reference shared/api-types.ts as well; keep web/ only for UI-specific types
(components/state) and ensure all references to AuthSnapshot and
ProjectAuthSnapshot (the type names) are updated to the new import path.

🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Проверка экспорта типов в новом файле и поиск оставшихся ссылок на старый файл

echo "=== Checking new file exports AuthSnapshot and ProjectAuthSnapshot ==="
rg -n "export.*(?:type|interface)\s+(?:AuthSnapshot|ProjectAuthSnapshot)" packages/app/src/web/api-types.ts

echo -e "\n=== Searching for any remaining imports from menu-types.js ==="
rg -n "from\s+['\"].*menu-types" packages/app/src/

echo -e "\n=== Checking if menu-types.js still exists ==="
fd -t f "menu-types\.(ts|js|tsx|jsx)" packages/app/src/

echo -e "\n=== Comparing type structure (AuthSnapshot) ==="
ast-grep --pattern $'export type AuthSnapshot = $_' packages/app/src/web/api-types.ts

echo -e "\n=== Comparing type structure (ProjectAuthSnapshot) ==="
ast-grep --pattern $'export type ProjectAuthSnapshot = $_' packages/app/src/web/api-types.ts

Repository: ProverCoderAI/docker-git

Length of output: 756


Рассмотрите перемещение типов API на уровень shared.

Импорт типов AuthSnapshot и ProjectAuthSnapshot из ../web/api-types.js проверен и верифицирован — оба типа корректно экспортируются из новой локации (строки 43–44 packages/app/src/web/api-types.ts). Миграция чиста: старые файлы удалены, нет оставшихся ссылок на menu-types.js.

Архитектурное замечание: в текущем виде CLI-слой (docker-git/) зависит от web-слоя для типов контракта API. Рассмотрите переместить AuthSnapshot и ProjectAuthSnapshot в нейтральное место (например, src/shared/api-types.ts), чтобы избежать циклических зависимостей при расширении и соответствовать модели FCIS (SHELL → CORE, но общие контракты должны быть независимы от обоих).

🤖 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/api-auth-codec.ts` at line 2, The Docker-CLI
module currently imports AuthSnapshot and ProjectAuthSnapshot from the web layer
(api-auth-codec.ts imports from ../web/api-types.js); move these DTO/type
definitions into a neutral shared module (e.g., create src/shared/api-types.ts),
export AuthSnapshot and ProjectAuthSnapshot from there, then update the import
in packages/app/src/docker-git/api-auth-codec.ts to import the types from the
new shared module instead of ../web/api-types.js; also update other modules
(including packages/app/src/web/api-types.ts) to re-export or import these types
from the shared location to remove the CLI → web dependency.

Comment on lines +1 to +3
export const writeToTerminal = (text: string): void => {
process.stdout.write(text)
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

# First, read the full terminal-output.ts file
cat -n packages/app/src/docker-git/terminal-output.ts

Repository: ProverCoderAI/docker-git

Length of output: 177


🏁 Script executed:

# Check how writeToTerminal is being used
rg "writeToTerminal" --type ts --type tsx -B 2 -A 2

Repository: ProverCoderAI/docker-git

Length of output: 96


🏁 Script executed:

# Look at the directory structure to understand the layer context
ls -la packages/app/src/docker-git/

Repository: ProverCoderAI/docker-git

Length of output: 2764


🏁 Script executed:

# Check if other CLI functions use Effect for IO
rg "Effect\.(sync|async)" packages/app/src/docker-git/ --type ts -B 1 -A 1

Repository: ProverCoderAI/docker-git

Length of output: 3933


🏁 Script executed:

# Look at main entry point to understand the CLI pattern
head -50 packages/app/src/docker-git/main.js

Repository: ProverCoderAI/docker-git

Length of output: 163


🏁 Script executed:

# Look at how writeToTerminal is actually called in open-project-ssh.ts
cat -n packages/app/src/docker-git/open-project-ssh.ts | grep -A 5 "writeToTerminal"

Repository: ProverCoderAI/docker-git

Length of output: 838


🏁 Script executed:

# Check the actual structure of the calling code
sed -n '1,50p' packages/app/src/docker-git/open-project-ssh.ts

Repository: ProverCoderAI/docker-git

Length of output: 2035


🏁 Script executed:

# Look at how the Effect patterns are used in api-client-events.ts
sed -n '1,100p' packages/app/src/docker-git/api-client-events.ts | grep -A 10 "writeProjectEventLines"

Repository: ProverCoderAI/docker-git

Length of output: 373


🏁 Script executed:

# Check if there's a main.ts (not main.js)
cat -n packages/app/src/docker-git/main.ts

Repository: ProverCoderAI/docker-git

Length of output: 893


Оберните writeToTerminal в Effect.sync(), чтобы обеспечить единообразную композицию эффектов.

Сейчас функция возвращает void и выполняет IO напрямую, вынуждая вызывающий код оборачивать её в Effect.sync(). В кодовой базе аналогичные операции (например, writeProjectEventLines, setExitCode, persistControllerRevision) уже обёрнуты в эффекты. Рефакторинг упростит вызывающий код и сделает слой терминала полноценной частью Effect-композиции:

Предлагаемое изменение
+import { Effect } from "effect"
+
-export const writeToTerminal = (text: string): void => {
-  process.stdout.write(text)
-}
+export const writeToTerminal = (text: string): Effect.Effect<void> =>
+  Effect.sync(() => {
+    process.stdout.write(text)
+  })
🤖 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/terminal-output.ts` around lines 1 - 3, The
writeToTerminal function performs direct IO and should return an Effect to match
the other terminal helpers; change writeToTerminal(text: string): void to return
an Effect by wrapping the body in Effect.sync(...) (e.g., returning an
Effect.UIO<void>), add the necessary import for Effect, and update callers to
use the returned Effect (consistent with writeProjectEventLines, setExitCode,
persistControllerRevision); keep the exported name writeToTerminal and preserve
the behavior of writing to process.stdout.

@@ -0,0 +1,35 @@
import type { GpuMode } from "../docker-git/frontend-lib/core/domain.js"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major | ⚡ Quick win

Уберите зависимость web-типов от legacy-пути ../docker-git/frontend-lib.

Импорт GpuMode из legacy-ветки снова связывает src/web с удаляемой frontend-поверхностью. Лучше вынести тип в web/shared-модуль без legacy-префикса и импортировать оттуда.

As per coding guidelines, README.md фиксирует browser как единственный user-facing frontend, без возврата к legacy UI-связям.

🤖 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/web/create-types.ts` at line 1, Файл create-types.ts
импортирует тип GpuMode из legacy-пути ../docker-git/frontend-lib, что создаёт
ненужную зависимость от устаревшей ветки; вынесите определение типа GpuMode в
новый/существующий модуль web/shared (например web/shared/types или аналог) и
замените импорт в create-types.ts на импорт из этого web/shared-модуля; обновите
все места, которые используют GpuMode (символ GpuMode в create-types.ts и любые
связанные импорты) чтобы больше не ссылаться на ../docker-git/frontend-lib и
удалить legacy-зависимость.


export const gitBaseEnv: Readonly<Record<string, string>> = {
// Avoid blocking on interactive credential prompts in CI / TUI contexts.
// Avoid blocking on interactive credential prompts in CI/API contexts.
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial | 💤 Low value

Незначительное расхождение в терминологии.

Здесь используется формулировка "CI/API contexts", тогда как в других файлах (например, packages/lib/src/usecases/projects-down.ts:14) применяется "CLI/API callers". Рекомендуется унифицировать термины в рамках всего PR для согласованности документации.

🤖 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/usecases/state-repo/git-commands.ts` at line 11, Replace the
mismatched terminology in the inline comment that currently reads "Avoid
blocking on interactive credential prompts in CI/API contexts." so it matches
the rest of the PR terminology ("CLI/API callers"); update that comment to use
"CLI/API callers" (and scan other nearby comments in this file for the same
phrasing) to ensure consistent wording with the usage in projects-down.ts where
"CLI/API callers" is used.

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.

Надо удлаить старый фронтенд из кода

1 participant