[codex] remove legacy frontends#302
Conversation
📝 WalkthroughSummary by CodeRabbit
WalkthroughУдалён встроенный TUI/frontend из API и удалены многочисленные модули TUI/CLI-меню в пакете app; соответствующие потоки (create/auth/project-auth/select) и типы перенесены или объявлены в web-слое; маршрутизация CLI/парсер и конфигурации сборки/теста обновлены для единственного browser-интерфейса. ChangesAPI: убрать встроенный UI и перестроить роутер
Удаление TUI-меню из app (CLI) и перенаправление на browser
Консолидация логики в web-слой
Конфигурации, сборка, lint и тесты
E2E и скрипты
Sequence DiagramsequenceDiagram
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
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: stringAs per coding guidelines, all exported functions must include comprehensive TSDoc with
@puremarker,@complexitynotation, 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кейсы для:
- Сортировки: новые временные метки всегда первыми; тайбрейки по running → displayName → projectKey работают консистентно
- Фильтрации: результат всегда подмножество входа; пустой запрос сохраняет полный вход и порядок; каждый результат содержит все поисковые термины
- Окна: границы [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
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (131)
README.mdpackages/api/README.mdpackages/api/src/http.tspackages/api/src/services/auth-terminal-sessions.tspackages/api/src/ui.tspackages/api/tests/ui.test.tspackages/app/eslint.config.mtspackages/app/eslint/no-lib-imports.mjspackages/app/package.jsonpackages/app/src/app/main.tspackages/app/src/app/program.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/docker-git/api-client.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/frontend-lib/core/menu.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/docker-git/gridland-bun.d.tspackages/app/src/docker-git/menu-actions.tspackages/app/src/docker-git/menu-api.tspackages/app/src/docker-git/menu-auth-data.tspackages/app/src/docker-git/menu-auth-effects.tspackages/app/src/docker-git/menu-auth-helpers.tspackages/app/src/docker-git/menu-auth-snapshot-builder.tspackages/app/src/docker-git/menu-auth.tspackages/app/src/docker-git/menu-create.tspackages/app/src/docker-git/menu-errors.tspackages/app/src/docker-git/menu-gridland-runtime.tsxpackages/app/src/docker-git/menu-input-handler.tspackages/app/src/docker-git/menu-input-utils.tspackages/app/src/docker-git/menu-input.tspackages/app/src/docker-git/menu-labeled-env.tspackages/app/src/docker-git/menu-menu.tspackages/app/src/docker-git/menu-project-auth-claude.tspackages/app/src/docker-git/menu-project-auth-data.tspackages/app/src/docker-git/menu-project-auth-gemini.tspackages/app/src/docker-git/menu-project-auth-helpers.tspackages/app/src/docker-git/menu-project-auth.tspackages/app/src/docker-git/menu-render-auth.tspackages/app/src/docker-git/menu-render-common.tspackages/app/src/docker-git/menu-render-layout.tspackages/app/src/docker-git/menu-render-project-auth.tspackages/app/src/docker-git/menu-render-select.tspackages/app/src/docker-git/menu-render.tspackages/app/src/docker-git/menu-select-actions.tspackages/app/src/docker-git/menu-select-connect.tspackages/app/src/docker-git/menu-select-load.tspackages/app/src/docker-git/menu-select-runtime.tspackages/app/src/docker-git/menu-select-view.tspackages/app/src/docker-git/menu-select.tspackages/app/src/docker-git/menu-shared.tspackages/app/src/docker-git/menu-startup.tspackages/app/src/docker-git/menu-state.tspackages/app/src/docker-git/menu-types.tspackages/app/src/docker-git/menu.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/core/domain.tspackages/app/src/lib/core/menu.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/ui/primitives-gridland.tsxpackages/app/src/web/action-prompt.tspackages/app/src/web/actions-auth.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/actions-projects.tspackages/app/src/web/api.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-create.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/auth-flow.tspackages/app/src/web/buffer-input.tspackages/app/src/web/create-flow.tspackages/app/src/web/create-types.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/menu.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/panel-content.tsxpackages/app/src/web/panel-create-select.tsxpackages/app/src/web/panel-layout.tsxpackages/app/src/web/panel-project-auth.tsxpackages/app/src/web/panel-project-details.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-search.tspackages/app/src/web/project-select-order.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/project-select-search.tspackages/app/src/web/project-select-types.tspackages/app/tests/app/main.test.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/tests/docker-git/menu-api.test.tspackages/app/tests/docker-git/menu-input-handler.test.tspackages/app/tests/docker-git/menu-select-actions.test.tspackages/app/tests/docker-git/menu-select-connect.test.tspackages/app/tests/docker-git/menu-shared.test.tspackages/app/tests/docker-git/menu-startup.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/program.test.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tsconfig.build.jsonpackages/app/tsconfig.jsonpackages/app/vite.config.tspackages/app/vite.docker-git.config.tspackages/app/vite.web.config.tspackages/lib/src/core/domain.tspackages/lib/src/core/menu.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-delete.tspackages/lib/src/usecases/projects-down.tspackages/lib/src/usecases/projects-list.tspackages/lib/src/usecases/projects-ssh.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/lib/tests/core/menu.test.tspackages/lib/vite.config.tsscripts/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 useany,unknown,eslint-disable,ts-ignore, orastype 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 throughpipe()andEffect.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),@throwsNever (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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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/catchfor 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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/tsconfig.build.jsonpackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/tsconfig.jsonpackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/package.jsonpackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/github-auth-gate.tspackages/lib/src/usecases/projects-down.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-auth.tsxpackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/panel-layout.tsxpackages/app/src/web/auth-flow.tspackages/app/tsconfig.build.jsonpackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/web/project-search.tspackages/app/src/web/panel-content.tsxpackages/app/src/web/app-ready-state.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/web/actions-project-create.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/web/app-ready-create.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/state-repo/git-commands.tsREADME.mdpackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-select-types.tspackages/lib/src/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/docker-git/api-client.tspackages/app/eslint/no-lib-imports.mjspackages/app/src/web/api.tspackages/app/src/web/panel-auth.tsxpackages/lib/src/usecases/projects-list.tspackages/app/tsconfig.jsonpackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/menu.tspackages/app/src/lib/usecases/projects-list.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/web/panel-project-list.tsxpackages/app/src/web/app-ready-actions.tspackages/app/src/web/create-types.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/src/web/actions-projects.tspackages/app/src/web/actions-auth.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/program.test.tspackages/lib/src/usecases/auth-gemini.tspackages/app/src/web/create-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/docker-git/cli/usage.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/docker-git/cli/parser.tspackages/api/src/http.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/package.jsonpackages/app/eslint.config.mtspackages/app/src/web/project-select-order.tspackages/app/src/lib/core/domain.tspackages/app/src/web/project-select-search.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/program.tspackages/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.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tests/docker-git/program.test.tspackages/app/tests/docker-git/project-select.test.tspackages/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.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tests/docker-git/program.test.tspackages/app/tests/docker-git/project-select.test.tspackages/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!
There was a problem hiding this comment.
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-сессий. Название поля вводит в заблуждение — оно больше не гарантирует наличие исполняемой команды.Необходимо либо:
- Разделить типы (например,
type ProjectTerminalSessionvstype AuthTerminalSession)- Переименовать поле в auth-контексте на более точное (
sessionLabel,displayName)- Добавить тип-дискриминатор для различия формата в TerminalSession
- Добавить документацию о семантике поля в зависимости от типа сессии
🤖 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
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (131)
README.mdpackages/api/README.mdpackages/api/src/http.tspackages/api/src/services/auth-terminal-sessions.tspackages/api/src/ui.tspackages/api/tests/ui.test.tspackages/app/eslint.config.mtspackages/app/eslint/no-lib-imports.mjspackages/app/package.jsonpackages/app/src/app/main.tspackages/app/src/app/program.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/docker-git/api-client.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/docker-git/frontend-lib/core/menu.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/app/src/docker-git/gridland-bun.d.tspackages/app/src/docker-git/menu-actions.tspackages/app/src/docker-git/menu-api.tspackages/app/src/docker-git/menu-auth-data.tspackages/app/src/docker-git/menu-auth-effects.tspackages/app/src/docker-git/menu-auth-helpers.tspackages/app/src/docker-git/menu-auth-snapshot-builder.tspackages/app/src/docker-git/menu-auth.tspackages/app/src/docker-git/menu-create.tspackages/app/src/docker-git/menu-errors.tspackages/app/src/docker-git/menu-gridland-runtime.tsxpackages/app/src/docker-git/menu-input-handler.tspackages/app/src/docker-git/menu-input-utils.tspackages/app/src/docker-git/menu-input.tspackages/app/src/docker-git/menu-labeled-env.tspackages/app/src/docker-git/menu-menu.tspackages/app/src/docker-git/menu-project-auth-claude.tspackages/app/src/docker-git/menu-project-auth-data.tspackages/app/src/docker-git/menu-project-auth-gemini.tspackages/app/src/docker-git/menu-project-auth-helpers.tspackages/app/src/docker-git/menu-project-auth.tspackages/app/src/docker-git/menu-render-auth.tspackages/app/src/docker-git/menu-render-common.tspackages/app/src/docker-git/menu-render-layout.tspackages/app/src/docker-git/menu-render-project-auth.tspackages/app/src/docker-git/menu-render-select.tspackages/app/src/docker-git/menu-render.tspackages/app/src/docker-git/menu-select-actions.tspackages/app/src/docker-git/menu-select-connect.tspackages/app/src/docker-git/menu-select-load.tspackages/app/src/docker-git/menu-select-runtime.tspackages/app/src/docker-git/menu-select-view.tspackages/app/src/docker-git/menu-select.tspackages/app/src/docker-git/menu-shared.tspackages/app/src/docker-git/menu-startup.tspackages/app/src/docker-git/menu-state.tspackages/app/src/docker-git/menu-types.tspackages/app/src/docker-git/menu.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/core/domain.tspackages/app/src/lib/core/menu.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/app/src/ui/primitives-gridland.tsxpackages/app/src/web/action-prompt.tspackages/app/src/web/actions-auth.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/actions-projects.tspackages/app/src/web/api.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-create.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/auth-flow.tspackages/app/src/web/buffer-input.tspackages/app/src/web/create-flow.tspackages/app/src/web/create-types.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/menu.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/panel-content.tsxpackages/app/src/web/panel-create-select.tsxpackages/app/src/web/panel-layout.tsxpackages/app/src/web/panel-project-auth.tsxpackages/app/src/web/panel-project-details.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/web/project-search.tspackages/app/src/web/project-select-order.tspackages/app/src/web/project-select-presenter.tspackages/app/src/web/project-select-search.tspackages/app/src/web/project-select-types.tspackages/app/tests/app/main.test.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/tests/docker-git/menu-api.test.tspackages/app/tests/docker-git/menu-input-handler.test.tspackages/app/tests/docker-git/menu-select-actions.test.tspackages/app/tests/docker-git/menu-select-connect.test.tspackages/app/tests/docker-git/menu-shared.test.tspackages/app/tests/docker-git/menu-startup.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/program.test.tspackages/app/tests/docker-git/project-select.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tsconfig.build.jsonpackages/app/tsconfig.jsonpackages/app/vite.config.tspackages/app/vite.docker-git.config.tspackages/app/vite.web.config.tspackages/lib/src/core/domain.tspackages/lib/src/core/menu.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-delete.tspackages/lib/src/usecases/projects-down.tspackages/lib/src/usecases/projects-list.tspackages/lib/src/usecases/projects-ssh.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/lib/tests/core/menu.test.tspackages/lib/vite.config.tsscripts/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 useany,unknown,eslint-disable,ts-ignore, orastype 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 throughpipe()andEffect.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),@throwsNever (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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tspackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/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/catchfor 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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tspackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tsconfig.jsonpackages/app/tsconfig.build.jsonpackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/app/package.jsonpackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/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.tsxpackages/lib/src/usecases/projects-delete.tspackages/app/src/web/app-ready-shortcut-runtime.tspackages/app/src/lib/usecases/state-repo/git-commands.tspackages/app/src/lib/usecases/projects-down.tspackages/app/src/lib/usecases/auth-gemini.tspackages/app/src/web/panel-auth.tsxpackages/app/src/web/project-auth-flow.tspackages/app/src/docker-git/api-auth-codec.tspackages/app/src/web/actions-project-create.tspackages/app/src/web/project-select-types.tspackages/app/tests/docker-git/actions-project-create.test.tspackages/lib/src/usecases/projects-list.tspackages/app/src/web/github-auth-gate.tspackages/app/src/web/panel-content.tsxpackages/app/tests/docker-git/create-flow.test.tspackages/app/src/lib/usecases/projects-delete.tspackages/app/src/docker-git/frontend-lib/shell/terminal-cursor.tspackages/lib/src/usecases/state-repo/git-commands.tspackages/app/src/docker-git/terminal-output.tspackages/app/src/web/panel-layout.tsxpackages/app/src/docker-git/terminal-session-client.tspackages/app/src/lib/usecases/projects-ssh.tspackages/app/src/web/app-ready-state.tspackages/app/src/web/app-ready-create.tspackages/lib/src/usecases/projects-down.tspackages/app/src/web/app-ready-actions.tspackages/app/src/web/app-ready-main-panels.tsxpackages/app/src/web/panel-project-list.tsxpackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/eslint/no-lib-imports.mjspackages/lib/src/usecases/auth-gemini.tspackages/lib/src/usecases/projects-ssh.tspackages/app/src/lib/usecases/projects-list.tspackages/app/src/web/panel-project-details.tsxpackages/app/src/web/project-select-presenter.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/src/lib/usecases/terminal-cursor.tspackages/api/src/services/auth-terminal-sessions.tspackages/app/src/web/action-prompt.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tsconfig.jsonpackages/app/tsconfig.build.jsonpackages/app/src/web/create-flow.tspackages/app/src/docker-git/open-project-ssh.tspackages/app/src/web/project-search.tspackages/app/eslint.config.mtspackages/app/src/docker-git/program.tspackages/app/src/docker-git/cli/parser.tspackages/app/src/web/menu.tspackages/app/src/web/auth-flow.tsscripts/e2e/issue-61-auth-labels.shpackages/app/src/web/create-types.tspackages/app/src/web/panel-create-select.tsxpackages/app/tests/docker-git/app-ready-create.test.tspackages/api/src/http.tspackages/app/src/web/api.tspackages/app/src/docker-git/cli/usage.tspackages/app/src/docker-git/api-client.tspackages/app/tests/docker-git/program.test.tspackages/app/src/web/project-select-search.tspackages/app/src/web/actions-auth.tspackages/app/src/web/app-ready-layout.tsxpackages/app/src/web/project-select-order.tspackages/app/package.jsonpackages/lib/src/core/domain.tspackages/app/tests/docker-git/project-select.test.tspackages/app/src/docker-git/frontend-lib/core/domain.tspackages/app/src/lib/core/domain.tspackages/app/src/web/actions-projects.tsREADME.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.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/program.test.tspackages/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.tspackages/app/tests/docker-git/create-flow.test.tspackages/app/tests/docker-git/terminal-session-client.test.tspackages/app/tests/docker-git/parser-browser.test.tspackages/app/tests/docker-git/app-ready-shortcuts.test.tspackages/app/tests/docker-git/app-ready-create.test.tspackages/app/tests/docker-git/program.test.tspackages/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-импорта на webcreate-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/apppackages/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 winUI пути для аутентификации 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 и не требуют изменений.
| ? `Claude Code OAuth${suffix}` | ||
| : `Gemini CLI OAuth${suffix}` |
There was a problem hiding this comment.
🛠️ Refactor suggestion | 🟠 Major | 🏗️ Heavy lift
Рассмотрите переименование поля или добавление отдельного displayLabel.
Поскольку поле sshCommand больше не содержит исполняемую SSH/CLI команду, рассмотрите одно из решений:
- Переименовать
sshCommand→displayLabelилиsessionLabel - Добавить отдельное поле
displayLabelи сохранитьsshCommandдля обратной совместимости - Обновить документацию контракта, явно указав, что
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" | |||
There was a problem hiding this comment.
🧹 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.tsRepository: 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.
| export const writeToTerminal = (text: string): void => { | ||
| process.stdout.write(text) | ||
| } |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# First, read the full terminal-output.ts file
cat -n packages/app/src/docker-git/terminal-output.tsRepository: ProverCoderAI/docker-git
Length of output: 177
🏁 Script executed:
# Check how writeToTerminal is being used
rg "writeToTerminal" --type ts --type tsx -B 2 -A 2Repository: 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 1Repository: 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.jsRepository: 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.tsRepository: 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.tsRepository: 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" | |||
There was a problem hiding this comment.
🛠️ 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. |
There was a problem hiding this comment.
🧹 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.
Summary
docker-git browser.packages/app/src/weband update tests/docs/dependencies.Closes #298
Validation
bun install --forcebun run --cwd packages/app typecheckbun run --cwd packages/app build:docker-gitbun run --cwd packages/app build:webbun run --cwd packages/app testbun run --cwd packages/api typecheckbun run --cwd packages/api testbun run --cwd packages/lib typecheckbun run --cwd packages/lib testbun run check:dist-deps-prunenode scripts/final-build/browser-web-smoke.mjsNotes
ProverCoderAI/docker-gitwas not permitted for the current GitHub user, so this PR is opened from therikohomeless/docker-gitfork.