@prover-coder-ai/docker-git 1.0.25 → 1.0.27
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -2
- package/dist/src/docker-git/main.js +817 -196
- package/dist/src/docker-git/main.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sources":["../../../../lib/src/core/menu.ts","../../../../lib/src/core/strings.ts","../../../../lib/src/core/repo.ts","../../../../lib/src/core/domain.ts","../../../../lib/src/shell/command-runner.ts","../../../../lib/src/shell/errors.ts","../../../../lib/src/shell/docker-daemon-access.ts","../../../../lib/src/shell/docker.ts","../../../../lib/src/core/docker-network.ts","../../../../lib/src/usecases/docker-dns.ts","../../../../lib/src/usecases/access-log.ts","../../../../lib/src/core/parse-errors.ts","../../../../lib/src/usecases/errors.ts","../../../../lib/src/shell/docker-auth.ts","../../../../lib/src/usecases/auth-helpers.ts","../../../../lib/src/usecases/env-file.ts","../../../../lib/src/usecases/path-helpers.ts","../../../../lib/src/usecases/docker-image.ts","../../../../lib/src/usecases/github-auth-image.ts","../../../../lib/src/usecases/runtime.ts","../../../../lib/src/usecases/github-fork.ts","../../../../lib/src/usecases/menu-helpers.ts","../../../../lib/src/shell/paths.ts","../../../../lib/src/shell/config.ts","../../../../lib/src/usecases/docker-git-config-search.ts","../../../../lib/src/usecases/projects-core.ts","../../../../lib/src/usecases/state-repo/env.ts","../../../../lib/src/usecases/state-repo/git-commands.ts","../../../../lib/src/usecases/state-repo/github-auth.ts","../../../../lib/src/usecases/state-repo/gitignore.ts","../../../../lib/src/core/templates-prompt.ts","../../../../lib/src/core/templates-entrypoint/base.ts","../../../../lib/src/core/templates-entrypoint/claude.ts","../../../../lib/src/core/templates-entrypoint/codex.ts","../../../../lib/src/core/templates-entrypoint/git.ts","../../../../lib/src/core/templates-entrypoint/nested-docker-git.ts","../../../../lib/src/core/templates-entrypoint/opencode.ts","../../../../lib/src/core/templates-entrypoint/tasks.ts","../../../../lib/src/core/templates-entrypoint.ts","../../../../lib/src/core/templates/docker-compose.ts","../../../../lib/src/core/templates/dockerfile.ts","../../../../lib/src/core/templates/playwright.ts","../../../../lib/src/core/templates.ts","../../../../lib/src/shell/files.ts","../../../../lib/src/usecases/state-normalize.ts","../../../../lib/src/usecases/state-repo/sync-ops.ts","../../../../lib/src/usecases/state-repo.ts","../../../../lib/src/usecases/terminal-cursor.ts","../../../../lib/src/usecases/docker-network-gc.ts","../../../../lib/src/usecases/projects-delete.ts","../../../../lib/src/usecases/projects-down.ts","../../../../lib/src/usecases/projects-list.ts","../../../../lib/src/usecases/auth-copy.ts","../../../../lib/src/usecases/auth-sync.ts","../../../../lib/src/shell/ports.ts","../../../../lib/src/usecases/ports-reserve.ts","../../../../lib/src/usecases/projects-up.ts","../../../../lib/src/usecases/projects-ssh.ts","../../../../lib/src/usecases/actions/docker-up.ts","../../../../lib/src/usecases/actions/paths.ts","../../../../lib/src/usecases/actions/ports.ts","../../../../lib/src/usecases/actions/prepare-files.ts","../../../../lib/src/usecases/actions/create-project.ts","../../../../lib/src/core/token-labels.ts","../../../../lib/src/usecases/apply-overrides.ts","../../../../lib/src/usecases/apply.ts","../../../../lib/src/usecases/auth-claude-oauth.ts","../../../../lib/src/usecases/auth-claude.ts","../../../../lib/src/usecases/auth-codex.ts","../../../../lib/src/usecases/auth-github.ts","../../../../lib/src/usecases/mcp-playwright.ts","../../../../lib/src/usecases/scrap-chunks.ts","../../../../lib/src/usecases/scrap-path.ts","../../../../lib/src/usecases/scrap-common.ts","../../../../lib/src/usecases/scrap-session-export.ts","../../../../lib/src/usecases/scrap-session-manifest.ts","../../../../lib/src/usecases/scrap-session-import.ts","../../../../lib/src/usecases/scrap.ts","../../../../lib/src/usecases/terminal-sessions.ts","../../../src/docker-git/cli/parser-options.ts","../../../src/docker-git/cli/parser-shared.ts","../../../src/docker-git/cli/parser-apply.ts","../../../src/docker-git/cli/parser-attach.ts","../../../src/docker-git/cli/parser-auth.ts","../../../../lib/src/core/command-builders.ts","../../../src/docker-git/cli/parser-clone.ts","../../../src/docker-git/cli/parser-mcp-playwright.ts","../../../src/docker-git/cli/parser-panes.ts","../../../src/docker-git/cli/parser-scrap.ts","../../../src/docker-git/cli/parser-sessions.ts","../../../src/docker-git/cli/parser-state.ts","../../../src/docker-git/cli/usage.ts","../../../src/docker-git/cli/parser.ts","../../../src/docker-git/cli/read-command.ts","../../../src/docker-git/tmux.ts","../../../src/docker-git/menu-buffer-input.ts","../../../src/docker-git/menu-shared.ts","../../../src/docker-git/menu-types.ts","../../../src/docker-git/menu-create.ts","../../../src/docker-git/menu-auth-helpers.ts","../../../src/docker-git/menu-labeled-env.ts","../../../src/docker-git/menu-auth-data.ts","../../../src/docker-git/menu-input-utils.ts","../../../src/docker-git/menu-auth.ts","../../../src/docker-git/menu-select-runtime.ts","../../../src/docker-git/menu-project-auth-claude.ts","../../../src/docker-git/menu-project-auth-data.ts","../../../src/docker-git/menu-project-auth.ts","../../../src/docker-git/menu-select-connect.ts","../../../src/docker-git/menu-select-order.ts","../../../src/docker-git/menu-select-view.ts","../../../src/docker-git/menu-select-actions.ts","../../../src/docker-git/menu-select.ts","../../../src/docker-git/menu-select-load.ts","../../../src/docker-git/menu-actions.ts","../../../src/docker-git/menu-menu.ts","../../../src/docker-git/menu-input-handler.ts","../../../src/docker-git/menu-render-layout.ts","../../../src/docker-git/menu-render-select.ts","../../../src/docker-git/menu-render-common.ts","../../../src/docker-git/menu-render-auth.ts","../../../src/docker-git/menu-render-project-auth.ts","../../../src/docker-git/menu-render.ts","../../../src/docker-git/menu-startup.ts","../../../src/docker-git/menu.ts","../../../src/docker-git/program.ts","../../../src/docker-git/main.ts"],"sourcesContent":["import { Either } from \"effect\"\n\nexport type MenuAction =\n | { readonly _tag: \"Create\" }\n | { readonly _tag: \"Select\" }\n | { readonly _tag: \"Auth\" }\n | { readonly _tag: \"ProjectAuth\" }\n | { readonly _tag: \"Info\" }\n | { readonly _tag: \"Up\" }\n | { readonly _tag: \"Status\" }\n | { readonly _tag: \"Logs\" }\n | { readonly _tag: \"Down\" }\n | { readonly _tag: \"DownAll\" }\n | { readonly _tag: \"Delete\" }\n | { readonly _tag: \"Quit\" }\n\nexport type ParseError =\n | { readonly _tag: \"UnknownCommand\"; readonly command: string }\n | { readonly _tag: \"UnknownOption\"; readonly option: string }\n | { readonly _tag: \"MissingOptionValue\"; readonly option: string }\n | { readonly _tag: \"MissingRequiredOption\"; readonly option: string }\n | { readonly _tag: \"InvalidOption\"; readonly option: string; readonly reason: string }\n | { readonly _tag: \"UnexpectedArgument\"; readonly value: string }\n\nconst normalizeMenuInput = (input: string): string => input.trim().toLowerCase()\n\nconst menuAliasMap = new Map<string, MenuAction>([\n [\"1\", { _tag: \"Create\" }],\n [\"create\", { _tag: \"Create\" }],\n [\"c\", { _tag: \"Create\" }],\n [\"2\", { _tag: \"Select\" }],\n [\"select\", { _tag: \"Select\" }],\n [\"s\", { _tag: \"Select\" }],\n [\"3\", { _tag: \"Auth\" }],\n [\"auth\", { _tag: \"Auth\" }],\n [\"a\", { _tag: \"Auth\" }],\n [\"4\", { _tag: \"ProjectAuth\" }],\n [\"project-auth\", { _tag: \"ProjectAuth\" }],\n [\"projectauth\", { _tag: \"ProjectAuth\" }],\n [\"pa\", { _tag: \"ProjectAuth\" }],\n [\"5\", { _tag: \"Info\" }],\n [\"info\", { _tag: \"Info\" }],\n [\"i\", { _tag: \"Info\" }],\n [\"up\", { _tag: \"Up\" }],\n [\"u\", { _tag: \"Up\" }],\n [\"start\", { _tag: \"Up\" }],\n [\"6\", { _tag: \"Status\" }],\n [\"status\", { _tag: \"Status\" }],\n [\"ps\", { _tag: \"Status\" }],\n [\"7\", { _tag: \"Logs\" }],\n [\"logs\", { _tag: \"Logs\" }],\n [\"log\", { _tag: \"Logs\" }],\n [\"l\", { _tag: \"Logs\" }],\n [\"8\", { _tag: \"Down\" }],\n [\"down\", { _tag: \"Down\" }],\n [\"stop\", { _tag: \"Down\" }],\n [\"d\", { _tag: \"Down\" }],\n [\"9\", { _tag: \"DownAll\" }],\n [\"down-all\", { _tag: \"DownAll\" }],\n [\"downall\", { _tag: \"DownAll\" }],\n [\"stop-all\", { _tag: \"DownAll\" }],\n [\"stopall\", { _tag: \"DownAll\" }],\n [\"kill-all\", { _tag: \"DownAll\" }],\n [\"killall\", { _tag: \"DownAll\" }],\n [\"da\", { _tag: \"DownAll\" }],\n [\"10\", { _tag: \"Delete\" }],\n [\"delete\", { _tag: \"Delete\" }],\n [\"del\", { _tag: \"Delete\" }],\n [\"remove\", { _tag: \"Delete\" }],\n [\"rm\", { _tag: \"Delete\" }],\n [\"0\", { _tag: \"Quit\" }],\n [\"11\", { _tag: \"Quit\" }],\n [\"quit\", { _tag: \"Quit\" }],\n [\"q\", { _tag: \"Quit\" }],\n [\"exit\", { _tag: \"Quit\" }]\n])\n\nconst resolveMenuAction = (normalized: string): MenuAction | undefined => menuAliasMap.get(normalized)\n\n// CHANGE: decode interactive menu input into a typed action\n// WHY: keep menu parsing pure and reusable across shells\n// QUOTE(ТЗ): \"Хочу что бы открылось менюшка\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: parseMenu(s) = a -> deterministic(a)\n// PURITY: CORE\n// EFFECT: Effect<MenuAction, ParseError, never>\n// INVARIANT: unknown input maps to InvalidOption\n// COMPLEXITY: O(1)\nexport const parseMenuSelection = (input: string): Either.Either<MenuAction, ParseError> => {\n const normalized = normalizeMenuInput(input)\n\n if (normalized.length === 0) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"menu\",\n reason: \"empty selection\"\n })\n }\n\n const action = resolveMenuAction(normalized)\n if (action === undefined) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"menu\",\n reason: `unknown selection: ${input}`\n })\n }\n\n return Either.right(action)\n}\n","export const trimLeftChar = (value: string, char: string): string => {\n let start = 0\n while (start < value.length && value[start] === char) {\n start += 1\n }\n return value.slice(start)\n}\n\nexport const trimRightChar = (value: string, char: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === char) {\n end -= 1\n }\n return value.slice(0, end)\n}\n","import { trimLeftChar, trimRightChar } from \"./strings.js\"\n\nconst slugify = (value: string): string => {\n const normalized = value\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9_-]+/g, \"-\")\n .replaceAll(/-+/g, \"-\")\n const withoutLeading = trimLeftChar(normalized, \"-\")\n const cleaned = trimRightChar(withoutLeading, \"-\")\n\n return cleaned.length > 0 ? cleaned : \"app\"\n}\n\n// CHANGE: derive a stable repo slug from a repo URL\n// WHY: generate deterministic container/service names per repository\n// QUOTE(ТЗ): \"по факту он должен создавтаь постоянно новый контейнер для нового репозитория\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: slug(url) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: slug is lowercase and non-empty\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveRepoSlug = (repoUrl: string): string => {\n const trimmed = trimRightChar(repoUrl.trim(), \"/\")\n if (trimmed.length === 0) {\n return \"app\"\n }\n\n const lastSlash = trimmed.lastIndexOf(\"/\")\n const lastColon = trimmed.lastIndexOf(\":\")\n const pivot = Math.max(lastSlash, lastColon)\n const segment = pivot >= 0 ? trimmed.slice(pivot + 1) : trimmed\n const withoutGit = segment.endsWith(\".git\") ? segment.slice(0, -4) : segment\n\n return slugify(withoutGit)\n}\n\ntype RepoPathParts = {\n readonly ownerParts: ReadonlyArray<string>\n readonly repo: string\n readonly pathParts: ReadonlyArray<string>\n}\n\nconst stripGitSuffix = (segment: string): string => segment.endsWith(\".git\") ? segment.slice(0, -4) : segment\n\nconst normalizePathParts = (pathPart: string): ReadonlyArray<string> => {\n const cleaned = trimLeftChar(pathPart, \"/\")\n if (cleaned.length === 0) {\n return []\n }\n const rawParts = cleaned.split(\"/\").filter(Boolean)\n return rawParts.map((part, index) => index === rawParts.length - 1 ? stripGitSuffix(part) : part)\n}\n\nconst extractFromScheme = (trimmed: string): ReadonlyArray<string> | null => {\n const schemeIndex = trimmed.indexOf(\"://\")\n if (schemeIndex === -1) {\n return null\n }\n const afterScheme = trimmed.slice(schemeIndex + 3)\n const firstSlash = afterScheme.indexOf(\"/\")\n if (firstSlash === -1) {\n return []\n }\n return normalizePathParts(afterScheme.slice(firstSlash + 1))\n}\n\nconst extractFromColon = (trimmed: string): ReadonlyArray<string> | null => {\n const colonIndex = trimmed.indexOf(\":\")\n if (colonIndex === -1) {\n return null\n }\n return normalizePathParts(trimmed.slice(colonIndex + 1))\n}\n\nconst extractFromSlash = (trimmed: string): ReadonlyArray<string> | null => {\n const slashIndex = trimmed.indexOf(\"/\")\n if (slashIndex === -1) {\n return null\n }\n return normalizePathParts(trimmed.slice(slashIndex + 1))\n}\n\nconst extractRepoPathParts = (repoUrl: string): ReadonlyArray<string> => {\n const trimmed = trimRightChar(repoUrl.trim(), \"/\")\n if (trimmed.length === 0) {\n return []\n }\n\n const fromScheme = extractFromScheme(trimmed)\n if (fromScheme !== null) {\n return fromScheme\n }\n\n const fromColon = extractFromColon(trimmed)\n if (fromColon !== null) {\n return fromColon\n }\n\n const fromSlash = extractFromSlash(trimmed)\n if (fromSlash !== null) {\n return fromSlash\n }\n\n return [stripGitSuffix(trimmed)]\n}\n\nconst normalizeRepoSegment = (segment: string, fallback: string): string => {\n const normalized = slugify(segment)\n return normalized.length > 0 ? normalized : fallback\n}\n\n// CHANGE: derive stable owner/repo path parts from a repo URL\n// WHY: avoid collisions when orgs have identical repo names\n// QUOTE(ТЗ): \"пути учитывают организацию в которой это лежит\"\n// REF: user-request-2026-01-27\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: parts(url) -> deterministic(parts)\n// PURITY: CORE\n// EFFECT: Effect<RepoPathParts, never, never>\n// INVARIANT: path parts are slugified and non-empty\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveRepoPathParts = (repoUrl: string): RepoPathParts => {\n const repoSlug = deriveRepoSlug(repoUrl)\n const rawParts = extractRepoPathParts(repoUrl)\n if (rawParts.length === 0) {\n return { ownerParts: [], repo: repoSlug, pathParts: [repoSlug] }\n }\n\n const rawRepo = rawParts.at(-1) ?? repoSlug\n const repo = normalizeRepoSegment(rawRepo, repoSlug)\n const ownerParts = rawParts\n .slice(0, -1)\n .map((part) => normalizeRepoSegment(part, \"org\"))\n .filter((part) => part.length > 0)\n const pathParts = ownerParts.length > 0 ? [...ownerParts, repo] : [repo]\n\n return { ownerParts, repo, pathParts }\n}\n\nexport type GithubRepo = {\n readonly owner: string\n readonly repo: string\n}\n\nconst stripQueryHash = (value: string): string => {\n const queryIndex = value.indexOf(\"?\")\n const hashIndex = value.indexOf(\"#\")\n const indices = [queryIndex, hashIndex].filter((index) => index >= 0)\n if (indices.length === 0) {\n return value\n }\n const cutIndex = Math.min(...indices)\n return value.slice(0, cutIndex)\n}\n\nconst splitGithubPath = (input: string): ReadonlyArray<string> | null => {\n const trimmed = input.trim()\n const httpsPrefix = \"https://github.com/\"\n const sshPrefix = \"ssh://git@github.com/\"\n const gitPrefix = \"git@github.com:\"\n let rest: string | null = null\n if (trimmed.startsWith(httpsPrefix)) {\n rest = trimmed.slice(httpsPrefix.length)\n } else if (trimmed.startsWith(sshPrefix)) {\n rest = trimmed.slice(sshPrefix.length)\n } else if (trimmed.startsWith(gitPrefix)) {\n rest = trimmed.slice(gitPrefix.length)\n }\n if (rest === null) {\n return null\n }\n const cleaned = trimRightChar(stripQueryHash(rest), \"/\")\n if (cleaned.length === 0) {\n return []\n }\n return cleaned.split(\"/\").filter((part) => part.length > 0)\n}\n\n// CHANGE: parse GitHub owner/repo from common URL formats\n// WHY: enable auto-fork logic without relying on slugified paths\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: github(u) → repo(u) = {owner, repo}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returns null for non-GitHub inputs\n// COMPLEXITY: O(n) where n = |input|\nexport const parseGithubRepoUrl = (input: string): GithubRepo | null => {\n const parts = splitGithubPath(input)\n if (!parts || parts.length < 2) {\n return null\n }\n\n const owner = parts[0]?.trim()\n const repoRaw = parts[1]?.trim()\n if (!owner || !repoRaw) {\n return null\n }\n\n const repo = stripGitSuffix(repoRaw)\n return { owner, repo }\n}\n\nexport type ResolvedRepoInput = {\n readonly repoUrl: string\n readonly repoRef?: string\n readonly workspaceSuffix?: string\n}\n\ntype GithubRefParts = {\n readonly owner: string\n readonly repoRaw: string\n readonly marker: string\n readonly ref: string\n}\n\nconst readGithubPart = (value: string | undefined): string | null => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : null\n}\n\nconst parseGithubRefParts = (input: string): GithubRefParts | null => {\n const parts = splitGithubPath(input)\n if (!parts || parts.length < 4) {\n return null\n }\n const owner = readGithubPart(parts[0])\n const repoRaw = readGithubPart(parts[1])\n const markerRaw = readGithubPart(parts[2])\n const ref = readGithubPart(parts[3])\n if (!owner || !repoRaw || !markerRaw || !ref) {\n return null\n }\n return { owner, repoRaw, marker: markerRaw.toLowerCase(), ref }\n}\n\nconst parseGithubPrUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || parsed.marker !== \"pull\") {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n const workspaceSuffix = `pr-${slugify(parsed.ref)}`\n return {\n repoUrl: `https://github.com/${parsed.owner}/${repo}.git`,\n repoRef: `refs/pull/${parsed.ref}/head`,\n workspaceSuffix\n }\n}\n\n// CHANGE: normalize GitHub tree/blob URLs into repo + ref\n// WHY: allow docker-git clone to accept branch URLs like /tree/<branch>\n// QUOTE(ТЗ): \"вызови --force на https://github.com/agiens/crm/tree/vova-fork\"\n// REF: user-request-2026-02-10-github-tree-url\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: tree(u) → repo(u)=git(u) ∧ ref(u)=branch(u)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: ignores additional path segments after the ref\n// COMPLEXITY: O(n) where n = |url|\nconst parseGithubTreeUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || (parsed.marker !== \"tree\" && parsed.marker !== \"blob\")) {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n return { repoUrl: `https://github.com/${parsed.owner}/${repo}.git`, repoRef: parsed.ref }\n}\n\n// CHANGE: normalize GitHub issue URLs into repo URLs\n// WHY: allow docker-git clone to accept issue links directly\n// QUOTE(ТЗ): \"Сразу на issues\"\n// REF: user-request-2026-02-05-issues\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: issue(u) → repo(u)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: issue URL yields repoUrl + deterministic issue branch\n// COMPLEXITY: O(n) where n = |url|\nconst parseGithubIssueUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || parsed.marker !== \"issues\") {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n const workspaceSuffix = `issue-${slugify(parsed.ref)}`\n return {\n repoUrl: `https://github.com/${parsed.owner}/${repo}.git`,\n repoRef: workspaceSuffix,\n workspaceSuffix\n }\n}\n\n// CHANGE: normalize repo input and PR/issue URLs into repo + ref\n// WHY: allow cloning GitHub PR links and issue links directly\n// QUOTE(ТЗ): \"клонировть по cсылке на PR\" | \"Сразу на issues\"\n// REF: user-request-2026-01-28-pr | user-request-2026-02-05-issues\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: resolve(url) -> deterministic(url, ref)\n// PURITY: CORE\n// EFFECT: Effect<ResolvedRepoInput, never, never>\n// INVARIANT: PR URL yields repoUrl + refs/pull/<id>/head\n// COMPLEXITY: O(n) where n = |url|\nexport const resolveRepoInput = (repoUrl: string): ResolvedRepoInput =>\n parseGithubPrUrl(repoUrl)\n ?? parseGithubTreeUrl(repoUrl)\n ?? parseGithubIssueUrl(repoUrl)\n ?? { repoUrl: repoUrl.trim() }\n","export type { MenuAction, ParseError } from \"./menu.js\"\nexport { parseMenuSelection } from \"./menu.js\"\nexport { deriveRepoPathParts, deriveRepoSlug, resolveRepoInput } from \"./repo.js\"\n\nexport type DockerNetworkMode = \"shared\" | \"project\"\n\nexport const defaultDockerNetworkMode: DockerNetworkMode = \"shared\"\n\nexport const defaultDockerSharedNetworkName = \"docker-git-shared\"\n\nexport interface TemplateConfig {\n readonly containerName: string\n readonly serviceName: string\n readonly sshUser: string\n readonly sshPort: number\n readonly repoUrl: string\n readonly repoRef: string\n readonly forkRepoUrl?: string\n readonly gitTokenLabel?: string | undefined\n readonly codexAuthLabel?: string | undefined\n readonly claudeAuthLabel?: string | undefined\n readonly targetDir: string\n readonly volumeName: string\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexSharedAuthPath: string\n readonly codexHome: string\n readonly dockerNetworkMode: DockerNetworkMode\n readonly dockerSharedNetworkName: string\n readonly enableMcpPlaywright: boolean\n readonly pnpmVersion: string\n}\n\nexport interface ProjectConfig {\n readonly schemaVersion: 1\n readonly template: TemplateConfig\n}\n\nexport interface CreateCommand {\n readonly _tag: \"Create\"\n readonly config: TemplateConfig\n readonly outDir: string\n readonly runUp: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n readonly waitForClone: boolean\n readonly openSsh: boolean\n}\n\nexport interface MenuCommand {\n readonly _tag: \"Menu\"\n}\n\nexport interface AttachCommand {\n readonly _tag: \"Attach\"\n readonly projectDir: string\n}\n\nexport interface PanesCommand {\n readonly _tag: \"Panes\"\n readonly projectDir: string\n}\n\nexport interface SessionsListCommand {\n readonly _tag: \"SessionsList\"\n readonly projectDir: string\n readonly includeDefault: boolean\n}\n\nexport interface SessionsKillCommand {\n readonly _tag: \"SessionsKill\"\n readonly projectDir: string\n readonly pid: number\n}\n\nexport interface SessionsLogsCommand {\n readonly _tag: \"SessionsLogs\"\n readonly projectDir: string\n readonly pid: number\n readonly lines: number\n}\n\n// CHANGE: remove scrap cache mode and keep only the reproducible session snapshot.\n// WHY: cache archives include large, easily-rebuildable artifacts (e.g. node_modules) that should not be stored in git.\n// QUOTE(ТЗ): \"не должно быть старого режима где он качает весь шлак типо node_modules\"\n// REF: user-request-2026-02-15\n// SOURCE: n/a\n// FORMAT THEOREM: forall m: ScrapMode, m = \"session\"\n// PURITY: CORE\n// EFFECT: Effect<never>\n// INVARIANT: scrap exports/imports are always recipe-like (git state + small secrets), never full workspace caches\n// COMPLEXITY: O(1)\nexport type ScrapMode = \"session\"\n\nexport interface ScrapExportCommand {\n readonly _tag: \"ScrapExport\"\n readonly projectDir: string\n readonly archivePath: string\n readonly mode: ScrapMode\n}\n\nexport interface ScrapImportCommand {\n readonly _tag: \"ScrapImport\"\n readonly projectDir: string\n readonly archivePath: string\n readonly wipe: boolean\n readonly mode: ScrapMode\n}\n\nexport interface McpPlaywrightUpCommand {\n readonly _tag: \"McpPlaywrightUp\"\n readonly projectDir: string\n readonly runUp: boolean\n}\n\nexport interface ApplyCommand {\n readonly _tag: \"Apply\"\n readonly projectDir: string\n readonly runUp: boolean\n readonly gitTokenLabel?: string | undefined\n readonly codexTokenLabel?: string | undefined\n readonly claudeTokenLabel?: string | undefined\n readonly enableMcpPlaywright?: boolean | undefined\n}\n\nexport interface HelpCommand {\n readonly _tag: \"Help\"\n readonly message: string\n}\n\nexport interface StatusCommand {\n readonly _tag: \"Status\"\n}\n\nexport interface DownAllCommand {\n readonly _tag: \"DownAll\"\n}\n\nexport interface StatePathCommand {\n readonly _tag: \"StatePath\"\n}\n\nexport interface StateInitCommand {\n readonly _tag: \"StateInit\"\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nexport interface StatePullCommand {\n readonly _tag: \"StatePull\"\n}\n\nexport interface StatePushCommand {\n readonly _tag: \"StatePush\"\n}\n\nexport interface StateStatusCommand {\n readonly _tag: \"StateStatus\"\n}\n\nexport interface StateCommitCommand {\n readonly _tag: \"StateCommit\"\n readonly message: string\n}\n\nexport interface StateSyncCommand {\n readonly _tag: \"StateSync\"\n readonly message: string | null\n}\n\nexport interface AuthGithubLoginCommand {\n readonly _tag: \"AuthGithubLogin\"\n readonly label: string | null\n readonly token: string | null\n readonly scopes: string | null\n readonly envGlobalPath: string\n}\n\nexport interface AuthGithubStatusCommand {\n readonly _tag: \"AuthGithubStatus\"\n readonly envGlobalPath: string\n}\n\nexport interface AuthGithubLogoutCommand {\n readonly _tag: \"AuthGithubLogout\"\n readonly label: string | null\n readonly envGlobalPath: string\n}\n\nexport interface AuthCodexLoginCommand {\n readonly _tag: \"AuthCodexLogin\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthCodexStatusCommand {\n readonly _tag: \"AuthCodexStatus\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthCodexLogoutCommand {\n readonly _tag: \"AuthCodexLogout\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthClaudeLoginCommand {\n readonly _tag: \"AuthClaudeLogin\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport interface AuthClaudeStatusCommand {\n readonly _tag: \"AuthClaudeStatus\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport interface AuthClaudeLogoutCommand {\n readonly _tag: \"AuthClaudeLogout\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport type SessionsCommand =\n | SessionsListCommand\n | SessionsKillCommand\n | SessionsLogsCommand\n\nexport type ScrapCommand =\n | ScrapExportCommand\n | ScrapImportCommand\n\nexport type AuthCommand =\n | AuthGithubLoginCommand\n | AuthGithubStatusCommand\n | AuthGithubLogoutCommand\n | AuthCodexLoginCommand\n | AuthCodexStatusCommand\n | AuthCodexLogoutCommand\n | AuthClaudeLoginCommand\n | AuthClaudeStatusCommand\n | AuthClaudeLogoutCommand\n\nexport type StateCommand =\n | StatePathCommand\n | StateInitCommand\n | StatePullCommand\n | StatePushCommand\n | StateStatusCommand\n | StateCommitCommand\n | StateSyncCommand\n\nexport type Command =\n | CreateCommand\n | MenuCommand\n | AttachCommand\n | PanesCommand\n | SessionsCommand\n | ScrapCommand\n | McpPlaywrightUpCommand\n | ApplyCommand\n | HelpCommand\n | StatusCommand\n | DownAllCommand\n | StateCommand\n | AuthCommand\n\n// CHANGE: validate docker network mode values at the CLI/config boundary\n// WHY: keep compose network behavior explicit and type-safe\n// QUOTE(ТЗ): \"Что бы среды были изолированы?\"\n// REF: user-request-2026-02-20-networks\n// SOURCE: n/a\n// FORMAT THEOREM: ∀x: isDockerNetworkMode(x) -> x ∈ {\"shared\",\"project\"}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returns true only for known modes\n// COMPLEXITY: O(1)\nexport const isDockerNetworkMode = (value: string): value is DockerNetworkMode =>\n value === \"shared\" || value === \"project\"\n\n// CHANGE: derive compose network name from typed template config\n// WHY: keep network naming deterministic across template generation and runtime checks\n// QUOTE(ТЗ): \"Если я хочу уникальную сеть на каждый контейнер?\"\n// REF: user-request-2026-02-20-networks\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cfg: resolveComposeNetworkName(cfg) = n -> deterministic(n)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: shared mode always resolves to dockerSharedNetworkName; project mode to \"<service>-net\"\n// COMPLEXITY: O(1)\nexport const resolveComposeNetworkName = (\n config: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): string =>\n config.dockerNetworkMode === \"shared\"\n ? config.dockerSharedNetworkName\n : `${config.serviceName}-net`\n\nexport const defaultTemplateConfig = {\n containerName: \"dev-ssh\",\n serviceName: \"dev\",\n sshUser: \"dev\",\n sshPort: 2222,\n repoRef: \"main\",\n targetDir: \"/home/dev/app\",\n volumeName: \"dev_home\",\n dockerGitPath: \"./.docker-git\",\n authorizedKeysPath: \"./.docker-git/authorized_keys\",\n envGlobalPath: \"./.docker-git/.orch/env/global.env\",\n envProjectPath: \"./.orch/env/project.env\",\n codexAuthPath: \"./.docker-git/.orch/auth/codex\",\n codexSharedAuthPath: \"./.docker-git/.orch/auth/codex\",\n codexHome: \"/home/dev/.codex\",\n dockerNetworkMode: defaultDockerNetworkMode,\n dockerSharedNetworkName: defaultDockerSharedNetworkName,\n enableMcpPlaywright: false,\n pnpmVersion: \"10.27.0\"\n}\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Chunk from \"effect/Chunk\"\nimport * as Stream from \"effect/Stream\"\n\ntype RunCommandSpec = {\n readonly cwd: string\n readonly command: string\n readonly args: ReadonlyArray<string>\n readonly env?: Readonly<Record<string, string | undefined>>\n}\n\nconst buildCommand = (\n spec: RunCommandSpec,\n stdout: \"inherit\" | \"pipe\",\n stderr: \"inherit\" | \"pipe\",\n stdin: Command.CommandInput = \"pipe\"\n) =>\n pipe(\n Command.make(spec.command, ...spec.args),\n Command.workingDirectory(spec.cwd),\n spec.env ? Command.env(spec.env) : (value) => value,\n Command.stdin(stdin),\n Command.stdout(stdout),\n Command.stderr(stderr)\n )\n\nconst ensureExitCode = <E>(\n exitCode: number,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<number, E> =>\n okExitCodes.includes(exitCode)\n ? Effect.succeed(exitCode)\n : Effect.fail(onFailure(exitCode))\n\nexport const runCommandWithExitCodes = <E>(\n spec: RunCommandSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<void, E | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const exitCode = yield* _(Command.exitCode(buildCommand(spec, \"inherit\", \"inherit\", \"inherit\")))\n const numericExitCode = Number(exitCode)\n yield* _(ensureExitCode(numericExitCode, okExitCodes, onFailure))\n })\n\n// CHANGE: run a command and return the exit code\n// WHY: enable status checks without throwing on non-zero exits\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) = n\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: stdout/stderr are suppressed for status checks\n// COMPLEXITY: O(command)\nexport const runCommandExitCode = (\n spec: RunCommandSpec\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.map(\n Command.exitCode(\n buildCommand(spec, \"pipe\", \"pipe\", \"inherit\")\n ),\n Number\n )\n\nconst collectUint8Array = (chunks: Chunk.Chunk<Uint8Array>): Uint8Array =>\n Chunk.reduce(chunks, new Uint8Array(), (acc, curr) => {\n const next = new Uint8Array(acc.length + curr.length)\n next.set(acc)\n next.set(curr, acc.length)\n return next\n })\n\n// CHANGE: run a command and capture stdout\n// WHY: allow auth flows to retrieve tokens from CLI tools\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: capture(cmd) -> stdout(cmd)\n// PURITY: SHELL\n// EFFECT: Effect<string, E | PlatformError, CommandExecutor>\n// INVARIANT: stderr is captured but ignored for output\n// COMPLEXITY: O(command)\nexport const runCommandCapture = <E>(\n spec: RunCommandSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<string, E | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const process = yield* _(executor.start(buildCommand(spec, \"pipe\", \"pipe\", \"pipe\")))\n const bytes = yield* _(\n pipe(process.stdout, Stream.runCollect, Effect.map((chunks) => collectUint8Array(chunks)))\n )\n const exitCode = yield* _(process.exitCode)\n yield* _(ensureExitCode(Number(exitCode), okExitCodes, onFailure))\n return new TextDecoder(\"utf-8\").decode(bytes)\n })\n )\n","import { Data } from \"effect\"\n\nexport class FileExistsError extends Data.TaggedError(\"FileExistsError\")<{\n readonly path: string\n}> {}\n\nexport class ConfigNotFoundError extends Data.TaggedError(\"ConfigNotFoundError\")<{\n readonly path: string\n}> {}\n\nexport class ConfigDecodeError extends Data.TaggedError(\"ConfigDecodeError\")<{\n readonly path: string\n readonly message: string\n}> {}\n\nexport class InputCancelledError extends Data.TaggedError(\"InputCancelledError\")<\n Record<string, never>\n> {}\n\nexport class InputReadError extends Data.TaggedError(\"InputReadError\")<{\n readonly message: string\n}> {}\n\nexport class DockerCommandError extends Data.TaggedError(\"DockerCommandError\")<{\n readonly exitCode: number\n}> {}\n\nexport type DockerAccessIssue = \"PermissionDenied\" | \"DaemonUnavailable\"\n\nexport class DockerAccessError extends Data.TaggedError(\"DockerAccessError\")<{\n readonly issue: DockerAccessIssue\n readonly details: string\n}> {}\n\nexport class CloneFailedError extends Data.TaggedError(\"CloneFailedError\")<{\n readonly repoUrl: string\n readonly repoRef: string\n readonly targetDir: string\n}> {}\n\nexport class PortProbeError extends Data.TaggedError(\"PortProbeError\")<{\n readonly port: number\n readonly message: string\n}> {}\n\nexport class CommandFailedError extends Data.TaggedError(\"CommandFailedError\")<{\n readonly command: string\n readonly exitCode: number\n}> {}\n\nexport class AuthError extends Data.TaggedError(\"AuthError\")<{\n readonly message: string\n}> {}\n\nexport class ScrapArchiveNotFoundError extends Data.TaggedError(\"ScrapArchiveNotFoundError\")<{\n readonly path: string\n}> {}\n\nexport class ScrapArchiveInvalidError extends Data.TaggedError(\"ScrapArchiveInvalidError\")<{\n readonly path: string\n readonly message: string\n}> {}\n\nexport class ScrapTargetDirUnsupportedError extends Data.TaggedError(\"ScrapTargetDirUnsupportedError\")<{\n readonly sshUser: string\n readonly targetDir: string\n readonly reason: string\n}> {}\n\nexport class ScrapWipeRefusedError extends Data.TaggedError(\"ScrapWipeRefusedError\")<{\n readonly sshUser: string\n readonly targetDir: string\n readonly reason: string\n}> {}\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Chunk from \"effect/Chunk\"\nimport * as Stream from \"effect/Stream\"\n\nimport { DockerAccessError, type DockerAccessIssue } from \"./errors.js\"\n\nconst permissionDeniedPattern = /permission denied/i\n\nconst collectUint8Array = (chunks: Chunk.Chunk<Uint8Array>): Uint8Array =>\n Chunk.reduce(chunks, new Uint8Array(), (acc, curr) => {\n const next = new Uint8Array(acc.length + curr.length)\n next.set(acc)\n next.set(curr, acc.length)\n return next\n })\n\nconst resolveDockerHostFallbackCandidates = (): ReadonlyArray<string> => {\n if (process.env[\"DOCKER_HOST\"] !== undefined) {\n return []\n }\n\n const runtimeDir = process.env[\"XDG_RUNTIME_DIR\"]?.trim()\n const uid = typeof process.getuid === \"function\"\n ? process.getuid().toString()\n : process.env[\"UID\"]?.trim()\n\n return [\n ...new Set(\n [\n runtimeDir ? `unix://${runtimeDir}/docker.sock` : undefined,\n uid ? `unix:///run/user/${uid}/docker.sock` : undefined\n ].filter((value): value is string => value !== undefined)\n )\n ]\n}\n\nconst runDockerInfoCommand = (\n cwd: string,\n env?: Readonly<Record<string, string | undefined>>\n): Effect.Effect<\n { readonly exitCode: number; readonly details: string },\n PlatformError,\n CommandExecutor.CommandExecutor\n> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const process = yield* _(\n executor.start(\n pipe(\n Command.make(\"docker\", \"info\"),\n Command.workingDirectory(cwd),\n env ? Command.env(env) : (value) => value,\n Command.stdin(\"pipe\"),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n )\n )\n\n const stderrBytes = yield* _(\n pipe(process.stderr, Stream.runCollect, Effect.map((chunks) => collectUint8Array(chunks)))\n )\n const exitCode = Number(yield* _(process.exitCode))\n const stderr = new TextDecoder(\"utf-8\").decode(stderrBytes).trim()\n return {\n exitCode,\n details: stderr.length > 0 ? stderr : `docker info failed with exit code ${exitCode}`\n }\n })\n )\n\n// CHANGE: classify docker daemon access failure into deterministic typed reasons\n// WHY: allow callers to render actionable recovery guidance for socket permission issues\n// QUOTE(ТЗ): \"docker-git handles Docker socket permission problems predictably\"\n// REF: issue-11\n// SOURCE: n/a\n// FORMAT THEOREM: ∀m: classify(m) ∈ {\"PermissionDenied\",\"DaemonUnavailable\"}\n// PURITY: CORE\n// EFFECT: Effect<DockerAccessIssue, never, never>\n// INVARIANT: classification is stable for equal input\n// COMPLEXITY: O(|m|)\nexport const classifyDockerAccessIssue = (message: string): DockerAccessIssue =>\n permissionDeniedPattern.test(message) ? \"PermissionDenied\" : \"DaemonUnavailable\"\n\n// CHANGE: verify docker daemon access before compose/auth flows\n// WHY: fail fast on socket permission errors instead of cascading into opaque command failures\n// QUOTE(ТЗ): \"permission denied to /var/run/docker.sock\"\n// REF: issue-11\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cwd: access(cwd)=ok ∨ DockerAccessError\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerAccessError | PlatformError, CommandExecutor>\n// INVARIANT: non-zero docker info exit always maps to DockerAccessError\n// COMPLEXITY: O(command)\nexport const ensureDockerDaemonAccess = (\n cwd: string\n): Effect.Effect<void, DockerAccessError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const primaryResult = yield* _(runDockerInfoCommand(cwd))\n if (primaryResult.exitCode === 0) {\n return\n }\n\n const primaryIssue = classifyDockerAccessIssue(primaryResult.details)\n if (primaryIssue !== \"PermissionDenied\") {\n return yield* _(\n Effect.fail(\n new DockerAccessError({\n issue: primaryIssue,\n details: primaryResult.details\n })\n )\n )\n }\n\n let fallbackErrorDetails = primaryResult.details\n let fallbackIssue: DockerAccessIssue = primaryIssue\n\n for (const fallbackHost of resolveDockerHostFallbackCandidates()) {\n const fallbackResult = yield* _(\n runDockerInfoCommand(cwd, {\n ...process.env,\n DOCKER_HOST: fallbackHost\n })\n )\n\n if (fallbackResult.exitCode === 0) {\n process.env[\"DOCKER_HOST\"] = fallbackHost\n return\n }\n\n fallbackErrorDetails = fallbackResult.details\n fallbackIssue = classifyDockerAccessIssue(fallbackResult.details)\n }\n\n return yield* _(\n Effect.fail(\n new DockerAccessError({\n issue: fallbackIssue,\n details: fallbackErrorDetails\n })\n )\n )\n })\n )\n","import * as Command from \"@effect/platform/Command\"\nimport type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport { ExitCode } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"./command-runner.js\"\nimport { CommandFailedError, DockerCommandError } from \"./errors.js\"\n\nexport { classifyDockerAccessIssue, ensureDockerDaemonAccess } from \"./docker-daemon-access.js\"\n\nconst composeSpec = (cwd: string, args: ReadonlyArray<string>) => ({\n cwd,\n command: \"docker\",\n args: [\"compose\", \"--ansi\", \"never\", \"--progress\", \"plain\", ...args]\n})\n\nconst parseInspectNetworkEntry = (line: string): ReadonlyArray<readonly [string, string]> => {\n const idx = line.indexOf(\"=\")\n if (idx <= 0) {\n return []\n }\n const network = line.slice(0, idx).trim()\n const ip = line.slice(idx + 1).trim()\n if (network.length === 0 || ip.length === 0) {\n return []\n }\n const entry: readonly [string, string] = [network, ip]\n return [entry]\n}\n\nconst runCompose = (\n cwd: string,\n args: ReadonlyArray<string>,\n okExitCodes: ReadonlyArray<number>\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n composeSpec(cwd, args),\n okExitCodes,\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\nconst runComposeCapture = (\n cwd: string,\n args: ReadonlyArray<string>,\n okExitCodes: ReadonlyArray<number>\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n composeSpec(cwd, args),\n okExitCodes,\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: run docker compose up -d --build in the target directory\n// WHY: provide a controlled shell effect for image creation\n// QUOTE(ТЗ): \"создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> image_built(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeUp = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"up\", \"-d\", \"--build\"], [Number(ExitCode(0))])\n\nexport const dockerComposeUpRecreateArgs: ReadonlyArray<string> = [\n \"up\",\n \"-d\",\n \"--build\",\n \"--force-recreate\"\n]\n\n// CHANGE: recreate running containers and refresh images when needed\n// WHY: apply env/template updates while preserving workspace volumes\n// QUOTE(ТЗ): \"сбросит только окружение\"\n// REF: user-request-2026-02-11-force-env\n// SOURCE: n/a\n// FORMAT THEOREM: ∀dir: up_force_recreate(dir) → recreated(containers(dir)) ∧ preserved(volumes(dir)) ∧ updated(images(dir))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: may rebuild images but does not remove volumes\n// COMPLEXITY: O(command)\nexport const runDockerComposeUpRecreate = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, dockerComposeUpRecreateArgs, [Number(ExitCode(0))])\n\n// CHANGE: run docker compose down in the target directory\n// WHY: allow stopping managed containers from the CLI/menu\n// QUOTE(ТЗ): \"Могу удалить / Отключить\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> containers_stopped(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeDown = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"down\"], [Number(ExitCode(0))])\n\n// CHANGE: run docker compose down -v in the target directory\n// WHY: allow a truly fresh environment by wiping the named volumes (e.g. /home/dev)\n// QUOTE(ТЗ): \"контейнер полностью должен же очищаться при --force\"\n// REF: user-request-2026-02-07-force-wipe-volumes\n// SOURCE: n/a\n// FORMAT THEOREM: ∀dir: down_v(dir) → removed(volumes(dir))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: removes only resources within the compose project (containers, networks, volumes)\n// COMPLEXITY: O(command)\nexport const runDockerComposeDownVolumes = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"down\", \"-v\"], [Number(ExitCode(0))])\n\n// CHANGE: recreate docker compose environment in the target directory\n// WHY: allow a clean rebuild of the container from the UI\n// QUOTE(ТЗ): \"дропнул контейнер и заново его создал\"\n// REF: user-request-2026-01-13\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: down(dir) && up(dir) -> recreated(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: down completes before up starts\n// COMPLEXITY: O(command)\nexport const runDockerComposeRecreate = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runDockerComposeDown(cwd),\n Effect.zipRight(runDockerComposeUp(cwd))\n )\n\n// CHANGE: run docker compose ps in the target directory\n// WHY: expose runtime status in the interactive menu\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> status_listed(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposePs = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"ps\"], [Number(ExitCode(0))])\n\n// CHANGE: capture docker compose ps output in a parseable format\n// WHY: allow structured, readable status output for CLI\n// QUOTE(ТЗ): \"информация отображалиась удобно\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: ps_fmt(dir) -> tabbed_string\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: output is tab-delimited columns from docker compose ps\n// COMPLEXITY: O(command)\nexport const runDockerComposePsFormatted = (\n cwd: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runComposeCapture(\n cwd,\n [\"ps\", \"--format\", \"{{.Name}}\\t{{.Status}}\\t{{.Ports}}\\t{{.Image}}\"],\n [Number(ExitCode(0))]\n )\n\n// CHANGE: run docker compose logs in the target directory\n// WHY: allow quick inspection of container output without leaving the menu\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) in {0,130} -> logs_shown(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeLogs = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"logs\", \"--tail\", \"200\"], [Number(ExitCode(0)), 130])\n\n// CHANGE: stream docker compose logs until interrupted\n// WHY: allow synchronous clone flow to surface container output\n// QUOTE(ТЗ): \"должно работать синхронно отображая весь процесс\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: logs_follow(dir) -> stdout(stream)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeLogsFollow = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"logs\", \"--follow\", \"--tail\", \"0\"], [Number(ExitCode(0)), 130])\n\n// CHANGE: run docker exec and return its exit code\n// WHY: allow polling for clone completion markers inside the container\n// QUOTE(ТЗ): \"весь процесс от и до\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(docker exec cmd) = n -> deterministic(n)\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: stdout/stderr are suppressed for polling commands\n// COMPLEXITY: O(command)\nexport const runDockerExecExitCode = (\n cwd: string,\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const command = pipe(\n Command.make(\"docker\", \"exec\", containerName, ...args),\n Command.workingDirectory(cwd),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n const exitCode = yield* _(Command.exitCode(command))\n return Number(exitCode)\n })\n\n// CHANGE: inspect container IP address\n// WHY: enable per-container DNS mapping on the host\n// QUOTE(ТЗ): \"У каждого контейнера свой IP т.е свой домен\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: inspect(c) -> ip(c)\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: returns empty string when not available\n// COMPLEXITY: O(command)\nexport const runDockerInspectContainerIp = (\n cwd: string,\n containerName: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\n \"inspect\",\n \"-f\",\n // Prefer the built-in `bridge` network IP when present so the printed IP\n // works from \"external\" containers that default to `bridge`.\n // Example output:\n // bridge=172.17.0.4\n // <project>_dg-<repo>-net=192.168.64.3\n String.raw`{{range $k,$v := .NetworkSettings.Networks}}{{printf \"%s=%s\\n\" $k $v.IPAddress}}{{end}}`,\n containerName\n ]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.map((output) => {\n const lines = output\n .trim()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n\n const entries = lines.flatMap((line) => parseInspectNetworkEntry(line))\n\n if (entries.length === 0) {\n return \"\"\n }\n\n const map = new Map(entries)\n return map.get(\"bridge\") ?? entries[0]![1]\n })\n )\n\n// CHANGE: inspect the container IP address on the default `bridge` network\n// WHY: allow callers to decide whether `docker network connect bridge` is needed\n// QUOTE(ТЗ): \"подключиться с внешнего контейнера\"\n// REF: user-request-2026-02-10-bridge-ip\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: bridge(c) → ip_bridge(c) ≠ \"\"\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: returns \"\" when the container is not connected to `bridge`\n// COMPLEXITY: O(command)\nexport const runDockerInspectContainerBridgeIp = (\n cwd: string,\n containerName: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\n \"inspect\",\n \"-f\",\n \"{{with (index .NetworkSettings.Networks \\\"bridge\\\")}}{{.IPAddress}}{{end}}\",\n containerName\n ]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.map((output) => output.trim())\n )\n\n// CHANGE: connect an existing container to the default `bridge` network\n// WHY: allow \"external\" containers (which default to `bridge`) to reach services by container IP\n// QUOTE(ТЗ): \"Всё что запущено в докере должно быть публично наружу\"\n// REF: user-request-2026-02-10-public-ports\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: up(c) → reachable(bridge_ip(c), ports(c))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: does not fail the overall flow when already connected (handled by caller)\n// COMPLEXITY: O(command)\nexport const runDockerNetworkConnectBridge = (\n cwd: string,\n containerName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"connect\", \"bridge\", containerName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.asVoid\n )\n\n// CHANGE: check whether a Docker network already exists\n// WHY: allow shared-network mode to create the network only when missing\n// QUOTE(ТЗ): \"Что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: exists(n) ∈ {true,false}\n// PURITY: SHELL\n// EFFECT: Effect<boolean, PlatformError, CommandExecutor>\n// INVARIANT: returns false for non-zero inspect exit codes\n// COMPLEXITY: O(command)\nexport const runDockerNetworkExists = (\n cwd: string,\n networkName: string\n): Effect.Effect<boolean, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({\n cwd,\n command: \"docker\",\n args: [\"network\", \"inspect\", networkName]\n }).pipe(Effect.map((exitCode) => exitCode === 0))\n\n// CHANGE: create a Docker bridge network with a deterministic name\n// WHY: shared-network mode requires an external network before compose up\n// QUOTE(ТЗ): \"сделай что бы я эту ошибку больше не видел\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: create(n)=0 -> network_exists(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: network driver is always `bridge`\n// COMPLEXITY: O(command)\nexport const runDockerNetworkCreateBridge = (\n cwd: string,\n networkName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"create\", \"--driver\", \"bridge\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: inspect how many containers are attached to a network\n// WHY: network GC must remove only detached networks\n// QUOTE(ТЗ): \"Только так что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: count(n) = |containers(n)|\n// PURITY: SHELL\n// EFFECT: Effect<number, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: parse fallback is 0 when docker inspect output is empty\n// COMPLEXITY: O(command)\nexport const runDockerNetworkContainerCount = (\n cwd: string,\n networkName: string\n): Effect.Effect<number, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"inspect\", \"-f\", \"{{len .Containers}}\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ).pipe(\n Effect.map((output) => {\n const parsed = Number.parseInt(output.trim(), 10)\n return Number.isNaN(parsed) ? 0 : parsed\n })\n )\n\n// CHANGE: remove a Docker network by name\n// WHY: network GC should reclaim detached project-scoped networks\n// QUOTE(ТЗ): \"убирать мусорные сети автоматически\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: rm(n)=0 -> !exists(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: removes exactly the named network\n// COMPLEXITY: O(command)\nexport const runDockerNetworkRemove = (\n cwd: string,\n networkName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"rm\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: list names of running Docker containers\n// WHY: support TUI filtering (e.g. stop only running docker-git containers)\n// QUOTE(ТЗ): \"Если я выбираю остановку контейнера значит он мне должен показывать контейнеры которые запущены\"\n// REF: user-request-2026-02-07-stop-only-running\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: c in ps -> running(c)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: result contains only non-empty container names\n// COMPLEXITY: O(command)\nexport const runDockerPsNames = (\n cwd: string\n): Effect.Effect<ReadonlyArray<string>, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"ps\", \"--format\", \"{{.Names}}\"]\n },\n [Number(ExitCode(0))],\n (exitCode) => new CommandFailedError({ command: \"docker ps\", exitCode })\n ),\n Effect.map((output) =>\n output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n )\n )\n\nconst publishedHostPortPattern = /:(\\d+)->/g\n\nconst parsePublishedHostPortsFromLine = (line: string): ReadonlyArray<number> => {\n const parsed: Array<number> = []\n for (const match of line.matchAll(publishedHostPortPattern)) {\n const rawPort = match[1]\n if (rawPort === undefined) {\n continue\n }\n const value = Number.parseInt(rawPort, 10)\n if (Number.isInteger(value) && value > 0 && value <= 65_535) {\n parsed.push(value)\n }\n }\n return parsed\n}\n\n// CHANGE: decode published host ports from `docker ps --format \"{{.Ports}}\"` output\n// WHY: Docker can reserve host ports via NAT even when no host TCP socket is visible\n// QUOTE(ТЗ): \"должен просто новый порт брать под себя\"\n// REF: user-request-2026-02-19-port-allocation\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in parse(output): published_by_docker(p)\n// PURITY: CORE\n// EFFECT: Effect<ReadonlyArray<number>, never, never>\n// INVARIANT: returns unique ports in encounter order\n// COMPLEXITY: O(|output|)\nexport const parseDockerPublishedHostPorts = (output: string): ReadonlyArray<number> => {\n const unique = new Set<number>()\n const parsed: Array<number> = []\n\n for (const line of output.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed.length === 0) {\n continue\n }\n for (const port of parsePublishedHostPortsFromLine(trimmed)) {\n if (!unique.has(port)) {\n unique.add(port)\n parsed.push(port)\n }\n }\n }\n\n return parsed\n}\n\n// CHANGE: read currently published Docker host ports from running containers\n// WHY: avoid false \"free port\" results when Docker reserves ports without userland proxy sockets\n// QUOTE(ТЗ): \"а не сражаться за старый\"\n// REF: user-request-2026-02-19-port-allocation\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: published_by_running_container(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<number>, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: output ports are unique\n// COMPLEXITY: O(command + |stdout|)\nexport const runDockerPsPublishedHostPorts = (\n cwd: string\n): Effect.Effect<ReadonlyArray<number>, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"ps\", \"--format\", \"{{.Ports}}\"]\n },\n [Number(ExitCode(0))],\n (exitCode) => new CommandFailedError({ command: \"docker ps\", exitCode })\n ),\n Effect.map((output) => parseDockerPublishedHostPorts(output))\n )\n","import { deriveRepoPathParts } from \"./domain.js\"\n\nexport type DockerNetworkConfig = {\n readonly subnet: string\n readonly ipAddress: string\n}\n\nconst hashRepoSeed = (value: string): number => {\n let hash = 0x81_1C_9D_C5\n for (const char of value) {\n hash ^= char.codePointAt(0) ?? 0\n hash = Math.imul(hash, 0x01_00_01_93)\n }\n return hash >>> 0\n}\n\n// CHANGE: derive a stable docker DNS hostname from repo URL\n// WHY: allow consistent per-project DNS aliases\n// QUOTE(ТЗ): \"docker.{dns}:port\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: dns(url) is deterministic\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: hostname always begins with docker.\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveDockerDnsName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl).pathParts\n return [\"docker\", ...parts].join(\".\")\n}\n\n// CHANGE: derive a stable docker subnet + IP for per-project isolation\n// WHY: avoid port conflicts by giving each container a unique IP\n// QUOTE(ТЗ): \"У каждого контейнера свой IP т.е свой домен\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: net(url) is deterministic\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: subnet in 172.20.0.0/16..172.31.0.0/16, IP host in [10,209]\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveDockerNetworkConfig = (repoUrl: string): DockerNetworkConfig => {\n const hash = hashRepoSeed(repoUrl)\n const subnetA = 20 + (hash % 12)\n const subnetB = (hash >>> 8) & 0xFF\n const hostOctet = 10 + ((hash >>> 16) % 200)\n const subnet = `172.${subnetA}.${subnetB}.0/24`\n const ipAddress = `172.${subnetA}.${subnetB}.${hostOctet}`\n return { subnet, ipAddress }\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nimport { deriveDockerDnsName } from \"../core/docker-network.js\"\nimport { runDockerInspectContainerIp } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\n\n// CHANGE: register docker.<org>.<repo> hostname for the project\n// WHY: allow accessing container services via stable DNS\n// QUOTE(ТЗ): \"docker.{dns}:port\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall h: ensure(h) -> hosts(h)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem>\n// INVARIANT: adds entry once, idempotent\n// COMPLEXITY: O(n) where n = |/etc/hosts|\nexport const ensureDockerDnsHost = (\n cwd: string,\n containerName: string,\n repoUrl: string\n): Effect.Effect<\n void,\n DockerCommandError | PlatformError,\n FileSystem.FileSystem | CommandExecutor.CommandExecutor\n> => {\n const addHost = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const hostName = deriveDockerDnsName(repoUrl)\n const hostsPath = \"/etc/hosts\"\n const ipAddress = yield* _(runDockerInspectContainerIp(cwd, containerName))\n if (ipAddress.length === 0) {\n yield* _(Effect.logWarning(`Docker IP not available for ${containerName}; skipping DNS entry.`))\n return\n }\n const current = yield* _(fs.readFileString(hostsPath))\n if (current.includes(` ${hostName}`) || current.includes(`\\t${hostName}`)) {\n return\n }\n const next = `${current.trimEnd()}\\n${ipAddress} ${hostName}\\n`\n yield* _(fs.writeFileString(hostsPath, next))\n yield* _(Effect.log(`DNS alias added: ${hostName} -> ${ipAddress}`))\n })\n\n return Effect.match(addHost, {\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to update /etc/hosts for docker DNS: ${error instanceof Error ? error.message : String(error)}`\n ).pipe(Effect.asVoid),\n onSuccess: () => Effect.void\n })\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nimport { deriveDockerDnsName } from \"../core/docker-network.js\"\nimport type { CreateCommand } from \"../core/domain.js\"\nimport { runDockerInspectContainerIp } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\nimport { ensureDockerDnsHost } from \"./docker-dns.js\"\n\n// CHANGE: log docker DNS alias for the created project\n// WHY: surface the hostname users can use for container services\n// QUOTE(ТЗ): \"пусть ещё и отображает домен через который к нему можно обратиться\"\n// REF: user-request-2026-01-30-dns-log\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg: log(cfg) -> dns_alias(cfg)\n// PURITY: CORE\n// EFFECT: Effect<void, never, never>\n// INVARIANT: hostname is deterministic for repoUrl\n// COMPLEXITY: O(1)\nexport const logDockerDnsAccess = (config: CreateCommand[\"config\"]): Effect.Effect<void> =>\n Effect.log(`Docker DNS: ${deriveDockerDnsName(config.repoUrl)}`)\n\n// CHANGE: log container IP for direct access\n// WHY: allow users to access services without host port mappings\n// QUOTE(ТЗ): \"Пусть будет обращение через IP контейнера\"\n// REF: user-request-2026-02-01-ip-access\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg: ip(cfg) -> reachable(ip, port)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: logs only if IP is available\n// COMPLEXITY: O(1)\nexport const logContainerIpAccess = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const ipAddress = yield* _(runDockerInspectContainerIp(cwd, config.containerName))\n if (ipAddress.length === 0) {\n yield* _(Effect.logWarning(`Container IP not available: ${config.containerName}`))\n return\n }\n yield* _(Effect.log(`Container IP: ${ipAddress}`))\n yield* _(Effect.log(`Use: http://${ipAddress}:<port>`))\n })\n\n// CHANGE: ensure docker DNS entry and log access info together\n// WHY: keep create flow compact without losing access hints\n// QUOTE(ТЗ): \"Он должен сразу показать доступы\"\n// REF: user-request-2026-02-05-access-info\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: up(c) → dns(c) ∧ ip(c)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, FileSystem | CommandExecutor>\n// INVARIANT: DNS entry is idempotent\n// COMPLEXITY: O(1)\nexport const logDockerAccessInfo = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<\n void,\n DockerCommandError | PlatformError,\n FileSystem.FileSystem | CommandExecutor.CommandExecutor\n> =>\n ensureDockerDnsHost(cwd, config.containerName, config.repoUrl).pipe(\n Effect.zipRight(logDockerDnsAccess(config)),\n Effect.zipRight(logContainerIpAccess(cwd, config))\n )\n","import { Match } from \"effect\"\n\nimport type { ParseError } from \"./domain.js\"\n\n// CHANGE: normalize parse errors into deterministic messages\n// WHY: reuse parse error formatting across CLI and server flows\n// QUOTE(ТЗ): \"ошибки должны быть описывающими\"\n// REF: user-request-2026-02-02-cli-split\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: format(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each ParseError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const formatParseError = (error: ParseError): string =>\n Match.value(error).pipe(\n Match.when({ _tag: \"UnknownCommand\" }, ({ command }) => `Unknown command: ${command}`),\n Match.when({ _tag: \"UnknownOption\" }, ({ option }) => `Unknown option: ${option}`),\n Match.when({ _tag: \"MissingOptionValue\" }, ({ option }) => `Missing value for option: ${option}`),\n Match.when({ _tag: \"MissingRequiredOption\" }, ({ option }) => `Missing required option: ${option}`),\n Match.when({ _tag: \"InvalidOption\" }, ({ option, reason }) => `Invalid option ${option}: ${reason}`),\n Match.when({ _tag: \"UnexpectedArgument\" }, ({ value }) => `Unexpected argument: ${value}`),\n Match.exhaustive\n )\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport { Match } from \"effect\"\nimport { type ParseError } from \"../core/domain.js\"\nimport { formatParseError } from \"../core/parse-errors.js\"\nimport type {\n AuthError,\n CloneFailedError,\n CommandFailedError,\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n InputCancelledError,\n InputReadError,\n PortProbeError,\n ScrapArchiveInvalidError,\n ScrapArchiveNotFoundError,\n ScrapTargetDirUnsupportedError,\n ScrapWipeRefusedError\n} from \"../shell/errors.js\"\n\nexport type AppError =\n | ParseError\n | FileExistsError\n | CloneFailedError\n | DockerAccessError\n | DockerCommandError\n | ConfigNotFoundError\n | ConfigDecodeError\n | ScrapArchiveInvalidError\n | ScrapArchiveNotFoundError\n | ScrapTargetDirUnsupportedError\n | ScrapWipeRefusedError\n | InputCancelledError\n | InputReadError\n | PortProbeError\n | AuthError\n | CommandFailedError\n | PlatformError\n\ntype NonParseError = Exclude<AppError, ParseError>\n\nconst isParseError = (error: AppError): error is ParseError =>\n error._tag === \"UnknownCommand\" ||\n error._tag === \"UnknownOption\" ||\n error._tag === \"MissingOptionValue\" ||\n error._tag === \"MissingRequiredOption\" ||\n error._tag === \"InvalidOption\" ||\n error._tag === \"UnexpectedArgument\"\n\nconst renderDockerAccessHeadline = (issue: DockerAccessError[\"issue\"]): string =>\n issue === \"PermissionDenied\"\n ? \"Cannot access Docker daemon socket: permission denied.\"\n : \"Cannot connect to Docker daemon.\"\n\nconst renderDockerAccessActionPlan = (issue: DockerAccessError[\"issue\"]): string => {\n const permissionDeniedPlan = [\n \"Action plan:\",\n \"1) In the same shell, run: `groups $USER` and make sure group `docker` is present.\",\n \"2) Re-login to refresh group memberships and run command again.\",\n \"3) If DOCKER_HOST is set to rootless socket, keep running: `export DOCKER_HOST=unix:///run/user/$UID/docker.sock`.\",\n \"4) If using a dedicated socket not in /run/user, set DOCKER_HOST explicitly and re-run.\",\n \"Tip: this app now auto-tries a rootless socket fallback on first permission error.\"\n ]\n\n const daemonUnavailablePlan = [\n \"Action plan:\",\n \"1) Check daemon status: `systemctl --user status docker` or `systemctl status docker`.\",\n \"2) Start daemon: `systemctl --user start docker` (or `systemctl start docker` for system Docker).\",\n \"3) Retry command in a new shell.\"\n ]\n\n return issue === \"PermissionDenied\" ? permissionDeniedPlan.join(\"\\n\") : daemonUnavailablePlan.join(\"\\n\")\n}\n\nconst renderPrimaryError = (error: NonParseError): string | null =>\n Match.value(error).pipe(\n Match.when({ _tag: \"FileExistsError\" }, ({ path }) => `File already exists: ${path} (use --force to overwrite)`),\n Match.when({ _tag: \"DockerCommandError\" }, ({ exitCode }) =>\n [\n `docker compose failed with exit code ${exitCode}`,\n \"Hint: ensure Docker daemon is running and current user can access /var/run/docker.sock (for example via the docker group).\",\n \"Hint: if output above contains 'port is already allocated', retry with a free SSH port via --ssh-port <port> (for example --ssh-port 2235), or stop the conflicting project/container.\",\n \"Hint: if output above contains 'all predefined address pools have been fully subnetted', run `docker network prune -f`, configure Docker `default-address-pools`, or use shared network mode (`--network-mode shared`).\"\n ].join(\"\\n\")),\n Match.when({ _tag: \"DockerAccessError\" }, ({ details, issue }) =>\n [\n renderDockerAccessHeadline(issue),\n \"Hint: ensure Docker daemon is running and current user can access the docker socket.\",\n \"Hint: if you use rootless Docker, set DOCKER_HOST to your user socket (for example unix:///run/user/$UID/docker.sock).\",\n renderDockerAccessActionPlan(issue),\n `Details: ${details}`\n ].join(\"\\n\")),\n Match.when({ _tag: \"CloneFailedError\" }, ({ repoRef, repoUrl, targetDir }) =>\n `Clone failed for ${repoUrl} (${repoRef}) into ${targetDir}`),\n Match.when({ _tag: \"PortProbeError\" }, ({ message, port }) =>\n `SSH port check failed for ${port}: ${message}`),\n Match.when(\n { _tag: \"CommandFailedError\" },\n ({ command, exitCode }) => `${command} failed with exit code ${exitCode}`\n ),\n Match.when(\n { _tag: \"ScrapArchiveNotFoundError\" },\n ({ path }) => `Scrap archive not found: ${path} (run docker-git scrap export first)`\n ),\n Match.when(\n { _tag: \"ScrapArchiveInvalidError\" },\n ({ message, path }) => `Invalid scrap archive: ${path}\\nDetails: ${message}`\n ),\n Match.when({ _tag: \"ScrapTargetDirUnsupportedError\" }, ({ reason, targetDir }) =>\n [\n `Cannot use scrap with targetDir ${targetDir}.`,\n `Reason: ${reason}`,\n `Hint: scrap currently supports workspaces under the ssh home directory only (for example: ~/repo).`\n ].join(\"\\n\")),\n Match.when({ _tag: \"ScrapWipeRefusedError\" }, ({ reason, targetDir }) =>\n [\n `Refusing to wipe workspace for scrap import (targetDir ${targetDir}).`,\n `Reason: ${reason}`,\n \"Hint: re-run with --no-wipe, or set a narrower --target-dir when creating the project.\"\n ].join(\"\\n\")),\n Match.when({ _tag: \"AuthError\" }, ({ message }) => message),\n Match.orElse(() => null)\n )\n\nconst renderConfigError = (error: NonParseError): string | null => {\n if (error._tag === \"ConfigNotFoundError\") {\n return `docker-git.json not found: ${error.path} (run docker-git create in that directory)`\n }\n\n if (error._tag === \"ConfigDecodeError\") {\n return `Invalid docker-git.json at ${error.path}: ${error.message}`\n }\n\n return null\n}\n\nconst renderInputError = (error: NonParseError): string | null => {\n if (error._tag === \"InputCancelledError\") {\n return \"Input cancelled.\"\n }\n\n if (error._tag === \"InputReadError\") {\n return `Input error: ${error.message}`\n }\n\n return null\n}\n\nconst renderNonParseError = (error: NonParseError): string =>\n renderPrimaryError(error) ?? renderConfigError(error) ?? renderInputError(error) ?? error.message\n\n// CHANGE: render typed application errors into user-facing text\n// WHY: provide deterministic messaging for CLI and menu flows\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: render(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each AppError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const renderError = (error: AppError): string => {\n if (isParseError(error)) {\n return formatParseError(error)\n }\n\n return renderNonParseError(error)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { Effect } from \"effect\"\n\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"./command-runner.js\"\n\nexport type DockerVolume = {\n readonly hostPath: string\n readonly containerPath: string\n}\n\nexport type DockerAuthSpec = {\n readonly cwd: string\n readonly image: string\n readonly volume: DockerVolume\n readonly entrypoint?: string\n readonly env?: string | ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n readonly interactive: boolean\n}\n\nconst appendEnvArgs = (base: Array<string>, env: string | ReadonlyArray<string>) => {\n if (typeof env === \"string\") {\n const trimmed = env.trim()\n if (trimmed.length > 0) {\n base.push(\"-e\", trimmed)\n }\n return\n }\n for (const entry of env) {\n const trimmed = entry.trim()\n if (trimmed.length === 0) {\n continue\n }\n base.push(\"-e\", trimmed)\n }\n}\n\nconst buildDockerArgs = (spec: DockerAuthSpec): ReadonlyArray<string> => {\n const base: Array<string> = [\"run\", \"--rm\"]\n if (spec.interactive) {\n base.push(\"-it\")\n }\n if (spec.entrypoint && spec.entrypoint.length > 0) {\n base.push(\"--entrypoint\", spec.entrypoint)\n }\n base.push(\"-v\", `${spec.volume.hostPath}:${spec.volume.containerPath}`)\n if (spec.env !== undefined) {\n appendEnvArgs(base, spec.env)\n }\n return [...base, spec.image, ...spec.args]\n}\n\n// CHANGE: expose docker CLI args builder for advanced auth flows (stdin piping)\n// WHY: some OAuth CLIs (Claude Code) don't reliably render their input UI; docker-git needs to drive stdin explicitly\n// REF: issue-61\n// SOURCE: n/a\n// PURITY: CORE\n// INVARIANT: args match those used by runDockerAuth / runDockerAuthCapture\nexport const buildDockerAuthArgs = (spec: DockerAuthSpec): ReadonlyArray<string> => buildDockerArgs(spec)\n\n// CHANGE: run a docker auth command with controlled exit codes\n// WHY: reuse container auth flow for gh/codex\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) in ok -> success\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError | E, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuth = <E>(\n spec: DockerAuthSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<void, E | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n { cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) },\n okExitCodes,\n onFailure\n )\n\n// CHANGE: run a docker auth command and capture stdout\n// WHY: obtain tokens from container auth flows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: capture(cmd) -> stdout\n// PURITY: SHELL\n// EFFECT: Effect<string, PlatformError | E, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuthCapture = <E>(\n spec: DockerAuthSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<string, E | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n { cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) },\n okExitCodes,\n onFailure\n )\n\n// CHANGE: run a docker auth command and return the exit code\n// WHY: allow status checks without throwing\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) = n\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuthExitCode = (\n spec: DockerAuthSpec\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({ cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) })\n","import { trimLeftChar, trimRightChar } from \"../core/strings.js\"\nimport type { DockerAuthSpec } from \"../shell/docker-auth.js\"\n\ntype DockerAuthSpecInput = {\n readonly cwd: string\n readonly image: string\n readonly hostPath: string\n readonly containerPath: string\n readonly entrypoint?: string\n readonly env?: string | ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n readonly interactive: boolean\n}\n\n// CHANGE: normalize auth account labels for filesystem paths\n// WHY: ensure consistent directory names across auth providers\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: label(l) -> normalized(l)\n// PURITY: CORE\n// INVARIANT: output is lowercase with hyphen separators\n// COMPLEXITY: O(n)\nexport const normalizeAccountLabel = (value: string | null, fallback: string): string => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return fallback\n }\n const normalized = trimmed.toLowerCase().replaceAll(/[^a-z0-9]+/g, \"-\")\n const withoutLeading = trimLeftChar(normalized, \"-\")\n const cleaned = trimRightChar(withoutLeading, \"-\")\n return cleaned.length > 0 ? cleaned : fallback\n}\n\n// CHANGE: build docker auth specs from common inputs\n// WHY: avoid duplication in gh/codex auth flows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall i: spec(i) -> dockerAuthSpec(i)\n// PURITY: CORE\n// INVARIANT: volume host/container paths are preserved\n// COMPLEXITY: O(1)\nexport const buildDockerAuthSpec = (input: DockerAuthSpecInput): DockerAuthSpec => ({\n cwd: input.cwd,\n image: input.image,\n volume: { hostPath: input.hostPath, containerPath: input.containerPath },\n ...(typeof input.entrypoint === \"string\" ? { entrypoint: input.entrypoint } : {}),\n ...(input.env === undefined ? {} : { env: input.env }),\n args: input.args,\n interactive: input.interactive\n})\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype EnvEntry = {\n readonly key: string\n readonly value: string\n}\n\nconst splitLines = (input: string): ReadonlyArray<string> =>\n input.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\").split(\"\\n\")\n\nconst joinLines = (lines: ReadonlyArray<string>): string => lines.join(\"\\n\")\n\nconst normalizeEnvText = (input: string): string => {\n const normalized = joinLines(splitLines(input))\n return normalized.endsWith(\"\\n\") ? normalized : `${normalized}\\n`\n}\n\nconst isAlpha = (char: string): boolean => {\n const code = char.codePointAt(0) ?? 0\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122)\n}\n\nconst isDigit = (char: string): boolean => {\n const code = char.codePointAt(0) ?? 0\n return code >= 48 && code <= 57\n}\n\nconst isValidFirstChar = (char: string): boolean => isAlpha(char) || char === \"_\"\n\nconst isValidEnvChar = (char: string): boolean => isAlpha(char) || isDigit(char) || char === \"_\"\n\nconst hasOnlyValidChars = (value: string): boolean => {\n for (const char of value) {\n if (!isValidEnvChar(char)) {\n return false\n }\n }\n return true\n}\n\nconst isEnvKey = (value: string): boolean => {\n if (value.length === 0) {\n return false\n }\n const first = value[0] ?? \"\"\n if (!isValidFirstChar(first)) {\n return false\n }\n return hasOnlyValidChars(value.slice(1))\n}\n\nconst parseEnvLine = (line: string): EnvEntry | null => {\n const trimmed = line.trim()\n if (trimmed.length === 0 || trimmed.startsWith(\"#\")) {\n return null\n }\n const raw = trimmed.startsWith(\"export \") ? trimmed.slice(\"export \".length).trimStart() : trimmed\n const eqIndex = raw.indexOf(\"=\")\n if (eqIndex <= 0) {\n return null\n }\n const key = raw.slice(0, eqIndex).trim()\n if (!isEnvKey(key)) {\n return null\n }\n const value = raw.slice(eqIndex + 1).trim()\n return { key, value }\n}\n\n// CHANGE: parse env file contents into key/value entries\n// WHY: allow updating shared auth env deterministically\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: parse(t) -> entries(t)\n// PURITY: CORE\n// INVARIANT: only valid KEY=VALUE lines are emitted\n// COMPLEXITY: O(n) where n = |lines|\nexport const parseEnvEntries = (input: string): ReadonlyArray<EnvEntry> => {\n const entries: Array<EnvEntry> = []\n for (const line of splitLines(input)) {\n const parsed = parseEnvLine(line)\n if (parsed) {\n entries.push(parsed)\n }\n }\n return entries\n}\n\n// CHANGE: resolve the latest value for an env key\n// WHY: support label-based lookups without allocating full entry lists\n// QUOTE(ТЗ): \"токенов может быть милион ... без хардкода\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall s,k: value(s,k) = last_assignment(s,k) | null\n// PURITY: CORE\n// INVARIANT: ignores commented/invalid lines and empty assignments\n// COMPLEXITY: O(n) where n = |lines|\nexport const findEnvValue = (input: string, key: string): string | null => {\n const trimmedKey = key.trim()\n if (trimmedKey.length === 0) {\n return null\n }\n const lines = splitLines(input)\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const parsed = parseEnvLine(lines[i] ?? \"\")\n if (parsed && parsed.key === trimmedKey) {\n const value = parsed.value.trim()\n return value.length > 0 ? value : null\n }\n }\n return null\n}\n\n// CHANGE: upsert a key in env contents\n// WHY: update tokens without manual edits\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall k,v: upsert(k,v) -> env(k)=v\n// PURITY: CORE\n// INVARIANT: env ends with newline\n// COMPLEXITY: O(n) where n = |lines|\nexport const upsertEnvKey = (input: string, key: string, value: string): string => {\n const sanitized = normalizeEnvText(input)\n const lines = splitLines(sanitized)\n const trimmedKey = key.trim()\n const cleaned = trimmedKey.length === 0 ? lines : lines.filter((line) => {\n const parsed = parseEnvLine(line)\n return parsed ? parsed.key !== trimmedKey : true\n })\n\n if (trimmedKey.length === 0 || value.trim().length === 0) {\n return normalizeEnvText(joinLines(cleaned))\n }\n\n return normalizeEnvText(joinLines([...cleaned, `${trimmedKey}=${value}`]))\n}\n\n// CHANGE: remove a key from env contents\n// WHY: allow token revocation\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall k: remove(k) -> !env(k)\n// PURITY: CORE\n// INVARIANT: env ends with newline\n// COMPLEXITY: O(n) where n = |lines|\nexport const removeEnvKey = (input: string, key: string): string => upsertEnvKey(input, key, \"\")\n\nexport const defaultEnvContents = \"# docker-git env\\n# KEY=value\\n\"\n\n// CHANGE: ensure env file exists\n// WHY: persist auth tokens in a stable file\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: ensure(p) -> exists(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: parent directories are created\n// COMPLEXITY: O(1)\nexport const ensureEnvFile = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n envPath: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(envPath))\n if (exists) {\n return\n }\n yield* _(fs.makeDirectory(path.dirname(envPath), { recursive: true }))\n yield* _(fs.writeFileString(envPath, defaultEnvContents))\n })\n\n// CHANGE: read env file contents\n// WHY: list and update stored tokens\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: read(p) -> contents(p)\n// PURITY: SHELL\n// EFFECT: Effect<string, PlatformError, FileSystem>\n// INVARIANT: returns default contents for missing/invalid file\n// COMPLEXITY: O(n) where n = |file|\nexport const readEnvText = (\n fs: FileSystem.FileSystem,\n envPath: string\n): Effect.Effect<string, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(envPath))\n if (!exists) {\n return defaultEnvContents\n }\n const info = yield* _(fs.stat(envPath))\n if (info.type !== \"File\") {\n return defaultEnvContents\n }\n return yield* _(fs.readFileString(envPath))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nexport const resolveAuthorizedKeysPath = (\n path: Path.Path,\n baseDir: string,\n authorizedKeysPath: string\n): string =>\n path.isAbsolute(authorizedKeysPath)\n ? authorizedKeysPath\n : path.resolve(baseDir, authorizedKeysPath)\n\nconst resolveHomeDir = (): string | null => {\n const raw = process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"]\n const home = raw?.trim() ?? \"\"\n return home.length > 0 ? home : null\n}\n\nconst expandHome = (value: string, home: string | null): string => {\n if (home === null) {\n return value\n }\n if (value === \"~\") {\n return home\n }\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\n return `${home}${value.slice(1)}`\n }\n return value\n}\n\nconst trimTrailingSlash = (value: string): string => {\n let end = value.length\n while (end > 0) {\n const char = value[end - 1]\n if (char !== \"/\" && char !== \"\\\\\") {\n break\n }\n end -= 1\n }\n return value.slice(0, end)\n}\n\nexport const defaultProjectsRoot = (cwd: string): string => {\n const home = resolveHomeDir()\n const explicit = process.env[\"DOCKER_GIT_PROJECTS_ROOT\"]?.trim()\n if (explicit && explicit.length > 0) {\n return expandHome(explicit, home)\n }\n if (home !== null) {\n return `${trimTrailingSlash(home)}/.docker-git`\n }\n return `${cwd}/.docker-git`\n}\n\nconst normalizeRelativePath = (value: string): string =>\n value\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\")\n .trim()\n\nexport const resolvePathFromCwd = (\n path: Path.Path,\n cwd: string,\n targetPath: string\n): string =>\n path.isAbsolute(targetPath)\n ? targetPath\n : (() => {\n const projectsRoot = path.resolve(defaultProjectsRoot(cwd))\n const normalized = normalizeRelativePath(targetPath)\n if (normalized === \".docker-git\") {\n return projectsRoot\n }\n const prefix = \".docker-git/\"\n if (normalized.startsWith(prefix)) {\n return path.join(projectsRoot, normalized.slice(prefix.length))\n }\n return path.resolve(cwd, targetPath)\n })()\n\nexport const findExistingUpwards = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n startDir: string,\n fileName: string,\n maxDepth: number\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n let current = startDir\n\n for (let depth = 0; depth <= maxDepth; depth += 1) {\n const candidate = path.join(current, fileName)\n const exists = yield* _(fs.exists(candidate))\n if (exists) {\n return candidate\n }\n\n const parent = path.dirname(current)\n if (parent === current) {\n return null\n }\n\n current = parent\n }\n\n return null\n })\n\nexport const resolveEnvPath = (key: string): string | null => {\n const value = process.env[key]?.trim()\n return value && value.length > 0 ? value : null\n}\n\nexport const findExistingPath = (\n fs: FileSystem.FileSystem,\n candidate: string | null\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n candidate === null\n ? Effect.succeed(null)\n : Effect.flatMap(fs.exists(candidate), (exists) => (exists ? Effect.succeed(candidate) : Effect.succeed(null)))\n\nexport const findFirstExisting = (\n fs: FileSystem.FileSystem,\n candidates: ReadonlyArray<string>\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n for (const candidate of candidates) {\n const existing = yield* _(findExistingPath(fs, candidate))\n if (existing !== null) {\n return existing\n }\n }\n\n return null\n })\n\nexport type KeyLookupSpec = {\n readonly envVar: string\n readonly devKeyName: string\n readonly fallbackName?: string\n readonly homeCandidates: ReadonlyArray<string>\n}\n\nexport const findKeyByPriority = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string,\n spec: KeyLookupSpec\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const envPath = resolveEnvPath(spec.envVar)\n const envExisting = yield* _(findExistingPath(fs, envPath))\n if (envExisting !== null) {\n return envExisting\n }\n\n const devKey = yield* _(findExistingUpwards(fs, path, cwd, spec.devKeyName, 6))\n if (devKey !== null) {\n return devKey\n }\n\n if (spec.fallbackName !== undefined) {\n const fallback = yield* _(findExistingUpwards(fs, path, cwd, spec.fallbackName, 6))\n if (fallback !== null) {\n return fallback\n }\n }\n\n const home = resolveEnvPath(\"HOME\")\n if (home === null) {\n return null\n }\n\n return yield* _(\n findFirstExisting(\n fs,\n spec.homeCandidates.map((candidate) => path.join(home, \".ssh\", candidate))\n )\n )\n })\n\nconst authorizedKeysSpec: KeyLookupSpec = {\n envVar: \"DOCKER_GIT_AUTHORIZED_KEYS\",\n devKeyName: \"dev_ssh_key.pub\",\n fallbackName: \"authorized_keys\",\n homeCandidates: [\"id_ed25519.pub\", \"id_rsa.pub\"]\n}\n\nconst sshPrivateKeySpec: KeyLookupSpec = {\n envVar: \"DOCKER_GIT_SSH_KEY\",\n devKeyName: \"dev_ssh_key\",\n homeCandidates: [\"id_ed25519\", \"id_rsa\"]\n}\n\nconst makeKeyFinder = (spec: KeyLookupSpec) =>\n(\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n findKeyByPriority(fs, path, cwd, spec)\n\nexport const findAuthorizedKeysSource = makeKeyFinder(authorizedKeysSpec)\n\nexport const findSshPrivateKey = makeKeyFinder(sshPrivateKeySpec)\n","import * as Command from \"@effect/platform/Command\"\nimport type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\n\nexport type DockerImageSpec = {\n readonly imageName: string\n readonly imageDir: string\n readonly dockerfile: string\n readonly buildLabel: string\n}\n\n// CHANGE: ensure a docker image is available locally\n// WHY: auth flows must not depend on external registry access\n// QUOTE(ТЗ): \"чтобы всё работало и поднималось\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall i: ensure(i) -> image_exists(i)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: image name is stable for docker-git auth\n// COMPLEXITY: O(command)\nexport const ensureDockerImage = (\n fs: FileSystem,\n path: Path,\n cwd: string,\n spec: DockerImageSpec\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const imagePath = resolvePathFromCwd(path, cwd, spec.imageDir)\n const dockerfilePath = path.join(imagePath, \"Dockerfile\")\n const imageCheck = yield* _(\n pipe(\n Command.make(\"docker\", \"image\", \"inspect\", spec.imageName),\n Command.workingDirectory(cwd),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\"),\n Command.exitCode,\n Effect.map(Number)\n )\n )\n const dockerfileExists = yield* _(fs.exists(dockerfilePath))\n const dockerfileMatches = yield* _(\n dockerfileExists\n ? Effect.gen(function*(__) {\n const info = yield* __(fs.stat(dockerfilePath))\n if (info.type !== \"File\") {\n return false\n }\n const current = yield* __(fs.readFileString(dockerfilePath))\n return current === spec.dockerfile\n })\n : Effect.succeed(false)\n )\n if (imageCheck === 0 && dockerfileMatches) {\n return\n }\n\n yield* _(fs.makeDirectory(imagePath, { recursive: true }))\n yield* _(fs.writeFileString(dockerfilePath, spec.dockerfile))\n yield* _(Effect.log(`Building ${spec.buildLabel} image (${spec.imageName})...`))\n yield* _(\n runCommandWithExitCodes(\n { cwd, command: \"docker\", args: [\"build\", \"-t\", spec.imageName, imagePath] },\n [0],\n (exitCode) => new CommandFailedError({ command: `docker build (${spec.buildLabel})`, exitCode })\n )\n )\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport type { Effect } from \"effect\"\n\nimport type { CommandFailedError } from \"../shell/errors.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\n\nexport const ghAuthRoot = \".docker-git/.orch/auth/gh\"\nexport const ghAuthDir = \"/root/.config/gh\"\nexport const ghImageName = \"docker-git-auth-gh:latest\"\nexport const ghImageDir = \".docker-git/.orch/auth/gh/.image\"\n\nexport const renderGhDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends ca-certificates curl gnupg bsdutils \\\n && mkdir -p /etc/apt/keyrings \\\n && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\\n | gpg --dearmor -o /etc/apt/keyrings/githubcli-archive-keyring.gpg \\\n && chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \\\n && echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" \\\n > /etc/apt/sources.list.d/github-cli.list \\\n && apt-get update \\\n && apt-get install -y --no-install-recommends gh git \\\n && rm -rf /var/lib/apt/lists/*\nENTRYPOINT [\"gh\"]\n`\n\n// CHANGE: centralize gh auth image build for reuse\n// WHY: avoid duplicated docker image logic across gh workflows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: ∀l: ensure(l) → image_exists(gh)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: dockerfile content is stable\n// COMPLEXITY: O(command)\nexport const ensureGhAuthImage = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string,\n buildLabel: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n ensureDockerImage(fs, path, cwd, {\n imageName: ghImageName,\n imageDir: ghImageDir,\n dockerfile: renderGhDockerfile(),\n buildLabel\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype FsPathContext = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly cwd: string\n}\n\n// CHANGE: provide a shared FileSystem/Path context for usecases\n// WHY: avoid duplicated setup across shell workflows\n// QUOTE(ТЗ): \"минимальный корректный diff\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall run: ctx(run) -> fs,path,cwd\n// PURITY: SHELL\n// EFFECT: Effect<A, PlatformError, FileSystem | Path>\n// INVARIANT: cwd is captured once per call\n// COMPLEXITY: O(1)\nexport const withFsPathContext = <A, E, R>(\n run: (context: FsPathContext) => Effect.Effect<A, E, R>\n): Effect.Effect<A, E | PlatformError, R | FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n return yield* _(run({ fs, path, cwd: process.cwd() }))\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../core/domain.js\"\nimport { parseGithubRepoUrl } from \"../core/repo.js\"\nimport { runDockerAuthCapture } from \"../shell/docker-auth.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec } from \"./auth-helpers.js\"\nimport { parseEnvEntries, readEnvText } from \"./env-file.js\"\nimport { ensureGhAuthImage, ghAuthDir, ghAuthRoot, ghImageName } from \"./github-auth-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\ntype GithubForkRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveGithubToken = (envText: string): string | null => {\n const entries = parseEnvEntries(envText)\n const direct = entries.find((entry) => entry.key === \"GITHUB_TOKEN\" || entry.key === \"GH_TOKEN\")\n if (direct && direct.value.trim().length > 0) {\n return direct.value.trim()\n }\n const labeled = entries.find((entry) => entry.key.startsWith(\"GITHUB_TOKEN__\"))\n return labeled && labeled.value.trim().length > 0 ? labeled.value.trim() : null\n}\n\nconst runGhApiCapture = (\n cwd: string,\n hostPath: string,\n token: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthCapture(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath,\n containerPath: ghAuthDir,\n env: `GH_TOKEN=${token}`,\n args: [\"api\", ...args],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: `gh api ${args.join(\" \")}`, exitCode })\n ).pipe(Effect.map((raw) => raw.trim()))\n\nconst runGhApiCloneUrl = (\n cwd: string,\n hostPath: string,\n token: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCapture(cwd, hostPath, token, args).pipe(\n Effect.catchTag(\"CommandFailedError\", () => Effect.succeed(\"\")),\n Effect.map((raw) => (raw.length === 0 ? null : raw))\n )\n\nconst resolveViewerLogin = (\n cwd: string,\n hostPath: string,\n token: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const command = \"gh api /user --jq .login\"\n const raw = yield* _(runGhApiCapture(cwd, hostPath, token, [\"/user\", \"--jq\", \".login\"]))\n if (raw.length === 0) {\n return yield* _(Effect.fail(new CommandFailedError({ command, exitCode: 1 })))\n }\n return raw\n })\n\nconst resolveRepoCloneUrl = (\n cwd: string,\n hostPath: string,\n token: string,\n fullName: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCloneUrl(cwd, hostPath, token, [`/repos/${fullName}`, \"--jq\", \".clone_url\"])\n\nconst createFork = (\n cwd: string,\n hostPath: string,\n token: string,\n owner: string,\n repo: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCloneUrl(cwd, hostPath, token, [\n \"-X\",\n \"POST\",\n `/repos/${owner}/${repo}/forks`,\n \"--jq\",\n \".clone_url\"\n ])\n\n// CHANGE: resolve a fork URL for GitHub repos when a token is available\n// WHY: allow docker-git clone to auto-fork issue URLs for push access\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀r: github(r) ∧ token → fork(r)=url ∨ null\n// PURITY: SHELL\n// EFFECT: Effect<string | null, PlatformError | CommandFailedError, CommandExecutor>\n// INVARIANT: returns null when token or repo parsing is missing\n// COMPLEXITY: O(1) API calls\nexport const resolveGithubForkUrl = (\n repoUrl: string,\n envGlobalPath: string\n): Effect.Effect<string | null, PlatformError | CommandFailedError, GithubForkRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n const repo = parseGithubRepoUrl(repoUrl)\n if (!repo) {\n return null\n }\n const envPath = resolvePathFromCwd(path, cwd, envGlobalPath)\n const envText = yield* _(readEnvText(fs, envPath))\n const token = resolveGithubToken(envText)\n if (!token) {\n yield* _(Effect.logWarning(\"GitHub token missing; skipping auto-fork.\"))\n return null\n }\n const ghRoot = resolvePathFromCwd(path, cwd, ghAuthRoot)\n yield* _(fs.makeDirectory(ghRoot, { recursive: true }))\n yield* _(ensureGhAuthImage(fs, path, cwd, \"gh api\"))\n const viewer = yield* _(resolveViewerLogin(cwd, ghRoot, token))\n if (viewer.toLowerCase() === repo.owner.toLowerCase()) {\n return null\n }\n const forkFullName = `${viewer}/${repo.repo}`\n const existingFork = yield* _(resolveRepoCloneUrl(cwd, ghRoot, token, forkFullName))\n if (existingFork !== null) {\n return existingFork\n }\n return yield* _(createFork(cwd, ghRoot, token, repo.owner, repo.repo))\n })\n )\n\n// CHANGE: apply auto-fork URL to create configs when available\n// WHY: keep create flow small while enabling fork-aware remotes\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: fork(c) → config(c)=config(c)+forkUrl\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, never, FileSystem | Path | CommandExecutor>\n// INVARIANT: failures do not abort project creation\n// COMPLEXITY: O(1) API calls\nexport const applyGithubForkConfig = (\n config: CreateCommand[\"config\"]\n): Effect.Effect<CreateCommand[\"config\"], never, GithubForkRuntime> =>\n resolveGithubForkUrl(config.repoUrl, config.envGlobalPath).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Auto-fork failed; continuing without fork. (${error instanceof Error ? error.message : String(error)})`\n ).pipe(Effect.as(config)),\n onSuccess: (forkUrl) => Effect.succeed(forkUrl ? { ...config, forkRepoUrl: forkUrl } : config)\n })\n )\n","import type { ProjectConfig } from \"../core/domain.js\"\n\nexport { defaultProjectsRoot, findSshPrivateKey, resolveAuthorizedKeysPath } from \"./path-helpers.js\"\n\nexport const isRepoUrlInput = (input: string): boolean => {\n const trimmed = input.trim().toLowerCase()\n return trimmed.startsWith(\"http://\") ||\n trimmed.startsWith(\"https://\") ||\n trimmed.startsWith(\"ssh://\") ||\n trimmed.startsWith(\"git@\")\n}\n\nexport const formatConnectionInfo = (\n cwd: string,\n config: ProjectConfig,\n authorizedKeysPath: string,\n authorizedKeysExists: boolean,\n sshCommand: string\n): string =>\n `Project directory: ${cwd}\n` +\n `Container: ${config.template.containerName}\n` +\n `Service: ${config.template.serviceName}\n` +\n `SSH command: ${sshCommand}\n` +\n `Repo: ${config.template.repoUrl} (${config.template.repoRef})\n` +\n `Workspace: ${config.template.targetDir}\n` +\n `Authorized keys: ${authorizedKeysPath}${authorizedKeysExists ? \"\" : \" (missing)\"}\n` +\n `Env global: ${config.template.envGlobalPath}\n` +\n `Env project: ${config.template.envProjectPath}\n` +\n `Codex auth: ${config.template.codexAuthPath} -> ${config.template.codexHome}`\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype ResolvedContext = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly resolved: string\n}\n\nexport const resolveBaseDir = (\n baseDir: string\n): Effect.Effect<ResolvedContext, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const resolved = path.resolve(baseDir)\n\n return { fs, path, resolved }\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport { defaultTemplateConfig, type ProjectConfig } from \"../core/domain.js\"\nimport { ConfigDecodeError, ConfigNotFoundError } from \"./errors.js\"\nimport { resolveBaseDir } from \"./paths.js\"\n\nconst TemplateConfigSchema = Schema.Struct({\n containerName: Schema.String,\n serviceName: Schema.String,\n sshUser: Schema.String,\n sshPort: Schema.Number.pipe(Schema.int()),\n repoUrl: Schema.String,\n repoRef: Schema.String,\n gitTokenLabel: Schema.optional(Schema.String),\n codexAuthLabel: Schema.optional(Schema.String),\n claudeAuthLabel: Schema.optional(Schema.String),\n targetDir: Schema.String,\n volumeName: Schema.String,\n dockerGitPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.dockerGitPath\n }),\n authorizedKeysPath: Schema.String,\n envGlobalPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.envGlobalPath\n }),\n envProjectPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.envProjectPath\n }),\n codexAuthPath: Schema.String,\n codexSharedAuthPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.codexSharedAuthPath\n }),\n codexHome: Schema.String,\n dockerNetworkMode: Schema.optionalWith(Schema.Literal(\"shared\", \"project\"), {\n default: () => defaultTemplateConfig.dockerNetworkMode\n }),\n dockerSharedNetworkName: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.dockerSharedNetworkName\n }),\n enableMcpPlaywright: Schema.optionalWith(Schema.Boolean, {\n default: () => defaultTemplateConfig.enableMcpPlaywright\n }),\n pnpmVersion: Schema.String\n})\n\nconst ProjectConfigSchema = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n template: TemplateConfigSchema\n})\n\nconst ProjectConfigJsonSchema = Schema.parseJson(ProjectConfigSchema)\n\nconst decodeProjectConfig = (\n path: string,\n input: string\n): Effect.Effect<ProjectConfig, ConfigDecodeError> =>\n Either.match(ParseResult.decodeUnknownEither(ProjectConfigJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ConfigDecodeError({\n path,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n\n// CHANGE: read and decode docker-git.json from disk\n// WHY: keep unknown inputs at the boundary and validate with schema\n// QUOTE(ТЗ): \"интерфейс в котором можно авторизировать все что мы хотим иметь\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: decode(read(p)) = cfg -> cfg.schemaVersion = 1\n// PURITY: SHELL\n// EFFECT: Effect<ProjectConfig, ConfigNotFoundError | ConfigDecodeError | PlatformError, FileSystem | Path>\n// INVARIANT: unknown input never leaks past this boundary\n// COMPLEXITY: O(n) where n = |file|\nexport const readProjectConfig = (\n baseDir: string\n): Effect.Effect<\n ProjectConfig,\n ConfigNotFoundError | ConfigDecodeError | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(baseDir))\n const configPath = path.join(resolved, \"docker-git.json\")\n\n const exists = yield* _(fs.exists(configPath))\n if (!exists) {\n return yield* _(Effect.fail(new ConfigNotFoundError({ path: configPath })))\n }\n\n const contents = yield* _(fs.readFileString(configPath))\n return yield* _(decodeProjectConfig(configPath, contents))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype DockerGitConfigSearchState = {\n readonly stack: Array<string>\n readonly results: Array<string>\n}\n\nconst isDockerGitConfig = (entry: string): boolean => entry.endsWith(\"docker-git.json\")\n\nconst shouldSkipDir = (entry: string): boolean =>\n entry === \".git\" || entry === \".orch\" || entry === \".docker-git\" || entry === \".cache\"\n\nconst isNotFoundStatError = (error: PlatformError): boolean =>\n error._tag === \"SystemError\" && error.reason === \"NotFound\"\n\nconst processDockerGitEntry = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n dir: string,\n entry: string,\n state: DockerGitConfigSearchState\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n if (shouldSkipDir(entry)) {\n return\n }\n\n const resolved = path.join(dir, entry)\n const info = yield* _(\n fs.stat(resolved).pipe(\n Effect.catchTag(\"SystemError\", (error) =>\n isNotFoundStatError(error)\n ? Effect.succeed(null)\n : Effect.fail(error))\n )\n )\n if (info === null) {\n return\n }\n if (info.type === \"Directory\") {\n state.stack.push(resolved)\n return\n }\n\n if (info.type === \"File\" && isDockerGitConfig(entry)) {\n state.results.push(resolved)\n }\n }).pipe(Effect.asVoid)\n\nexport const findDockerGitConfigPaths = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n rootDir: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(rootDir))\n if (!exists) {\n return []\n }\n\n // Avoid traversing git metadata (projectsRoot can itself be a git repo).\n const results: Array<string> = []\n const stack: Array<string> = [rootDir]\n const state: DockerGitConfigSearchState = { stack, results }\n while (stack.length > 0) {\n const dir = stack.pop()\n if (dir === undefined) {\n break\n }\n\n const entries = yield* _(fs.readDirectory(dir))\n for (const entry of entries) {\n yield* _(processDockerGitEntry(fs, path, dir, entry, state))\n }\n }\n\n return results\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { ProjectConfig, TemplateConfig } from \"../core/domain.js\"\nimport { deriveRepoPathParts } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport type { ConfigDecodeError, ConfigNotFoundError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\nimport { renderError } from \"./errors.js\"\nimport { defaultProjectsRoot, formatConnectionInfo } from \"./menu-helpers.js\"\nimport { findSshPrivateKey, resolveAuthorizedKeysPath, resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\nconst sshOptions = \"-tt -Y -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\"\n\nexport type ProjectLoadError = PlatformError | ConfigNotFoundError | ConfigDecodeError\n\nexport const buildSshCommand = (\n config: TemplateConfig,\n sshKey: string | null\n): string =>\n sshKey === null\n ? `ssh ${sshOptions} -p ${config.sshPort} ${config.sshUser}@localhost`\n : `ssh -i ${sshKey} ${sshOptions} -p ${config.sshPort} ${config.sshUser}@localhost`\n\nexport type ProjectSummary = {\n readonly projectDir: string\n readonly config: ProjectConfig\n readonly sshCommand: string\n readonly authorizedKeysPath: string\n readonly authorizedKeysExists: boolean\n}\n\nexport type ProjectItem = {\n readonly projectDir: string\n readonly displayName: string\n readonly repoUrl: string\n readonly repoRef: string\n readonly containerName: string\n readonly serviceName: string\n readonly sshUser: string\n readonly sshPort: number\n readonly targetDir: string\n readonly sshCommand: string\n readonly sshKeyPath: string | null\n readonly authorizedKeysPath: string\n readonly authorizedKeysExists: boolean\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexHome: string\n}\n\nexport type ProjectStatus = {\n readonly projectDir: string\n readonly config: ProjectConfig\n}\n\ntype ComposePsRow = {\n readonly name: string\n readonly status: string\n readonly ports: string\n readonly image: string\n}\n\ntype ProjectBase = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly projectDir: string\n readonly config: ProjectConfig\n}\n\nconst loadProjectBase = (\n configPath: string\n): Effect.Effect<ProjectBase, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(configPath))\n const projectDir = path.dirname(resolved)\n const config = yield* _(readProjectConfig(projectDir))\n return { fs, path, projectDir, config }\n })\n\nconst findProjectConfigPaths = (\n projectsRoot: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) => findDockerGitConfigPaths(fs, path, path.resolve(projectsRoot)))\n\nexport const loadProjectSummary = (\n configPath: string,\n sshKey: string | null\n): Effect.Effect<ProjectSummary, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, fs, path, projectDir } = yield* _(loadProjectBase(configPath))\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(\n path,\n projectDir,\n config.template.authorizedKeysPath\n )\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshCommand = buildSshCommand(config.template, sshKey)\n\n return {\n projectDir,\n config,\n sshCommand,\n authorizedKeysPath: resolvedAuthorizedKeys,\n authorizedKeysExists: authExists\n }\n })\n\nexport const loadProjectStatus = (\n configPath: string\n): Effect.Effect<ProjectStatus, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, projectDir } = yield* _(loadProjectBase(configPath))\n return { projectDir, config }\n })\n\nexport const renderProjectSummary = (summary: ProjectSummary): string =>\n formatConnectionInfo(\n summary.projectDir,\n summary.config,\n summary.authorizedKeysPath,\n summary.authorizedKeysExists,\n summary.sshCommand\n )\n\nconst formatDisplayName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl)\n if (parts.pathParts.length > 0) {\n return parts.pathParts.join(\"/\")\n }\n return repoUrl\n}\n\nexport const loadProjectItem = (\n configPath: string,\n sshKey: string | null\n): Effect.Effect<ProjectItem, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, fs, path, projectDir } = yield* _(loadProjectBase(configPath))\n const template = config.template\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(path, projectDir, template.authorizedKeysPath)\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshCommand = buildSshCommand(template, sshKey)\n const displayName = formatDisplayName(template.repoUrl)\n\n return {\n projectDir,\n displayName,\n repoUrl: template.repoUrl,\n repoRef: template.repoRef,\n containerName: template.containerName,\n serviceName: template.serviceName,\n sshUser: template.sshUser,\n sshPort: template.sshPort,\n targetDir: template.targetDir,\n sshCommand,\n sshKeyPath: sshKey,\n authorizedKeysPath: resolvedAuthorizedKeys,\n authorizedKeysExists: authExists,\n envGlobalPath: resolvePathFromCwd(path, projectDir, template.envGlobalPath),\n envProjectPath: resolvePathFromCwd(path, projectDir, template.envProjectPath),\n codexAuthPath: resolvePathFromCwd(path, projectDir, template.codexAuthPath),\n codexHome: template.codexHome\n }\n })\n\nexport const renderProjectStatusHeader = (status: ProjectStatus): string => `Project: ${status.projectDir}`\n\nexport const skipWithWarning = <A>(configPath: string) => (error: ProjectLoadError) =>\n pipe(\n Effect.logWarning(`Skipping ${configPath}: ${renderError(error)}`),\n Effect.as<A | null>(null)\n )\n\nexport const forEachProjectStatus = <E, R>(\n configPaths: ReadonlyArray<string>,\n run: (status: ProjectStatus) => Effect.Effect<void, E, R>\n): Effect.Effect<void, E | PlatformError, R | FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n for (const configPath of configPaths) {\n const status = yield* _(\n loadProjectStatus(configPath).pipe(\n Effect.matchEffect({\n onFailure: skipWithWarning<ProjectStatus>(configPath),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (status === null) {\n continue\n }\n yield* _(run(status))\n }\n }).pipe(Effect.asVoid)\n\nconst normalizeCell = (value: string | undefined): string => value?.trim() ?? \"-\"\n\nconst parseComposeLine = (line: string): ComposePsRow => {\n const [name, status, ports, image] = line.split(\"\\t\")\n return {\n name: normalizeCell(name),\n status: normalizeCell(status),\n ports: normalizeCell(ports),\n image: normalizeCell(image)\n }\n}\n\nexport const parseComposePsOutput = (raw: string): ReadonlyArray<ComposePsRow> => {\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0)\n return lines.map((line) => parseComposeLine(line))\n}\n\nconst padRight = (value: string, width: number): string =>\n value.length >= width ? value : `${value}${\" \".repeat(width - value.length)}`\n\nexport const formatComposeRows = (entries: ReadonlyArray<ComposePsRow>): string => {\n if (entries.length === 0) {\n return \" status: not running\"\n }\n const nameWidth = Math.min(24, Math.max(...entries.map((row) => row.name.length), \"name\".length))\n const statusWidth = Math.min(28, Math.max(...entries.map((row) => row.status.length), \"status\".length))\n const portsWidth = Math.min(28, Math.max(...entries.map((row) => row.ports.length), \"ports\".length))\n const header = ` ${padRight(\"name\", nameWidth)} ${padRight(\"status\", statusWidth)} ${\n padRight(\"ports\", portsWidth)\n } image`\n const lines = entries.map((row) =>\n ` ${padRight(row.name, nameWidth)} ${padRight(row.status, statusWidth)} ${\n padRight(row.ports, portsWidth)\n } ${row.image}`\n )\n return [header, ...lines].join(\"\\n\")\n}\n\ntype ProjectIndex = {\n readonly projectsRoot: string\n readonly configPaths: ReadonlyArray<string>\n}\n\nexport const loadProjectIndex = (): Effect.Effect<\n ProjectIndex | null,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const projectsRoot = defaultProjectsRoot(process.cwd())\n const configPaths = yield* _(findProjectConfigPaths(projectsRoot))\n if (configPaths.length === 0) {\n yield* _(Effect.log(`No docker-git projects found in ${projectsRoot}`))\n return null\n }\n return { projectsRoot, configPaths }\n })\n\nexport const withProjectIndexAndSsh = <A, E, R>(\n run: (index: ProjectIndex, sshKey: string | null) => Effect.Effect<A, E, R>\n): Effect.Effect<A | null, PlatformError | E, FileSystem.FileSystem | Path.Path | R> =>\n pipe(\n loadProjectIndex(),\n Effect.flatMap((index) =>\n index === null\n ? Effect.succeed(null)\n : Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n return yield* _(run(index, sshKey))\n })\n )\n )\n","export const isTruthyEnv = (value: string): boolean => {\n const normalized = value.trim().toLowerCase()\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\"\n}\n\nexport const isFalsyEnv = (value: string): boolean => {\n const normalized = value.trim().toLowerCase()\n return normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\"\n}\n\nexport const autoSyncEnvKey = \"DOCKER_GIT_STATE_AUTO_SYNC\"\nexport const autoSyncStrictEnvKey = \"DOCKER_GIT_STATE_AUTO_SYNC_STRICT\"\n\nexport const defaultSyncMessage = \"chore(state): sync\"\n\nexport const isAutoSyncEnabled = (envValue: string | undefined, hasRemote: boolean): boolean => {\n if (envValue === undefined) {\n return hasRemote\n }\n if (envValue.trim().length === 0) {\n return hasRemote\n }\n if (isFalsyEnv(envValue)) {\n return false\n }\n if (isTruthyEnv(envValue)) {\n return true\n }\n // Non-empty values default to enabled.\n return true\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport { ExitCode } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect } from \"effect\"\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"../../shell/command-runner.js\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\n\nexport const successExitCode = Number(ExitCode(0))\n\nexport const gitBaseEnv: Readonly<Record<string, string>> = {\n // Avoid blocking on interactive credential prompts in CI / TUI contexts.\n GIT_TERMINAL_PROMPT: \"0\"\n}\n\nexport const git = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n { cwd, command: \"git\", args, env },\n [successExitCode],\n (exitCode) => new CommandFailedError({ command: `git ${args[0] ?? \"\"}`, exitCode })\n )\n\nexport const gitExitCode = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({ cwd, command: \"git\", args, env })\n\nexport const gitCapture = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n { cwd, command: \"git\", args, env },\n [successExitCode],\n (exitCode) => new CommandFailedError({ command: `git ${args[0] ?? \"\"}`, exitCode })\n )\n\nexport const isGitRepo = (root: string) =>\n Effect.map(gitExitCode(root, [\"rev-parse\", \"--is-inside-work-tree\"]), (exit) => exit === successExitCode)\n\nexport const hasOriginRemote = (root: string) =>\n Effect.map(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"]), (exit) => exit === successExitCode)\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { parseEnvEntries } from \"../env-file.js\"\nimport { gitBaseEnv } from \"./git-commands.js\"\n\nconst githubTokenKey = \"GITHUB_TOKEN\"\n\nconst githubHttpsRemoteRe = /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/\nconst githubSshRemoteRe = /^git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/\nconst githubSshUrlRemoteRe = /^ssh:\\/\\/git@github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/\n\ntype GithubRemoteParts = {\n readonly owner: string\n readonly repo: string\n}\n\nconst tryParseGithubRemoteParts = (originUrl: string): GithubRemoteParts | null => {\n const trimmed = originUrl.trim()\n const match = githubHttpsRemoteRe.exec(trimmed) ??\n githubSshRemoteRe.exec(trimmed) ??\n githubSshUrlRemoteRe.exec(trimmed)\n if (match === null) {\n return null\n }\n const owner = match[1] ?? \"\"\n const repo = match[2] ?? \"\"\n return owner.length > 0 && repo.length > 0 ? { owner, repo } : null\n}\n\nexport const tryBuildGithubCompareUrl = (\n originUrl: string,\n baseBranch: string,\n headBranch: string\n): string | null => {\n const parts = tryParseGithubRemoteParts(originUrl)\n if (parts === null) {\n return null\n }\n return `https://github.com/${parts.owner}/${parts.repo}/compare/${encodeURIComponent(baseBranch)}...${\n encodeURIComponent(headBranch)\n }?expand=1`\n}\n\nexport const isGithubHttpsRemote = (url: string): boolean => /^https:\\/\\/github\\.com\\//.test(url.trim())\n\nconst resolveTokenFromProcessEnv = (): string | null => {\n const github = process.env[\"GITHUB_TOKEN\"]\n if (github !== undefined) {\n const trimmed = github.trim()\n if (trimmed.length > 0) {\n return trimmed\n }\n }\n\n const gh = process.env[\"GH_TOKEN\"]\n if (gh !== undefined) {\n const trimmed = gh.trim()\n if (trimmed.length > 0) {\n return trimmed\n }\n }\n\n return null\n}\n\ntype EnvEntry = {\n readonly key: string\n readonly value: string\n}\n\nconst findTokenInEnvEntries = (entries: ReadonlyArray<EnvEntry>): string | null => {\n const directEntry = entries.find((e) => e.key === githubTokenKey)\n if (directEntry !== undefined) {\n const direct = directEntry.value.trim()\n if (direct.length > 0) {\n return direct\n }\n }\n\n const labeledEntry = entries.find((e) => e.key.startsWith(\"GITHUB_TOKEN__\"))\n if (labeledEntry !== undefined) {\n const labeled = labeledEntry.value.trim()\n if (labeled.length > 0) {\n return labeled\n }\n }\n\n return null\n}\n\nexport const resolveGithubToken = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<string | null, PlatformError> =>\n Effect.gen(function*(_) {\n const fromEnv = resolveTokenFromProcessEnv()\n if (fromEnv !== null) {\n return fromEnv\n }\n\n const candidates: ReadonlyArray<string> = [\n // Canonical layout: ~/.docker-git/.orch/env/global.env\n path.join(root, \".orch\", \"env\", \"global.env\"),\n // Legacy layout (kept for backward compatibility): ~/.docker-git/secrets/global.env\n path.join(root, \"secrets\", \"global.env\")\n ]\n\n for (const envPath of candidates) {\n const exists = yield* _(fs.exists(envPath))\n if (!exists) {\n continue\n }\n const text = yield* _(fs.readFileString(envPath))\n const token = findTokenInEnvEntries(parseEnvEntries(text))\n if (token !== null) {\n return token\n }\n }\n\n return null\n })\n\nexport type GitAuthEnv = Readonly<Record<string, string | undefined>>\n\nexport const withGithubAskpassEnv = <A, E, R>(\n token: string,\n use: (env: GitAuthEnv) => Effect.Effect<A, E, R>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | R> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const askpassPath = yield* _(fs.makeTempFileScoped({ prefix: \"docker-git-askpass-\" }))\n const contents = [\n \"#!/bin/sh\",\n \"case \\\"$1\\\" in\",\n \" *Username*) echo \\\"x-access-token\\\" ;;\",\n \" *Password*) echo \\\"${DOCKER_GIT_GITHUB_TOKEN}\\\" ;;\",\n \" *) echo \\\"${DOCKER_GIT_GITHUB_TOKEN}\\\" ;;\",\n \"esac\",\n \"\"\n ].join(\"\\n\")\n yield* _(fs.writeFileString(askpassPath, contents))\n yield* _(fs.chmod(askpassPath, 0o700))\n const env: GitAuthEnv = {\n ...gitBaseEnv,\n DOCKER_GIT_GITHUB_TOKEN: token,\n GIT_ASKPASS: askpassPath,\n GIT_ASKPASS_REQUIRE: \"force\"\n }\n return yield* _(use(env))\n })\n )\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nconst stateGitignoreMarker = \"# docker-git state repository\"\n\nconst legacySecretIgnorePatterns: ReadonlyArray<string> = [\n \"**/.orch/env/\",\n \"**/.orch/auth/\"\n]\n\nconst volatileCodexIgnorePatterns: ReadonlyArray<string> = [\n \"**/.orch/auth/codex/log/\",\n \"**/.orch/auth/codex/tmp/\",\n \"**/.orch/auth/codex/sessions/\",\n \"**/.orch/auth/codex/models_cache.json\"\n]\n\nconst repositoryCacheIgnorePatterns: ReadonlyArray<string> = [\n \".cache/git-mirrors/\",\n \".cache/packages/\"\n]\n\nconst defaultStateGitignore = [\n stateGitignoreMarker,\n \"# NOTE: this repo intentionally tracks EVERYTHING under the state dir, including .orch/env and .orch/auth.\",\n \"# Keep the remote private; treat it as sensitive infrastructure state.\",\n \"\",\n \"# Shared repository caches (do not commit)\",\n ...repositoryCacheIgnorePatterns,\n \"\",\n \"# Volatile Codex artifacts (do not commit)\",\n ...volatileCodexIgnorePatterns,\n \"\"\n].join(\"\\n\")\n\nconst normalizeGitignoreText = (text: string): string =>\n text\n .replaceAll(\"\\r\\n\", \"\\n\")\n .trim()\n\ntype MissingManagedPatterns = {\n readonly repositoryCache: ReadonlyArray<string>\n readonly volatileCodex: ReadonlyArray<string>\n}\n\nconst collectMissingManagedPatterns = (prevLines: ReadonlySet<string>): MissingManagedPatterns => ({\n repositoryCache: repositoryCacheIgnorePatterns.filter((p) => !prevLines.has(p)),\n volatileCodex: volatileCodexIgnorePatterns.filter((p) => !prevLines.has(p))\n})\n\nconst hasMissingManagedPatterns = (missing: MissingManagedPatterns): boolean =>\n missing.repositoryCache.length > 0 || missing.volatileCodex.length > 0\n\nconst appendManagedBlocks = (\n prev: string,\n missing: MissingManagedPatterns\n): string => {\n const blocks = [\n missing.repositoryCache.length > 0\n ? `# Shared repository caches (do not commit)\\n${missing.repositoryCache.join(\"\\n\")}`\n : \"\",\n missing.volatileCodex.length > 0\n ? `# Volatile Codex artifacts (do not commit)\\n${missing.volatileCodex.join(\"\\n\")}`\n : \"\"\n ].filter((block) => block.length > 0)\n return `${[prev.trimEnd(), ...blocks].join(\"\\n\\n\")}\\n`\n}\n\nexport const ensureStateGitignore = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const gitignorePath = path.join(root, \".gitignore\")\n const exists = yield* _(fs.exists(gitignorePath))\n if (!exists) {\n yield* _(fs.writeFileString(gitignorePath, defaultStateGitignore))\n return\n }\n\n const stat = yield* _(fs.stat(gitignorePath))\n if (stat.type !== \"File\") {\n yield* _(Effect.logWarning(`${gitignorePath} exists but is not a file; skipping`))\n return\n }\n\n const prev = yield* _(fs.readFileString(gitignorePath))\n const normalized = normalizeGitignoreText(prev)\n if (!normalized.startsWith(stateGitignoreMarker)) {\n return\n }\n\n // If the file is docker-git managed but still ignores secrets (legacy default), rewrite it.\n const prevLines = new Set(prev.replaceAll(\"\\r\", \"\").split(\"\\n\").map((l) => l.trimEnd()))\n const hasLegacySecretIgnores = legacySecretIgnorePatterns.some((p) => prevLines.has(p))\n if (hasLegacySecretIgnores) {\n yield* _(fs.writeFileString(gitignorePath, defaultStateGitignore))\n return\n }\n\n // Ensure managed ignore patterns exist; append any missing entries.\n const missing = collectMissingManagedPatterns(prevLines)\n if (!hasMissingManagedPatterns(missing)) {\n return\n }\n yield* _(fs.writeFileString(gitignorePath, appendManagedBlocks(prev, missing)))\n })\n","// CHANGE: standardize docker-git prompt script for interactive shells\n// WHY: keep prompt consistent between Dockerfile and entrypoint\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: script is deterministic\n// COMPLEXITY: O(1)\nconst dockerGitPromptScript = `docker_git_branch() { git rev-parse --abbrev-ref HEAD 2>/dev/null; }\ndocker_git_short_pwd() {\n local full_path\n full_path=\"\\${PWD:-}\"\n if [[ -z \"$full_path\" ]]; then\n printf \"%s\" \"?\"\n return\n fi\n\n local display=\"$full_path\"\n if [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME\" ]]; then\n display=\"~\"\n elif [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME/\"* ]]; then\n display=\"~/\\${full_path#$HOME/}\"\n fi\n\n if [[ \"$display\" == \"~\" || \"$display\" == \"/\" ]]; then\n printf \"%s\" \"$display\"\n return\n fi\n\n local prefix=\"\"\n local body=\"$display\"\n if [[ \"$body\" == \"~/\"* ]]; then\n prefix=\"~/\"\n body=\"\\${body#~/}\"\n elif [[ \"$body\" == /* ]]; then\n prefix=\"/\"\n body=\"\\${body#/}\"\n fi\n\n local result=\"$prefix\"\n local segment=\"\"\n local rest=\"$body\"\n while [[ \"$rest\" == */* ]]; do\n segment=\"\\${rest%%/*}\"\n rest=\"\\${rest#*/}\"\n if [[ -n \"$segment\" ]]; then\n result+=\"\\${segment:0:1}/\"\n fi\n done\n\n if [[ -n \"$rest\" ]]; then\n result+=\"$rest\"\n elif [[ \"$result\" == \"~/\" ]]; then\n result=\"~\"\n elif [[ -z \"$result\" ]]; then\n result=\"/\"\n fi\n\n printf \"%s\" \"$result\"\n}\ndocker_git_prompt_apply() {\n local b\n b=\"$(docker_git_branch)\"\n local short_pwd\n short_pwd=\"$(docker_git_short_pwd)\"\n local base=\"[\\\\t] $short_pwd\"\n if [ -n \"$b\" ]; then\n PS1=\"\\${base} (\\${b})> \"\n else\n PS1=\"\\${base}> \"\n fi\n}\nif [ -n \"$PROMPT_COMMAND\" ]; then\n PROMPT_COMMAND=\"docker_git_prompt_apply;$PROMPT_COMMAND\"\nelse\n PROMPT_COMMAND=\"docker_git_prompt_apply\"\nfi`\n\nexport const renderPromptScript = (): string => dockerGitPromptScript\n\n// CHANGE: enable bash completion for interactive shells\n// WHY: allow tab completion for CLI tools in SSH terminals\n// QUOTE(ТЗ): \"А почему у меня не работает автодополенние в терминале?\"\n// REF: user-request-2026-02-05-bash-completion\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: completion(s) -> enabled(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: only runs when bash completion files exist\n// COMPLEXITY: O(1)\nexport const renderBashCompletionScript = (): string =>\n `if ! shopt -oq posix; then\n if [ -f /usr/share/bash-completion/bash_completion ]; then\n . /usr/share/bash-completion/bash_completion\n elif [ -f /etc/bash_completion ]; then\n . /etc/bash_completion\n fi\nfi`\n\n// CHANGE: enable bash history persistence and prefix search\n// WHY: keep command history between sessions and allow prefix-based navigation\n// QUOTE(ТЗ): \"Он не помнит прошлый вывод команд\"\n// REF: user-request-2026-02-05-bash-history\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: history(s) -> persisted(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: PROMPT_COMMAND preserves existing prompt logic\n// COMPLEXITY: O(1)\nexport const renderBashHistoryScript = (): string =>\n `if [ -n \"$BASH_VERSION\" ]; then\n case \"$-\" in\n *i*)\n HISTFILE=\"\\${HISTFILE:-$HOME/.bash_history}\"\n HISTSIZE=\"\\${HISTSIZE:-10000}\"\n HISTFILESIZE=\"\\${HISTFILESIZE:-20000}\"\n HISTCONTROL=\"\\${HISTCONTROL:-ignoredups:erasedups}\"\n export HISTFILE HISTSIZE HISTFILESIZE HISTCONTROL\n shopt -s histappend\n if [ -n \"\\${PROMPT_COMMAND-}\" ]; then\n PROMPT_COMMAND=\"history -a; \\${PROMPT_COMMAND}\"\n else\n PROMPT_COMMAND=\"history -a\"\n fi\n ;;\n esac\nfi`\n\n// CHANGE: add readline bindings for prefix history search\n// WHY: allow up/down arrows to search history by current prefix\n// QUOTE(ТЗ): \"если я писал cd ... то он должен запомнить и когда я напишу cd он мне предложит\"\n// REF: user-request-2026-02-05-inputrc\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: prefix(p) -> history_search(p)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: does not override user inputrc when already present\n// COMPLEXITY: O(1)\nexport const renderInputRc = (): string =>\n String.raw`set show-all-if-ambiguous on\nset completion-ignore-case on\n\"\\e[A\": history-search-backward\n\"\\e[B\": history-search-forward`\n\n// CHANGE: configure zsh with autosuggestions, history search, and non-noisy completion UX\n// WHY: avoid dumping completion candidates into the terminal scrollback on ambiguous prefixes\n// QUOTE(ТЗ): \"пусть будет zzh если он сделате то что я хочу\" | \"Почему при наборе текста он пишет в моём терминале какую-то билиберду?\"\n// REF: user-request-2026-02-05-zsh-autosuggest | user-request-2026-02-10-zsh-completion-noise\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in ZshInteractive: autosuggest(s) -> enabled(s) ∧ completion(s) -> non_noisy(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: zsh config does not depend on user dotfiles\n// COMPLEXITY: O(1)\nconst dockerGitZshConfig = `setopt PROMPT_SUBST\n\n# Terminal compatibility: if terminfo for $TERM is missing (common over SSH),\n# fall back to xterm-256color so ZLE doesn't garble the display.\nif command -v infocmp >/dev/null 2>&1; then\n if ! infocmp \"$TERM\" >/dev/null 2>&1; then\n export TERM=xterm-256color\n fi\nfi\n\nautoload -Uz compinit\ncompinit\n\n# Completion UX: cycle matches instead of listing them into scrollback.\nsetopt AUTO_MENU\nsetopt MENU_COMPLETE\nunsetopt AUTO_LIST\nunsetopt LIST_BEEP\n\n# Command completion ordering: prefer real commands/builtins over internal helper functions.\nzstyle ':completion:*' tag-order builtins commands aliases reserved-words functions\n\nautoload -Uz add-zsh-hook\ndocker_git_branch() { git rev-parse --abbrev-ref HEAD 2>/dev/null; }\ndocker_git_short_pwd() {\n local full_path=\"\\${PWD:-}\"\n if [[ -z \"$full_path\" ]]; then\n print -r -- \"?\"\n return\n fi\n\n local display=\"$full_path\"\n if [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME\" ]]; then\n display=\"~\"\n elif [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME/\"* ]]; then\n display=\"~/\\${full_path#$HOME/}\"\n fi\n\n if [[ \"$display\" == \"~\" || \"$display\" == \"/\" ]]; then\n print -r -- \"$display\"\n return\n fi\n\n local prefix=\"\"\n local body=\"$display\"\n if [[ \"$body\" == \"~/\"* ]]; then\n prefix=\"~/\"\n body=\"\\${body#~/}\"\n elif [[ \"$body\" == /* ]]; then\n prefix=\"/\"\n body=\"\\${body#/}\"\n fi\n\n local -a parts\n local result=\"$prefix\"\n parts=(\\${(s:/:)body})\n local total=\\${#parts[@]}\n local idx=1\n local part=\"\"\n for part in \"\\${parts[@]}\"; do\n if [[ -z \"$part\" ]]; then\n ((idx++))\n continue\n fi\n if (( idx < total )); then\n result+=\"\\${part[1,1]}/\"\n else\n result+=\"$part\"\n fi\n ((idx++))\n done\n\n if [[ -z \"$result\" ]]; then\n result=\"/\"\n elif [[ \"$result\" == \"~/\" ]]; then\n result=\"~\"\n fi\n\n print -r -- \"$result\"\n}\ndocker_git_prompt_apply() {\n local b\n b=\"$(docker_git_branch)\"\n local short_pwd\n short_pwd=\"$(docker_git_short_pwd)\"\n local base=\"[%*] $short_pwd\"\n if [[ -n \"$b\" ]]; then\n PROMPT=\"$base ($b)> \"\n else\n PROMPT=\"$base> \"\n fi\n}\nadd-zsh-hook precmd docker_git_prompt_apply\n\nHISTFILE=\"\\${HISTFILE:-$HOME/.zsh_history}\"\nHISTSIZE=\"\\${HISTSIZE:-10000}\"\nSAVEHIST=\"\\${SAVEHIST:-20000}\"\nsetopt HIST_IGNORE_ALL_DUPS\nsetopt SHARE_HISTORY\nsetopt INC_APPEND_HISTORY\n\nif [ -f \"$HISTFILE\" ]; then\n fc -R \"$HISTFILE\" 2>/dev/null || true\nfi\nif [ -f \"$HOME/.bash_history\" ] && [ \"$HISTFILE\" != \"$HOME/.bash_history\" ]; then\n fc -R \"$HOME/.bash_history\" 2>/dev/null || true\nfi\n\nbindkey '^[[A' history-search-backward\nbindkey '^[[B' history-search-forward\n\nif [[ \"\\${DOCKER_GIT_ZSH_AUTOSUGGEST:-1}\" == \"1\" ]] && [ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then\n # Suggest from history first, then fall back to completion (commands + paths).\n # This gives \"ghost text\" suggestions without needing to press <Tab>.\n ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE=\"\\${DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE:-fg=8,italic}\"\n if [[ -n \"\\${DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY-}\" ]]; then\n ZSH_AUTOSUGGEST_STRATEGY=(\\${=DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY})\n else\n ZSH_AUTOSUGGEST_STRATEGY=(history completion)\n fi\n source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh\nfi`\n\nexport const renderZshConfig = (): string => dockerGitZshConfig\n\n// CHANGE: add git branch info to interactive shell prompt\n// WHY: restore docker-git prompt with time + path + branch\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: only interactive shells source /etc/profile.d/zz-prompt.sh\n// COMPLEXITY: O(1)\nexport const renderDockerfilePrompt = (): string =>\n String.raw`# Shell prompt: show git branch for interactive sessions\nRUN cat <<'EOF' > /etc/profile.d/zz-prompt.sh\n${renderPromptScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-prompt.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-prompt.sh ]; then . /etc/profile.d/zz-prompt.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN cat <<'EOF' > /etc/profile.d/zz-bash-completion.sh\n${renderBashCompletionScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-bash-completion.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-bash-completion.sh ]; then . /etc/profile.d/zz-bash-completion.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN cat <<'EOF' > /etc/profile.d/zz-bash-history.sh\n${renderBashHistoryScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-bash-history.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-bash-history.sh ]; then . /etc/profile.d/zz-bash-history.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN mkdir -p /etc/zsh\nRUN cat <<'EOF' > /etc/zsh/zshrc\n${renderZshConfig()}\nEOF`\n\n// CHANGE: ensure the docker-git prompt is always available at runtime\n// WHY: --force rebuilds can reuse cached layers that left an empty prompt file\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: /etc/profile.d/zz-prompt.sh is non-empty after entrypoint\n// COMPLEXITY: O(1)\nexport const renderEntrypointPrompt = (): string =>\n String.raw`# Ensure docker-git prompt is configured for interactive shells\nPROMPT_PATH=\"/etc/profile.d/zz-prompt.sh\"\nif [[ ! -s \"$PROMPT_PATH\" ]]; then\n cat <<'EOF' > \"$PROMPT_PATH\"\n${renderPromptScript()}\nEOF\n chmod 0644 \"$PROMPT_PATH\"\nfi\nif ! grep -q \"zz-prompt.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-prompt.sh ]; then . /etc/profile.d/zz-prompt.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointBashCompletion = (): string =>\n String.raw`# Ensure bash completion is configured for interactive shells\nCOMPLETION_PATH=\"/etc/profile.d/zz-bash-completion.sh\"\nif [[ ! -s \"$COMPLETION_PATH\" ]]; then\n cat <<'EOF' > \"$COMPLETION_PATH\"\n${renderBashCompletionScript()}\nEOF\n chmod 0644 \"$COMPLETION_PATH\"\nfi\nif ! grep -q \"zz-bash-completion.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-bash-completion.sh ]; then . /etc/profile.d/zz-bash-completion.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointBashHistory = (): string =>\n String.raw`# Ensure bash history is configured for interactive shells\nHISTORY_PATH=\"/etc/profile.d/zz-bash-history.sh\"\nif [[ ! -s \"$HISTORY_PATH\" ]]; then\n cat <<'EOF' > \"$HISTORY_PATH\"\n${renderBashHistoryScript()}\nEOF\n chmod 0644 \"$HISTORY_PATH\"\nfi\nif ! grep -q \"zz-bash-history.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-bash-history.sh ]; then . /etc/profile.d/zz-bash-history.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointZshConfig = (): string =>\n String.raw`# Ensure zsh config exists for autosuggestions\nZSHRC_PATH=\"/etc/zsh/zshrc\"\nif [[ ! -s \"$ZSHRC_PATH\" ]]; then\n mkdir -p /etc/zsh\n cat <<'EOF' > \"$ZSHRC_PATH\"\n${renderZshConfig()}\nEOF\nfi`\n","import type { TemplateConfig } from \"../domain.js\"\nimport { renderInputRc } from \"../templates-prompt.js\"\n\nexport const renderEntrypointHeader = (config: TemplateConfig): string =>\n `#!/usr/bin/env bash\nset -euo pipefail\n\nREPO_URL=\"\\${REPO_URL:-}\"\nREPO_REF=\"\\${REPO_REF:-}\"\nFORK_REPO_URL=\"\\${FORK_REPO_URL:-}\"\nTARGET_DIR=\"\\${TARGET_DIR:-${config.targetDir}}\"\nif [[ \"$TARGET_DIR\" == \"~\" ]]; then\n TARGET_DIR=\"$HOME\"\nelif [[ \"$TARGET_DIR\" == \"~/\"* ]]; then\n TARGET_DIR=\"$HOME\\${TARGET_DIR:1}\"\nfi\nCLAUDE_AUTH_LABEL=\"\\${CLAUDE_AUTH_LABEL:-}\"\nCODEX_AUTH_LABEL=\"\\${CODEX_AUTH_LABEL:-}\"\nGIT_AUTH_USER=\"\\${GIT_AUTH_USER:-\\${GITHUB_USER:-x-access-token}}\"\nGIT_AUTH_TOKEN=\"\\${GIT_AUTH_TOKEN:-\\${GITHUB_TOKEN:-\\${GH_TOKEN:-}}}\"\nGH_TOKEN=\"\\${GH_TOKEN:-\\${GIT_AUTH_TOKEN:-}}\"\nGITHUB_TOKEN=\"\\${GITHUB_TOKEN:-\\${GH_TOKEN:-}}\"\nGIT_USER_NAME=\"\\${GIT_USER_NAME:-}\"\nGIT_USER_EMAIL=\"\\${GIT_USER_EMAIL:-}\"\nCODEX_AUTO_UPDATE=\"\\${CODEX_AUTO_UPDATE:-1}\"\nMCP_PLAYWRIGHT_ENABLE=\"\\${MCP_PLAYWRIGHT_ENABLE:-${config.enableMcpPlaywright ? \"1\" : \"0\"}}\"\nMCP_PLAYWRIGHT_CDP_ENDPOINT=\"\\${MCP_PLAYWRIGHT_CDP_ENDPOINT:-}\"\nMCP_PLAYWRIGHT_ISOLATED=\"\\${MCP_PLAYWRIGHT_ISOLATED:-1}\"\n\nSSH_ENV_PATH=\"/home/${config.sshUser}/.ssh/environment\"\n\ndocker_git_upsert_ssh_env() {\n local key=\"$1\"\n local value=\"$2\"\n\n if [[ -d \"$SSH_ENV_PATH\" ]]; then\n mv \"$SSH_ENV_PATH\" \"$SSH_ENV_PATH.bak-$(date +%s)\" || true\n fi\n\n mkdir -p \"$(dirname \"$SSH_ENV_PATH\")\"\n touch \"$SSH_ENV_PATH\"\n\n awk -v k=\"$key\" -F= '$1 != k { print }' \"$SSH_ENV_PATH\" > \"$SSH_ENV_PATH.tmp\"\n mv \"$SSH_ENV_PATH.tmp\" \"$SSH_ENV_PATH\"\n\n printf \"%s\\n\" \"$key=$value\" >> \"$SSH_ENV_PATH\"\n chmod 600 \"$SSH_ENV_PATH\" || true\n chown 1000:1000 \"$SSH_ENV_PATH\" || true\n}`\n\nexport const renderEntrypointPackageCache = (config: TemplateConfig): string =>\n `# Share package manager caches across all docker-git containers\nPACKAGE_CACHE_ROOT=\"/home/${config.sshUser}/.docker-git/.cache/packages\"\nPACKAGE_PNPM_STORE=\"\\${npm_config_store_dir:-\\${PNPM_STORE_DIR:-$PACKAGE_CACHE_ROOT/pnpm/store}}\"\nPACKAGE_NPM_CACHE=\"\\${npm_config_cache:-\\${NPM_CONFIG_CACHE:-$PACKAGE_CACHE_ROOT/npm}}\"\nPACKAGE_YARN_CACHE=\"\\${YARN_CACHE_FOLDER:-$PACKAGE_CACHE_ROOT/yarn}\"\n\nmkdir -p \"$PACKAGE_PNPM_STORE\" \"$PACKAGE_NPM_CACHE\" \"$PACKAGE_YARN_CACHE\"\nchown -R 1000:1000 \"$PACKAGE_CACHE_ROOT\" || true\n\ncat <<EOF > /etc/profile.d/docker-git-package-cache.sh\nexport PNPM_STORE_DIR=\"$PACKAGE_PNPM_STORE\"\nexport npm_config_store_dir=\"$PACKAGE_PNPM_STORE\"\nexport NPM_CONFIG_CACHE=\"$PACKAGE_NPM_CACHE\"\nexport npm_config_cache=\"$PACKAGE_NPM_CACHE\"\nexport YARN_CACHE_FOLDER=\"$PACKAGE_YARN_CACHE\"\nEOF\nchmod 0644 /etc/profile.d/docker-git-package-cache.sh\n\ndocker_git_upsert_ssh_env \"PNPM_STORE_DIR\" \"$PACKAGE_PNPM_STORE\"\ndocker_git_upsert_ssh_env \"npm_config_store_dir\" \"$PACKAGE_PNPM_STORE\"\ndocker_git_upsert_ssh_env \"NPM_CONFIG_CACHE\" \"$PACKAGE_NPM_CACHE\"\ndocker_git_upsert_ssh_env \"npm_config_cache\" \"$PACKAGE_NPM_CACHE\"\ndocker_git_upsert_ssh_env \"YARN_CACHE_FOLDER\" \"$PACKAGE_YARN_CACHE\"`\n\nexport const renderEntrypointAuthorizedKeys = (config: TemplateConfig): string =>\n `# 1) Authorized keys are mounted from host at /authorized_keys\nmkdir -p /home/${config.sshUser}/.ssh\nchmod 700 /home/${config.sshUser}/.ssh\n\nif [[ -f /authorized_keys ]]; then\n cp /authorized_keys /home/${config.sshUser}/.ssh/authorized_keys\n chmod 600 /home/${config.sshUser}/.ssh/authorized_keys\nfi\n\nchown -R 1000:1000 /home/${config.sshUser}/.ssh`\n\nexport const renderEntrypointDockerSocket = (config: TemplateConfig): string =>\n `# Ensure docker socket access for ${config.sshUser}\nif [[ -S /var/run/docker.sock ]]; then\n DOCKER_SOCK_GID=\"$(stat -c \"%g\" /var/run/docker.sock)\"\n DOCKER_GROUP=\"$(getent group \"$DOCKER_SOCK_GID\" | cut -d: -f1 || true)\"\n if [[ -z \"$DOCKER_GROUP\" ]]; then\n DOCKER_GROUP=\"docker\"\n groupadd -g \"$DOCKER_SOCK_GID\" \"$DOCKER_GROUP\" || true\n fi\n usermod -aG \"$DOCKER_GROUP\" ${config.sshUser} || true\n printf \"export DOCKER_HOST=unix:///var/run/docker.sock\\n\" > /etc/profile.d/docker-host.sh\nfi`\n\nexport const renderEntrypointZshShell = (config: TemplateConfig): string =>\n String.raw`# Prefer zsh for ${config.sshUser} when available\nif command -v zsh >/dev/null 2>&1; then\n usermod -s /usr/bin/zsh ${config.sshUser} || true\nfi`\n\nexport const renderEntrypointZshUserRc = (config: TemplateConfig): string =>\n String.raw`# Ensure ${config.sshUser} has a zshrc and disable newuser wizard\nZSHENV_PATH=\"/etc/zsh/zshenv\"\nif [[ -f \"$ZSHENV_PATH\" ]]; then\n if ! grep -q \"ZSH_DISABLE_NEWUSER_INSTALL\" \"$ZSHENV_PATH\"; then\n printf \"%s\\n\" \"export ZSH_DISABLE_NEWUSER_INSTALL=1\" >> \"$ZSHENV_PATH\"\n fi\nelse\n printf \"%s\\n\" \"export ZSH_DISABLE_NEWUSER_INSTALL=1\" > \"$ZSHENV_PATH\"\nfi\nUSER_ZSHRC=\"/home/${config.sshUser}/.zshrc\"\nif [[ ! -f \"$USER_ZSHRC\" ]]; then\n cat <<'EOF' > \"$USER_ZSHRC\"\n# docker-git default zshrc\nif [ -f /etc/zsh/zshrc ]; then\n source /etc/zsh/zshrc\nfi\nEOF\n chown 1000:1000 \"$USER_ZSHRC\" || true\nfi`\n\nexport const renderEntrypointInputRc = (config: TemplateConfig): string =>\n String.raw`# Ensure readline history search bindings for ${config.sshUser}\nINPUTRC_PATH=\"/home/${config.sshUser}/.inputrc\"\nif [[ ! -f \"$INPUTRC_PATH\" ]]; then\n cat <<'EOF' > \"$INPUTRC_PATH\"\n${renderInputRc()}\nEOF\n chown 1000:1000 \"$INPUTRC_PATH\" || true\nfi`\n\nexport const renderEntrypointBaseline = (): string =>\n `# 4.5) Snapshot baseline processes for terminal session filtering\nmkdir -p /run/docker-git\nBASELINE_PATH=\"/run/docker-git/terminal-baseline.pids\"\nif [[ ! -f \"$BASELINE_PATH\" ]]; then\n ps -eo pid= > \"$BASELINE_PATH\" || true\nfi`\n\nexport const renderEntrypointDisableMotd = (): string =>\n String.raw`# 4.75) Disable Ubuntu MOTD noise for SSH sessions\nPAM_SSHD=\"/etc/pam.d/sshd\"\nif [[ -f \"$PAM_SSHD\" ]]; then\n sed -i 's/^[[:space:]]*session[[:space:]]\\+optional[[:space:]]\\+pam_motd\\.so/#&/' \"$PAM_SSHD\" || true\n sed -i 's/^[[:space:]]*session[[:space:]]\\+optional[[:space:]]\\+pam_lastlog\\.so/#&/' \"$PAM_SSHD\" || true\nfi\n\n# Also disable sshd's own banners (e.g. \"Last login\")\nmkdir -p /etc/ssh/sshd_config.d || true\nDOCKER_GIT_SSHD_CONF=\"/etc/ssh/sshd_config.d/zz-docker-git-clean.conf\"\ncat <<'EOF' > \"$DOCKER_GIT_SSHD_CONF\"\nPrintMotd no\nPrintLastLog no\nEOF\nchmod 0644 \"$DOCKER_GIT_SSHD_CONF\" || true`\n\nexport const renderEntrypointSshd = (): string => `# 5) Run sshd in foreground\\nexec /usr/sbin/sshd -D`\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst claudeAuthRootContainerPath = (sshUser: string): string => `/home/${sshUser}/.docker-git/.orch/auth/claude`\n\nconst renderClaudeAuthConfig = (config: TemplateConfig): string =>\n String\n .raw`# Claude Code: expose CLAUDE_CONFIG_DIR for SSH sessions (OAuth cache lives under ~/.docker-git/.orch/auth/claude)\nCLAUDE_LABEL_RAW=\"$CLAUDE_AUTH_LABEL\"\nif [[ -z \"$CLAUDE_LABEL_RAW\" ]]; then\n CLAUDE_LABEL_RAW=\"default\"\nfi\n\nCLAUDE_LABEL_NORM=\"$(printf \"%s\" \"$CLAUDE_LABEL_RAW\" \\\n | tr '[:upper:]' '[:lower:]' \\\n | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//')\"\nif [[ -z \"$CLAUDE_LABEL_NORM\" ]]; then\n CLAUDE_LABEL_NORM=\"default\"\nfi\n\nCLAUDE_AUTH_ROOT=\"${claudeAuthRootContainerPath(config.sshUser)}\"\nCLAUDE_CONFIG_DIR=\"$CLAUDE_AUTH_ROOT/$CLAUDE_LABEL_NORM\"\nexport CLAUDE_CONFIG_DIR\n\nmkdir -p \"$CLAUDE_CONFIG_DIR\" || true\n\nCLAUDE_TOKEN_FILE=\"$CLAUDE_CONFIG_DIR/.oauth-token\"\ndocker_git_refresh_claude_oauth_token() {\n local token=\"\"\n if [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n token=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\n fi\n export CLAUDE_CODE_OAUTH_TOKEN=\"$token\"\n}\n\ndocker_git_refresh_claude_oauth_token`\n\nconst renderClaudeWrapperSetup = (): string =>\n String.raw`CLAUDE_REAL_BIN=\"/usr/local/bin/.docker-git-claude-real\"\nCLAUDE_WRAPPER_BIN=\"/usr/local/bin/claude\"\nif command -v claude >/dev/null 2>&1; then\n CURRENT_CLAUDE_BIN=\"$(command -v claude)\"\n if [[ \"$CURRENT_CLAUDE_BIN\" != \"$CLAUDE_REAL_BIN\" && ! -f \"$CLAUDE_REAL_BIN\" ]]; then\n mv \"$CURRENT_CLAUDE_BIN\" \"$CLAUDE_REAL_BIN\"\n fi\n if [[ -f \"$CLAUDE_REAL_BIN\" ]]; then\n cat <<'EOF' > \"$CLAUDE_WRAPPER_BIN\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nCLAUDE_REAL_BIN=\"/usr/local/bin/.docker-git-claude-real\"\nCLAUDE_CONFIG_DIR=\"${\"$\"}{CLAUDE_CONFIG_DIR:-$HOME/.claude}\"\nCLAUDE_TOKEN_FILE=\"$CLAUDE_CONFIG_DIR/.oauth-token\"\n\nif [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n CLAUDE_CODE_OAUTH_TOKEN=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\n export CLAUDE_CODE_OAUTH_TOKEN\nelse\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nfi\n\nexec \"$CLAUDE_REAL_BIN\" \"$@\"\nEOF\n chmod 0755 \"$CLAUDE_WRAPPER_BIN\" || true\n fi\nfi`\n\nconst renderClaudeProfileSetup = (): string =>\n String.raw`CLAUDE_PROFILE=\"/etc/profile.d/claude-config.sh\"\nprintf \"export CLAUDE_AUTH_LABEL=%q\\n\" \"$CLAUDE_AUTH_LABEL\" > \"$CLAUDE_PROFILE\"\nprintf \"export CLAUDE_CONFIG_DIR=%q\\n\" \"$CLAUDE_CONFIG_DIR\" >> \"$CLAUDE_PROFILE\"\ncat <<'EOF' >> \"$CLAUDE_PROFILE\"\nCLAUDE_TOKEN_FILE=\"${\"$\"}{CLAUDE_CONFIG_DIR:-$HOME/.claude}/.oauth-token\"\nif [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n export CLAUDE_CODE_OAUTH_TOKEN=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\nelse\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nfi\nEOF\nchmod 0644 \"$CLAUDE_PROFILE\" || true\n\ndocker_git_upsert_ssh_env \"CLAUDE_AUTH_LABEL\" \"$CLAUDE_AUTH_LABEL\"\ndocker_git_upsert_ssh_env \"CLAUDE_CONFIG_DIR\" \"$CLAUDE_CONFIG_DIR\"\ndocker_git_upsert_ssh_env \"CLAUDE_CODE_OAUTH_TOKEN\" \"$CLAUDE_CODE_OAUTH_TOKEN\"`\n\nexport const renderEntrypointClaudeConfig = (config: TemplateConfig): string =>\n [\n renderClaudeAuthConfig(config),\n renderClaudeWrapperSetup(),\n renderClaudeProfileSetup()\n ].join(\"\\n\\n\")\n","import type { TemplateConfig } from \"../domain.js\"\n\nexport const renderEntrypointCodexHome = (config: TemplateConfig): string =>\n `# Ensure Codex home exists if mounted\nmkdir -p ${config.codexHome}\nchown -R 1000:1000 ${config.codexHome}\n\n# Ensure home ownership matches the dev UID/GID (volumes may be stale)\nHOME_OWNER=\"$(stat -c \"%u:%g\" /home/${config.sshUser} 2>/dev/null || echo \"\")\"\nif [[ \"$HOME_OWNER\" != \"1000:1000\" ]]; then\n chown -R 1000:1000 /home/${config.sshUser} || true\nfi`\n\nexport const renderEntrypointCodexSharedAuth = (config: TemplateConfig): string =>\n `# Share Codex auth.json across projects (avoids refresh_token_reused)\nCODEX_SHARE_AUTH=\"\\${CODEX_SHARE_AUTH:-1}\"\nif [[ \"$CODEX_SHARE_AUTH\" == \"1\" ]]; then\n CODEX_LABEL_RAW=\"$CODEX_AUTH_LABEL\"\n if [[ -z \"$CODEX_LABEL_RAW\" ]]; then CODEX_LABEL_RAW=\"default\"; fi\n CODEX_LABEL_NORM=\"$(printf \"%s\" \"$CODEX_LABEL_RAW\" \\\n | tr '[:upper:]' '[:lower:]' \\\n | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//')\"\n if [[ -z \"$CODEX_LABEL_NORM\" ]]; then CODEX_LABEL_NORM=\"default\"; fi\n CODEX_AUTH_LABEL=\"$CODEX_LABEL_NORM\"\n CODEX_SHARED_HOME=\"${config.codexHome}-shared\"\n mkdir -p \"$CODEX_SHARED_HOME\"\n chown -R 1000:1000 \"$CODEX_SHARED_HOME\" || true\n AUTH_FILE=\"${config.codexHome}/auth.json\"\n SHARED_AUTH_FILE=\"$CODEX_SHARED_HOME/auth.json\"\n if [[ \"$CODEX_LABEL_NORM\" != \"default\" ]]; then\n SHARED_AUTH_FILE=\"$CODEX_SHARED_HOME/$CODEX_LABEL_NORM/auth.json\"\n mkdir -p \"$(dirname \"$SHARED_AUTH_FILE\")\"\n fi\n # Guard against a bad bind mount creating a directory at auth.json.\n if [[ -d \"$AUTH_FILE\" ]]; then\n mv \"$AUTH_FILE\" \"$AUTH_FILE.bak-$(date +%s)\" || true\n fi\n if [[ -e \"$AUTH_FILE\" && ! -L \"$AUTH_FILE\" ]]; then\n rm -f \"$AUTH_FILE\" || true\n fi\n ln -sf \"$SHARED_AUTH_FILE\" \"$AUTH_FILE\"\n docker_git_upsert_ssh_env \"CODEX_AUTH_LABEL\" \"$CODEX_AUTH_LABEL\"\nfi`\n\nconst entrypointMcpPlaywrightTemplate = String.raw`# Optional: configure Playwright MCP for Codex (browser automation)\nCODEX_CONFIG_FILE=\"__CODEX_HOME__/config.toml\"\n\n# Keep config.toml consistent with the container build.\n# If Playwright MCP is disabled for this container, remove the block so Codex\n# doesn't try (and fail) to spawn docker-git-playwright-mcp.\nif [[ \"$MCP_PLAYWRIGHT_ENABLE\" != \"1\" ]]; then\n if [[ -f \"$CODEX_CONFIG_FILE\" ]] && grep -q \"^\\[mcp_servers\\.playwright\" \"$CODEX_CONFIG_FILE\" 2>/dev/null; then\n awk '\n BEGIN { skip=0 }\n /^# docker-git: Playwright MCP/ { next }\n /^\\[mcp_servers[.]playwright([.]|\\])/ { skip=1; next }\n skip==1 && /^\\[/ { skip=0 }\n skip==0 { print }\n ' \"$CODEX_CONFIG_FILE\" > \"$CODEX_CONFIG_FILE.tmp\"\n mv \"$CODEX_CONFIG_FILE.tmp\" \"$CODEX_CONFIG_FILE\"\n fi\nelse\n if [[ ! -f \"$CODEX_CONFIG_FILE\" ]]; then\n mkdir -p \"$(dirname \"$CODEX_CONFIG_FILE\")\" || true\n cat <<'EOF' > \"$CODEX_CONFIG_FILE\"\n# docker-git codex config\nmodel = \"gpt-5.3-codex\"\nmodel_reasoning_effort = \"xhigh\"\npersonality = \"pragmatic\"\n\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\nweb_search = \"live\"\n\n[features]\nshell_snapshot = true\nmulti_agent = true\napps = true\nshell_tool = true\nEOF\n chown 1000:1000 \"$CODEX_CONFIG_FILE\" || true\n fi\n\n if [[ -z \"$MCP_PLAYWRIGHT_CDP_ENDPOINT\" ]]; then\n MCP_PLAYWRIGHT_CDP_ENDPOINT=\"http://__SERVICE_NAME__-browser:9223\"\n fi\n\n # Replace the docker-git Playwright block to allow upgrades via --force without manual edits.\n if grep -q \"^\\[mcp_servers\\.playwright\" \"$CODEX_CONFIG_FILE\" 2>/dev/null; then\n awk '\n BEGIN { skip=0 }\n /^# docker-git: Playwright MCP/ { next }\n /^\\[mcp_servers[.]playwright([.]|\\])/ { skip=1; next }\n skip==1 && /^\\[/ { skip=0 }\n skip==0 { print }\n ' \"$CODEX_CONFIG_FILE\" > \"$CODEX_CONFIG_FILE.tmp\"\n mv \"$CODEX_CONFIG_FILE.tmp\" \"$CODEX_CONFIG_FILE\"\n fi\n\n cat <<EOF >> \"$CODEX_CONFIG_FILE\"\n\n# docker-git: Playwright MCP (connects to Chromium via CDP)\n[mcp_servers.playwright]\ncommand = \"docker-git-playwright-mcp\"\nargs = []\nEOF\nfi`\n\nexport const renderEntrypointMcpPlaywright = (config: TemplateConfig): string =>\n entrypointMcpPlaywrightTemplate\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n .replaceAll(\"__SERVICE_NAME__\", config.serviceName)\n\nconst entrypointCodexResumeHintTemplate = `# Ensure codex resume hint is shown for interactive shells\nCODEX_HINT_PATH=\"/etc/profile.d/zz-codex-resume.sh\"\nif [[ ! -s \"$CODEX_HINT_PATH\" ]]; then\n cat <<'EOF' > \"$CODEX_HINT_PATH\"\ndocker_git_workspace_context_line() {\n REPO_REF_VALUE=\"\\${REPO_REF:-__REPO_REF_DEFAULT__}\"\n REPO_URL_VALUE=\"\\${REPO_URL:-__REPO_URL_DEFAULT__}\"\n\n if [[ \"$REPO_REF_VALUE\" == issue-* ]]; then\n ISSUE_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -E 's#^issue-##')\"\n ISSUE_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* ]]; then\n ISSUE_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$ISSUE_REPO_VALUE\" ]]; then\n ISSUE_URL_VALUE=\"https://github.com/$ISSUE_REPO_VALUE/issues/$ISSUE_ID_VALUE\"\n fi\n fi\n if [[ -n \"$ISSUE_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: issue #$ISSUE_ID_VALUE ($ISSUE_URL_VALUE)\"\n else\n printf \"%s\\n\" \"Контекст workspace: issue #$ISSUE_ID_VALUE\"\n fi\n return\n fi\n\n if [[ \"$REPO_REF_VALUE\" == refs/pull/*/head ]]; then\n PR_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -nE 's#^refs/pull/([0-9]+)/head$#\\\\1#p')\"\n PR_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* && -n \"$PR_ID_VALUE\" ]]; then\n PR_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$PR_REPO_VALUE\" ]]; then\n PR_URL_VALUE=\"https://github.com/$PR_REPO_VALUE/pull/$PR_ID_VALUE\"\n fi\n fi\n if [[ -n \"$PR_ID_VALUE\" && -n \"$PR_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: PR #$PR_ID_VALUE ($PR_URL_VALUE)\"\n elif [[ -n \"$PR_ID_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: PR #$PR_ID_VALUE\"\n elif [[ -n \"$REPO_REF_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: pull request ($REPO_REF_VALUE)\"\n fi\n return\n fi\n\n if [[ -n \"$REPO_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: $REPO_URL_VALUE\"\n fi\n}\n\ndocker_git_print_codex_resume_hint() {\n if [ -z \"\\${CODEX_RESUME_HINT_SHOWN-}\" ]; then\n DOCKER_GIT_CONTEXT_LINE=\"$(docker_git_workspace_context_line)\"\n if [[ -n \"$DOCKER_GIT_CONTEXT_LINE\" ]]; then\n echo \"$DOCKER_GIT_CONTEXT_LINE\"\n fi\n echo \"Старые сессии можно запустить с помощью codex resume или codex resume <id>, если знаешь айди.\"\n export CODEX_RESUME_HINT_SHOWN=1\n fi\n}\n\nif [ -n \"$BASH_VERSION\" ]; then\n case \"$-\" in\n *i*)\n docker_git_print_codex_resume_hint\n ;;\n esac\nfi\nif [ -n \"$ZSH_VERSION\" ]; then\n if [[ \"$-\" == *i* ]]; then\n docker_git_print_codex_resume_hint\n fi\nfi\nEOF\n chmod 0644 \"$CODEX_HINT_PATH\"\nfi\nif ! grep -q \"zz-codex-resume.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\\\n\" \"if [ -f /etc/profile.d/zz-codex-resume.sh ]; then . /etc/profile.d/zz-codex-resume.sh; fi\" >> /etc/bash.bashrc\nfi\nif [[ -s /etc/zsh/zshrc ]] && ! grep -q \"zz-codex-resume.sh\" /etc/zsh/zshrc 2>/dev/null; then\n printf \"%s\\\\n\" \"if [ -f /etc/profile.d/zz-codex-resume.sh ]; then source /etc/profile.d/zz-codex-resume.sh; fi\" >> /etc/zsh/zshrc\nfi`\n\nconst escapeForDoubleQuotes = (value: string): string => {\n const backslash = String.fromCodePoint(92)\n const quote = String.fromCodePoint(34)\n const escapedBackslash = `${backslash}${backslash}`\n const escapedQuote = `${backslash}${quote}`\n return value\n .replaceAll(backslash, escapedBackslash)\n .replaceAll(quote, escapedQuote)\n}\n\nexport const renderEntrypointCodexResumeHint = (config: TemplateConfig): string =>\n entrypointCodexResumeHintTemplate\n .replaceAll(\"__REPO_REF_DEFAULT__\", escapeForDoubleQuotes(config.repoRef))\n .replaceAll(\"__REPO_URL_DEFAULT__\", escapeForDoubleQuotes(config.repoUrl))\n\nconst entrypointAgentsNoticeTemplate = String.raw`# Ensure global AGENTS.md exists for container context\nAGENTS_PATH=\"__CODEX_HOME__/AGENTS.md\"\nLEGACY_AGENTS_PATH=\"/home/__SSH_USER__/AGENTS.md\"\nPROJECT_LINE=\"Рабочая папка проекта (git clone): __TARGET_DIR__\"\nWORKSPACES_LINE=\"Доступные workspace пути: __TARGET_DIR__\"\nWORKSPACE_INFO_LINE=\"Контекст workspace: repository\"\nFOCUS_LINE=\"Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__\"\nINTERNET_LINE=\"Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.\"\nif [[ \"$REPO_REF\" == issue-* ]]; then\n ISSUE_ID=\"$(printf \"%s\" \"$REPO_REF\" | sed -E 's#^issue-##')\"\n ISSUE_URL=\"\"\n if [[ \"$REPO_URL\" == https://github.com/* ]]; then\n ISSUE_REPO=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$ISSUE_REPO\" ]]; then\n ISSUE_URL=\"https://github.com/$ISSUE_REPO/issues/$ISSUE_ID\"\n fi\n fi\n if [[ -n \"$ISSUE_URL\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: issue #$ISSUE_ID ($ISSUE_URL)\"\n else\n WORKSPACE_INFO_LINE=\"Контекст workspace: issue #$ISSUE_ID\"\n fi\nelif [[ \"$REPO_REF\" == refs/pull/*/head ]]; then\n PR_ID=\"$(printf \"%s\" \"$REPO_REF\" | sed -nE 's#^refs/pull/([0-9]+)/head$#\\1#p')\"\n PR_URL=\"\"\n if [[ \"$REPO_URL\" == https://github.com/* && -n \"$PR_ID\" ]]; then\n PR_REPO=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$PR_REPO\" ]]; then\n PR_URL=\"https://github.com/$PR_REPO/pull/$PR_ID\"\n fi\n fi\n if [[ -n \"$PR_ID\" && -n \"$PR_URL\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: PR #$PR_ID ($PR_URL)\"\n elif [[ -n \"$PR_ID\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: PR #$PR_ID\"\n else\n WORKSPACE_INFO_LINE=\"Контекст workspace: pull request ($REPO_REF)\"\n fi\nfi\nif [[ ! -f \"$AGENTS_PATH\" ]]; then\n MANAGED_START=\"<!-- docker-git:managed:start -->\"\n MANAGED_END=\"<!-- docker-git:managed:end -->\"\n MANAGED_BLOCK=\"$(cat <<EOF\n$MANAGED_START\n$PROJECT_LINE\n$WORKSPACES_LINE\n$WORKSPACE_INFO_LINE\n$FOCUS_LINE\n$INTERNET_LINE\n$MANAGED_END\nEOF\n)\"\n cat <<EOF > \"$AGENTS_PATH\"\nТы автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~\n$MANAGED_BLOCK\nЕсли ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.\nEOF\n chown 1000:1000 \"$AGENTS_PATH\" || true\nfi\nif [[ -f \"$AGENTS_PATH\" ]]; then\n MANAGED_START=\"<!-- docker-git:managed:start -->\"\n MANAGED_END=\"<!-- docker-git:managed:end -->\"\n MANAGED_BLOCK=\"$(cat <<EOF\n$MANAGED_START\n$PROJECT_LINE\n$WORKSPACES_LINE\n$WORKSPACE_INFO_LINE\n$FOCUS_LINE\n$INTERNET_LINE\n$MANAGED_END\nEOF\n)\"\n TMP_AGENTS_PATH=\"$(mktemp)\"\n if grep -qF \"$MANAGED_START\" \"$AGENTS_PATH\" && grep -qF \"$MANAGED_END\" \"$AGENTS_PATH\"; then\n awk -v start=\"$MANAGED_START\" -v end=\"$MANAGED_END\" -v repl=\"$MANAGED_BLOCK\" '\n BEGIN { in_block = 0 }\n $0 == start { print repl; in_block = 1; next }\n $0 == end { in_block = 0; next }\n in_block == 0 { print }\n ' \"$AGENTS_PATH\" > \"$TMP_AGENTS_PATH\"\n else\n sed \\\n -e '/^Рабочая папка проекта (git clone):/d' \\\n -e '/^Доступные workspace пути:/d' \\\n -e '/^Контекст workspace:/d' \\\n -e '/^Фокус задачи:/d' \\\n -e '/^Issue AGENTS.md:/d' \\\n -e '/^Доступ к интернету:/d' \\\n \"$AGENTS_PATH\" > \"$TMP_AGENTS_PATH\"\n if [[ -s \"$TMP_AGENTS_PATH\" ]]; then\n printf \"\\n\" >> \"$TMP_AGENTS_PATH\"\n fi\n printf \"%s\\n\" \"$MANAGED_BLOCK\" >> \"$TMP_AGENTS_PATH\"\n fi\n mv \"$TMP_AGENTS_PATH\" \"$AGENTS_PATH\"\n chown 1000:1000 \"$AGENTS_PATH\" || true\nfi\nif [[ -f \"$LEGACY_AGENTS_PATH\" && -f \"$AGENTS_PATH\" ]]; then\n LEGACY_SUM=\"$(cksum \"$LEGACY_AGENTS_PATH\" 2>/dev/null | awk '{print $1 \\\":\\\" $2}')\"\n CODEX_SUM=\"$(cksum \"$AGENTS_PATH\" 2>/dev/null | awk '{print $1 \\\":\\\" $2}')\"\n if [[ -n \"$LEGACY_SUM\" && \"$LEGACY_SUM\" == \"$CODEX_SUM\" ]]; then\n rm -f \"$LEGACY_AGENTS_PATH\"\n fi\nfi`\n\nexport const renderEntrypointAgentsNotice = (config: TemplateConfig): string =>\n entrypointAgentsNoticeTemplate\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__TARGET_DIR__\", config.targetDir)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst renderAuthLabelResolution = (): string =>\n String.raw`# 2) Ensure GitHub auth vars are available for SSH sessions.\n# Prefer a label-selected token (same selection model as clone/create) when present.\nRESOLVED_AUTH_LABEL=\"\"\nAUTH_LABEL_RAW=\"${\"${\"}GIT_AUTH_LABEL:-${\"${\"}GITHUB_AUTH_LABEL:-}}\"\n\nif [[ -z \"$AUTH_LABEL_RAW\" && \"$REPO_URL\" == https://github.com/* ]]; then\n AUTH_LABEL_RAW=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##' | cut -d/ -f1)\"\nfi\n\nif [[ -n \"$AUTH_LABEL_RAW\" ]]; then\n RESOLVED_AUTH_LABEL=\"$(printf \"%s\" \"$AUTH_LABEL_RAW\" | tr '[:lower:]' '[:upper:]' | sed -E 's/[^A-Z0-9]+/_/g; s/^_+//; s/_+$//')\"\n if [[ \"$RESOLVED_AUTH_LABEL\" == \"DEFAULT\" ]]; then\n RESOLVED_AUTH_LABEL=\"\"\n fi\nfi`\n\nconst renderEffectiveTokenResolution = (): string =>\n String.raw`EFFECTIVE_GITHUB_TOKEN=\"$GITHUB_TOKEN\"\nif [[ -z \"$EFFECTIVE_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$GH_TOKEN\"\nfi\nif [[ -z \"$EFFECTIVE_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$GIT_AUTH_TOKEN\"\nfi\n\nif [[ -n \"$RESOLVED_AUTH_LABEL\" ]]; then\n LABELED_GIT_TOKEN_KEY=\"GIT_AUTH_TOKEN__$RESOLVED_AUTH_LABEL\"\n LABELED_GITHUB_TOKEN_KEY=\"GITHUB_TOKEN__$RESOLVED_AUTH_LABEL\"\n LABELED_GH_TOKEN_KEY=\"GH_TOKEN__$RESOLVED_AUTH_LABEL\"\n\n LABELED_GIT_TOKEN=\"${\"${\"}!LABELED_GIT_TOKEN_KEY-}\"\n LABELED_GITHUB_TOKEN=\"${\"${\"}!LABELED_GITHUB_TOKEN_KEY-}\"\n LABELED_GH_TOKEN=\"${\"${\"}!LABELED_GH_TOKEN_KEY-}\"\n\n if [[ -n \"$LABELED_GIT_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GIT_TOKEN\"\n elif [[ -n \"$LABELED_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GITHUB_TOKEN\"\n elif [[ -n \"$LABELED_GH_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GH_TOKEN\"\n fi\nfi`\n\nconst renderAuthBridgeFinalize = (config: TemplateConfig): string =>\n String.raw`EFFECTIVE_GH_TOKEN=\"$EFFECTIVE_GITHUB_TOKEN\"\n\nif [[ -n \"$EFFECTIVE_GH_TOKEN\" ]]; then\n printf \"export GH_TOKEN=%q\\n\" \"$EFFECTIVE_GH_TOKEN\" > /etc/profile.d/gh-token.sh\n printf \"export GITHUB_TOKEN=%q\\n\" \"$EFFECTIVE_GITHUB_TOKEN\" >> /etc/profile.d/gh-token.sh\n printf \"export GIT_AUTH_TOKEN=%q\\n\" \"$EFFECTIVE_GITHUB_TOKEN\" >> /etc/profile.d/gh-token.sh\n chmod 0644 /etc/profile.d/gh-token.sh\n docker_git_upsert_ssh_env \"GH_TOKEN\" \"$EFFECTIVE_GH_TOKEN\"\n docker_git_upsert_ssh_env \"GITHUB_TOKEN\" \"$EFFECTIVE_GITHUB_TOKEN\"\n docker_git_upsert_ssh_env \"GIT_AUTH_TOKEN\" \"$EFFECTIVE_GITHUB_TOKEN\"\n\n SAFE_GH_TOKEN=\"$(printf \"%q\" \"$EFFECTIVE_GH_TOKEN\")\"\n # Keep git+https auth in sync with gh auth so push/pull works without manual setup.\n su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh auth setup-git --hostname github.com --force\" || true\n\n GH_LOGIN=\"$(su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh api user --jq .login\" 2>/dev/null || true)\"\n GH_ID=\"$(su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh api user --jq .id\" 2>/dev/null || true)\"\n GH_LOGIN=\"$(printf \"%s\" \"$GH_LOGIN\" | tr -d '\\r\\n')\"\n GH_ID=\"$(printf \"%s\" \"$GH_ID\" | tr -d '\\r\\n')\"\n\n if [[ -z \"$GIT_USER_NAME\" && -n \"$GH_LOGIN\" ]]; then\n GIT_USER_NAME=\"$GH_LOGIN\"\n fi\n if [[ -z \"$GIT_USER_EMAIL\" && -n \"$GH_LOGIN\" && -n \"$GH_ID\" ]]; then\n GIT_USER_EMAIL=\"${\"${\"}GH_ID}+${\"${\"}GH_LOGIN}@users.noreply.github.com\"\n fi\nfi`\n\nconst renderEntrypointAuthEnvBridge = (config: TemplateConfig): string =>\n [\n renderAuthLabelResolution(),\n renderEffectiveTokenResolution(),\n renderAuthBridgeFinalize(config)\n ].join(\"\\n\\n\")\n\nconst renderEntrypointGitCredentialHelper = (config: TemplateConfig): string =>\n String.raw`# 3) Configure git credential helper for HTTPS remotes\nGIT_CREDENTIAL_HELPER_PATH=\"/usr/local/bin/docker-git-credential-helper\"\ncat <<'EOF' > \"$GIT_CREDENTIAL_HELPER_PATH\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nif [[ \"$#\" -lt 1 || \"$1\" != \"get\" ]]; then\n exit 0\nfi\n\ntoken=\"${\"${\"}GITHUB_TOKEN:-}\"\nif [[ -z \"$token\" ]]; then\n token=\"${\"${\"}GH_TOKEN:-}\"\nfi\n\nif [[ -z \"$token\" ]]; then\n exit 0\nfi\n\nprintf \"%s\\n\" \"username=x-access-token\"\nprintf \"%s\\n\" \"password=$token\"\nEOF\nchmod 0755 \"$GIT_CREDENTIAL_HELPER_PATH\"\nsu - ${config.sshUser} -c \"git config --global credential.helper '$GIT_CREDENTIAL_HELPER_PATH'\"`\n\nconst renderEntrypointGitIdentity = (config: TemplateConfig): string =>\n String.raw`# 4) Configure git identity for the dev user if provided\nif [[ -n \"$GIT_USER_NAME\" ]]; then\n SAFE_GIT_USER_NAME=\"$(printf \"%q\" \"$GIT_USER_NAME\")\"\n su - ${config.sshUser} -c \"git config --global user.name $SAFE_GIT_USER_NAME\"\nfi\n\nif [[ -n \"$GIT_USER_EMAIL\" ]]; then\n SAFE_GIT_USER_EMAIL=\"$(printf \"%q\" \"$GIT_USER_EMAIL\")\"\n su - ${config.sshUser} -c \"git config --global user.email $SAFE_GIT_USER_EMAIL\"\nfi`\n\nexport const renderEntrypointGitConfig = (config: TemplateConfig): string =>\n [\n renderEntrypointAuthEnvBridge(config),\n renderEntrypointGitCredentialHelper(config),\n renderEntrypointGitIdentity(config)\n ].join(\"\\n\\n\")\n\nconst entrypointGitHooksTemplate = String\n .raw`# 3) Install global git hooks to protect main/master + managed AGENTS context\nHOOKS_DIR=\"/opt/docker-git/hooks\"\nPRE_PUSH_HOOK=\"$HOOKS_DIR/pre-push\"\nmkdir -p \"$HOOKS_DIR\"\n\ncat <<'EOF' > \"$PRE_PUSH_HOOK\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nprotected_branches=(\"refs/heads/main\" \"refs/heads/master\")\nallow_delete=\"${\"${\"}DOCKER_GIT_ALLOW_DELETE:-}\"\nzero_sha=\"0000000000000000000000000000000000000000\"\nissue_managed_start='<!-- docker-git:issue-managed:start -->'\nissue_managed_end='<!-- docker-git:issue-managed:end -->'\n\nextract_issue_block() {\n local ref=\"$1\"\n\n if ! git cat-file -e \"$ref\" 2>/dev/null; then\n return 0\n fi\n\n local awk_status=0\n if ! git cat-file -p \"$ref\" | awk -v start=\"$issue_managed_start\" -v end=\"$issue_managed_end\" '\n BEGIN { in_block = 0; found = 0 }\n $0 == start { in_block = 1; found = 1 }\n in_block == 1 { print }\n $0 == end && in_block == 1 { in_block = 0; exit }\n END {\n if (found == 0) exit 3\n if (in_block == 1) exit 2\n }\n '; then\n awk_status=$?\n if [[ \"$awk_status\" -eq 3 ]]; then\n return 0\n fi\n return \"$awk_status\"\n fi\n}\n\ncommit_changes_issue_block() {\n local commit=\"$1\"\n local parent=\"\"\n local commit_block=\"\"\n local parent_block=\"\"\n\n if ! git diff-tree --no-commit-id --name-only -r \"$commit\" -- AGENTS.md | grep -qx \"AGENTS.md\"; then\n return 1\n fi\n\n if ! commit_block=\"$(extract_issue_block \"$commit:AGENTS.md\")\"; then\n return 2\n fi\n\n parent=\"$(git rev-list --parents -n 1 \"$commit\" | awk '{print $2}')\"\n if [[ -n \"$parent\" ]]; then\n if ! parent_block=\"$(extract_issue_block \"$parent:AGENTS.md\")\"; then\n return 2\n fi\n fi\n\n if [[ \"$commit_block\" != \"$parent_block\" ]]; then\n return 0\n fi\n return 1\n}\n\ncheck_issue_managed_block_range() {\n local local_sha=\"$1\"\n local remote_sha=\"$2\"\n local commits=\"\"\n local commit=\"\"\n local guard_status=0\n\n if [[ \"$local_sha\" == \"$zero_sha\" ]]; then\n return 0\n fi\n\n if [[ \"$remote_sha\" == \"$zero_sha\" ]]; then\n commits=\"$(git rev-list \"$local_sha\" --not --remotes 2>/dev/null || true)\"\n if [[ -z \"$commits\" ]]; then\n commits=\"$local_sha\"\n fi\n else\n commits=\"$(git rev-list \"$remote_sha..$local_sha\" 2>/dev/null || true)\"\n fi\n\n for commit in $commits; do\n commit_changes_issue_block \"$commit\"\n guard_status=$?\n if [[ \"$guard_status\" -eq 0 ]]; then\n echo \"docker-git: push contains commit updating managed issue block in AGENTS.md: $commit\"\n echo \"docker-git: this block is runtime context and must stay outside repository history.\"\n return 1\n fi\n if [[ \"$guard_status\" -eq 2 ]]; then\n echo \"docker-git: failed to parse managed issue block in AGENTS.md for commit $commit\"\n echo \"docker-git: push blocked to prevent committing runtime workspace metadata.\"\n return 1\n fi\n done\n\n return 0\n}\n\nwhile read -r local_ref local_sha remote_ref remote_sha; do\n if [[ -z \"$remote_ref\" ]]; then\n continue\n fi\n for protected in \"${\"${\"}protected_branches[@]}\"; do\n if [[ \"$remote_ref\" == \"$protected\" || \"$local_ref\" == \"$protected\" ]]; then\n echo \"docker-git: push to protected branch '${\"${\"}protected##*/}' is disabled.\"\n echo \"docker-git: create a new branch: git checkout -b <name>\"\n exit 1\n fi\n done\n if ! check_issue_managed_block_range \"$local_sha\" \"$remote_sha\"; then\n exit 1\n fi\n if [[ \"$local_sha\" == \"$zero_sha\" && \"$remote_ref\" == refs/heads/* ]]; then\n if [[ \"$allow_delete\" != \"1\" ]]; then\n echo \"docker-git: deleting remote branches is disabled (set DOCKER_GIT_ALLOW_DELETE=1 to override).\"\n exit 1\n fi\n fi\ndone\nEOF\nchmod 0755 \"$PRE_PUSH_HOOK\"\ngit config --system core.hooksPath \"$HOOKS_DIR\" || true\ngit config --global core.hooksPath \"$HOOKS_DIR\" || true`\n\nexport const renderEntrypointGitHooks = (): string => entrypointGitHooksTemplate\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst entrypointDockerGitBootstrapTemplate = String\n .raw`# Bootstrap ~/.docker-git for nested docker-git usage inside this container.\nDOCKER_GIT_HOME=\"/home/__SSH_USER__/.docker-git\"\nDOCKER_GIT_AUTH_DIR=\"$DOCKER_GIT_HOME/.orch/auth/codex\"\nDOCKER_GIT_ENV_DIR=\"$DOCKER_GIT_HOME/.orch/env\"\nDOCKER_GIT_ENV_GLOBAL=\"$DOCKER_GIT_ENV_DIR/global.env\"\nDOCKER_GIT_ENV_PROJECT=\"$DOCKER_GIT_ENV_DIR/project.env\"\nDOCKER_GIT_AUTH_KEYS=\"$DOCKER_GIT_HOME/authorized_keys\"\n\nmkdir -p \"$DOCKER_GIT_AUTH_DIR\" \"$DOCKER_GIT_ENV_DIR\" \"$DOCKER_GIT_HOME/.orch/auth/gh\"\n\nif [[ -f \"/home/__SSH_USER__/.ssh/authorized_keys\" ]]; then\n cp \"/home/__SSH_USER__/.ssh/authorized_keys\" \"$DOCKER_GIT_AUTH_KEYS\"\nelif [[ -f /authorized_keys ]]; then\n cp /authorized_keys \"$DOCKER_GIT_AUTH_KEYS\"\nfi\nif [[ -f \"$DOCKER_GIT_AUTH_KEYS\" ]]; then\n chmod 600 \"$DOCKER_GIT_AUTH_KEYS\" || true\nfi\n\nif [[ ! -f \"$DOCKER_GIT_ENV_GLOBAL\" ]]; then\n cat <<'EOF' > \"$DOCKER_GIT_ENV_GLOBAL\"\n# docker-git env\n# KEY=value\nEOF\nfi\nif [[ ! -f \"$DOCKER_GIT_ENV_PROJECT\" ]]; then\n cat <<'EOF' > \"$DOCKER_GIT_ENV_PROJECT\"\n# docker-git project env defaults\nCODEX_SHARE_AUTH=1\nCODEX_AUTO_UPDATE=1\nDOCKER_GIT_ZSH_AUTOSUGGEST=1\nDOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=fg=8,italic\nDOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=history completion\nMCP_PLAYWRIGHT_ISOLATED=1\nEOF\nfi\n\nupsert_env_var() {\n local file=\"$1\"\n local key=\"$2\"\n local value=\"$3\"\n local tmp\n tmp=\"$(mktemp)\"\n awk -v key=\"$key\" 'index($0, key \"=\") != 1 { print }' \"$file\" > \"$tmp\"\n printf \"%s=%s\\n\" \"$key\" \"$value\" >> \"$tmp\"\n mv \"$tmp\" \"$file\"\n}\n\ncopy_if_distinct_file() {\n local source=\"$1\"\n local target=\"$2\"\n if [[ ! -f \"$source\" ]]; then\n return 1\n fi\n local source_real=\"\"\n local target_real=\"\"\n source_real=\"$(readlink -f \"$source\" 2>/dev/null || true)\"\n target_real=\"$(readlink -f \"$target\" 2>/dev/null || true)\"\n if [[ -n \"$source_real\" && -n \"$target_real\" && \"$source_real\" == \"$target_real\" ]]; then\n return 0\n fi\n cp \"$source\" \"$target\"\n return 0\n}\n\nif [[ -n \"$GH_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GH_TOKEN\" \"$GH_TOKEN\"\nfi\nif [[ -n \"$GITHUB_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GITHUB_TOKEN\" \"$GITHUB_TOKEN\"\nelif [[ -n \"$GH_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GITHUB_TOKEN\" \"$GH_TOKEN\"\nfi\n\nSOURCE_CODEX_CONFIG=\"__CODEX_HOME__/config.toml\"\ncopy_if_distinct_file \"$SOURCE_CODEX_CONFIG\" \"$DOCKER_GIT_AUTH_DIR/config.toml\" || true\n\nSOURCE_SHARED_AUTH=\"__CODEX_HOME__-shared/auth.json\"\nSOURCE_LOCAL_AUTH=\"__CODEX_HOME__/auth.json\"\nif [[ -f \"$SOURCE_SHARED_AUTH\" ]]; then\n copy_if_distinct_file \"$SOURCE_SHARED_AUTH\" \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nelif [[ -f \"$SOURCE_LOCAL_AUTH\" ]]; then\n copy_if_distinct_file \"$SOURCE_LOCAL_AUTH\" \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nfi\nif [[ -f \"$DOCKER_GIT_AUTH_DIR/auth.json\" ]]; then\n chmod 600 \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nfi\n\nchown -R 1000:1000 \"$DOCKER_GIT_HOME\" || true`\n\nexport const renderEntrypointDockerGitBootstrap = (config: TemplateConfig): string =>\n entrypointDockerGitBootstrapTemplate\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst entrypointOpenCodeTemplate = `OPENCODE_DATA_DIR=\"/home/__SSH_USER__/.local/share/opencode\"\nOPENCODE_AUTH_FILE=\"$OPENCODE_DATA_DIR/auth.json\"\nOPENCODE_SHARED_HOME=\"__CODEX_HOME__-shared/opencode\"\nOPENCODE_SHARED_AUTH_FILE=\"$OPENCODE_SHARED_HOME/auth.json\"\n\n# OpenCode: share auth.json across projects (so /connect is one-time)\nOPENCODE_SHARE_AUTH=\"\\${OPENCODE_SHARE_AUTH:-1}\"\nif [[ \"$OPENCODE_SHARE_AUTH\" == \"1\" ]]; then\n # Store in the shared auth volume to persist across projects/containers.\n mkdir -p \"$OPENCODE_DATA_DIR\" \"$OPENCODE_SHARED_HOME\"\n chown -R 1000:1000 \"$OPENCODE_DATA_DIR\" \"$OPENCODE_SHARED_HOME\" || true\n\n # Guard against a bad bind mount creating a directory at auth.json.\n if [[ -d \"$OPENCODE_AUTH_FILE\" ]]; then\n mv \"$OPENCODE_AUTH_FILE\" \"$OPENCODE_AUTH_FILE.bak-$(date +%s)\" || true\n fi\n\n # Migrate existing per-project auth into the shared location once.\n if [[ -f \"$OPENCODE_AUTH_FILE\" && ! -L \"$OPENCODE_AUTH_FILE\" ]]; then\n if [[ -f \"$OPENCODE_SHARED_AUTH_FILE\" ]]; then\n LOCAL_AUTH=\"$OPENCODE_AUTH_FILE\" SHARED_AUTH=\"$OPENCODE_SHARED_AUTH_FILE\" node - <<'NODE'\nconst fs = require(\"fs\")\nconst localPath = process.env.LOCAL_AUTH\nconst sharedPath = process.env.SHARED_AUTH\nconst readJson = (p) => {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\"))\n } catch {\n return {}\n }\n}\nconst local = readJson(localPath)\nconst shared = readJson(sharedPath)\nconst merged = { ...local, ...shared } // shared wins on conflicts\nfs.writeFileSync(sharedPath, JSON.stringify(merged, null, 2), { mode: 0o600 })\nNODE\n else\n cp \"$OPENCODE_AUTH_FILE\" \"$OPENCODE_SHARED_AUTH_FILE\" || true\n chmod 600 \"$OPENCODE_SHARED_AUTH_FILE\" || true\n fi\n chown 1000:1000 \"$OPENCODE_SHARED_AUTH_FILE\" || true\n rm -f \"$OPENCODE_AUTH_FILE\" || true\n fi\n\n ln -sf \"$OPENCODE_SHARED_AUTH_FILE\" \"$OPENCODE_AUTH_FILE\"\nfi\n\n# OpenCode: auto-seed auth from Codex (so /connect is automatic)\nOPENCODE_AUTO_CONNECT=\"\\${OPENCODE_AUTO_CONNECT:-1}\"\nif [[ \"$OPENCODE_AUTO_CONNECT\" == \"1\" ]]; then\n CODEX_AUTH_FILE=\"__CODEX_HOME__/auth.json\"\n OPENCODE_SEED_AUTH=\"$OPENCODE_AUTH_FILE\"\n if [[ \"$OPENCODE_SHARE_AUTH\" == \"1\" ]]; then\n OPENCODE_SEED_AUTH=\"$OPENCODE_SHARED_AUTH_FILE\"\n fi\n CODEX_AUTH=\"$CODEX_AUTH_FILE\" OPENCODE_AUTH=\"$OPENCODE_SEED_AUTH\" node - <<'NODE'\nconst fs = require(\"fs\")\nconst path = require(\"path\")\n\nconst codexPath = process.env.CODEX_AUTH\nconst opencodePath = process.env.OPENCODE_AUTH\n\nif (!codexPath || !opencodePath) {\n process.exit(0)\n}\n\nconst readJson = (p) => {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\"))\n } catch {\n return undefined\n }\n}\n\nconst writeJsonAtomic = (p, value) => {\n const dir = path.dirname(p)\n fs.mkdirSync(dir, { recursive: true })\n const tmp = path.join(dir, \".tmp-\" + path.basename(p) + \"-\" + process.pid + \"-\" + Date.now())\n fs.writeFileSync(tmp, JSON.stringify(value, null, 2), { mode: 0o600 })\n fs.renameSync(tmp, p)\n}\n\nconst isRecord = (value) => typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst decodeJwtClaims = (jwt) => {\n if (typeof jwt !== \"string\") return undefined\n const parts = jwt.split(\".\")\n if (parts.length !== 3) return undefined\n try {\n const payload = Buffer.from(parts[1], \"base64url\").toString(\"utf8\")\n return JSON.parse(payload)\n } catch {\n return undefined\n }\n}\n\nconst extractAccountIdFromClaims = (claims) => {\n if (!isRecord(claims)) return undefined\n if (typeof claims.chatgpt_account_id === \"string\") return claims.chatgpt_account_id\n const openaiAuth = claims[\"https://api.openai.com/auth\"]\n if (isRecord(openaiAuth) && typeof openaiAuth.chatgpt_account_id === \"string\") {\n return openaiAuth.chatgpt_account_id\n }\n const orgs = claims.organizations\n if (Array.isArray(orgs) && orgs.length > 0) {\n const first = orgs[0]\n if (isRecord(first) && typeof first.id === \"string\") return first.id\n }\n return undefined\n}\n\nconst extractJwtExpiryMs = (claims) => {\n if (!isRecord(claims)) return undefined\n if (typeof claims.exp !== \"number\") return undefined\n return claims.exp * 1000\n}\n\nconst codex = readJson(codexPath)\nif (!isRecord(codex)) process.exit(0)\n\nlet opencode = readJson(opencodePath)\nif (!isRecord(opencode)) opencode = {}\n\nif (opencode.openai) {\n process.exit(0)\n}\n\nconst apiKey = codex.OPENAI_API_KEY\nif (typeof apiKey === \"string\" && apiKey.trim().length > 0) {\n opencode.openai = { type: \"api\", key: apiKey.trim() }\n writeJsonAtomic(opencodePath, opencode)\n process.exit(0)\n}\n\nconst tokens = codex.tokens\nif (!isRecord(tokens)) process.exit(0)\n\nconst access = tokens.access_token\nconst refresh = tokens.refresh_token\nif (typeof access !== \"string\" || access.length === 0) process.exit(0)\nif (typeof refresh !== \"string\" || refresh.length === 0) process.exit(0)\n\nconst accessClaims = decodeJwtClaims(access)\nconst expires = extractJwtExpiryMs(accessClaims)\nif (typeof expires !== \"number\") process.exit(0)\n\nlet accountId = undefined\nif (typeof tokens.account_id === \"string\" && tokens.account_id.length > 0) {\n accountId = tokens.account_id\n} else {\n const idClaims = decodeJwtClaims(tokens.id_token)\n accountId =\n extractAccountIdFromClaims(idClaims) ||\n extractAccountIdFromClaims(accessClaims)\n}\n\nconst entry = {\n type: \"oauth\",\n refresh,\n access,\n expires,\n ...(typeof accountId === \"string\" && accountId.length > 0 ? { accountId } : {})\n}\n\nopencode.openai = entry\nwriteJsonAtomic(opencodePath, opencode)\nNODE\n chown 1000:1000 \"$OPENCODE_SEED_AUTH\" 2>/dev/null || true\nfi\n\n# OpenCode: ensure global config exists (plugins + permissions)\nOPENCODE_CONFIG_DIR=\"/home/__SSH_USER__/.config/opencode\"\nOPENCODE_CONFIG_JSON=\"$OPENCODE_CONFIG_DIR/opencode.json\"\nOPENCODE_CONFIG_JSONC=\"$OPENCODE_CONFIG_DIR/opencode.jsonc\"\n\nmkdir -p \"$OPENCODE_CONFIG_DIR\"\nchown -R 1000:1000 \"$OPENCODE_CONFIG_DIR\" || true\n\nif [[ ! -f \"$OPENCODE_CONFIG_JSON\" && ! -f \"$OPENCODE_CONFIG_JSONC\" ]]; then\n cat <<'EOF' > \"$OPENCODE_CONFIG_JSON\"\n{\n \"$schema\": \"https://opencode.ai/config.json\",\n \"plugin\": [\"oh-my-opencode\"],\n \"permission\": {\n \"doom_loop\": \"allow\",\n \"external_directory\": \"allow\",\n \"read\": {\n \"*\": \"allow\",\n \"*.env\": \"allow\",\n \"*.env.*\": \"allow\",\n \"*.env.example\": \"allow\"\n }\n }\n}\nEOF\n chown 1000:1000 \"$OPENCODE_CONFIG_JSON\" || true\nfi`\n\n// CHANGE: bootstrap OpenCode config (permissions + plugins) and share OpenCode auth.json across projects\n// WHY: make OpenCode usable out-of-the-box inside disposable docker-git containers\n// QUOTE(ТЗ): \"Preinstall OpenCode and oh-my-opencode with full authorization of existing tools\"\n// REF: issue-34\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: start(s) -> config_exists(s)\n// PURITY: CORE\n// INVARIANT: never overwrites an existing opencode.json/opencode.jsonc\n// COMPLEXITY: O(1)\nexport const renderEntrypointOpenCodeConfig = (config: TemplateConfig): string =>\n entrypointOpenCodeTemplate\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst renderEntrypointAutoUpdate = (): string =>\n `# 1) Keep Codex CLI up to date if requested (bun only)\nif [[ \"$CODEX_AUTO_UPDATE\" == \"1\" ]]; then\n if command -v bun >/dev/null 2>&1; then\n echo \"[codex] updating via bun...\"\n BUN_INSTALL=/usr/local/bun script -q -e -c \"bun add -g @openai/codex@latest\" /dev/null || true\n else\n echo \"[codex] bun not found, skipping auto-update\"\n fi\nfi`\n\nconst renderClonePreamble = (): string =>\n `# 2) Auto-clone repo if not already present\nmkdir -p /run/docker-git\nCLONE_DONE_PATH=\"/run/docker-git/clone.done\"\nCLONE_FAIL_PATH=\"/run/docker-git/clone.failed\"\nrm -f \"$CLONE_DONE_PATH\" \"$CLONE_FAIL_PATH\"\n\nCLONE_OK=1`\n\nconst renderCloneRemotes = (config: TemplateConfig): string =>\n `if [[ \"$CLONE_OK\" -eq 1 && -d \"$TARGET_DIR/.git\" ]]; then\n if [[ -n \"$FORK_REPO_URL\" && \"$FORK_REPO_URL\" != \"$REPO_URL\" ]]; then\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote set-url origin '$FORK_REPO_URL'\" || true\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote add upstream '$REPO_URL' 2>/dev/null || git remote set-url upstream '$REPO_URL'\" || true\n else\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote set-url origin '$REPO_URL'\" || true\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote remove upstream >/dev/null 2>&1 || true\" || true\n fi\nfi`\n\nconst renderCloneGuard = (config: TemplateConfig): string =>\n `if [[ -z \"$REPO_URL\" ]]; then\n echo \"[clone] skip (no repo url)\"\nelif [[ -d \"$TARGET_DIR/.git\" ]]; then\n echo \"[clone] skip (already cloned)\"\nelse\n mkdir -p \"$TARGET_DIR\"\n if [[ \"$TARGET_DIR\" != \"/\" ]]; then\n chown -R 1000:1000 \"$TARGET_DIR\"\n fi\n chown -R 1000:1000 /home/${config.sshUser}`\n\nconst renderCloneAuthSelection = (): string =>\n ` RESOLVED_GIT_AUTH_USER=\"$GIT_AUTH_USER\"\n RESOLVED_GIT_AUTH_TOKEN=\"$GIT_AUTH_TOKEN\"\n RESOLVED_GIT_AUTH_LABEL=\"\"\n GIT_TOKEN_LABEL_RAW=\"\\${GIT_AUTH_LABEL:-\\${GITHUB_AUTH_LABEL:-}}\"\n\n if [[ -z \"$GIT_TOKEN_LABEL_RAW\" && \"$REPO_URL\" == https://github.com/* ]]; then\n GIT_TOKEN_LABEL_RAW=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##' | cut -d/ -f1)\"\n fi\n\n if [[ -n \"$GIT_TOKEN_LABEL_RAW\" ]]; then\n RESOLVED_GIT_AUTH_LABEL=\"$(printf \"%s\" \"$GIT_TOKEN_LABEL_RAW\" | tr '[:lower:]' '[:upper:]' | sed -E 's/[^A-Z0-9]+/_/g; s/^_+//; s/_+$//')\"\n if [[ \"$RESOLVED_GIT_AUTH_LABEL\" == \"DEFAULT\" ]]; then\n RESOLVED_GIT_AUTH_LABEL=\"\"\n fi\n fi\n\n if [[ -n \"$RESOLVED_GIT_AUTH_LABEL\" ]]; then\n LABELED_GIT_TOKEN_KEY=\"GIT_AUTH_TOKEN__$RESOLVED_GIT_AUTH_LABEL\"\n LABELED_GITHUB_TOKEN_KEY=\"GITHUB_TOKEN__$RESOLVED_GIT_AUTH_LABEL\"\n LABELED_GIT_USER_KEY=\"GIT_AUTH_USER__$RESOLVED_GIT_AUTH_LABEL\"\n\n LABELED_GIT_TOKEN=\"\\${!LABELED_GIT_TOKEN_KEY-}\"\n LABELED_GITHUB_TOKEN=\"\\${!LABELED_GITHUB_TOKEN_KEY-}\"\n LABELED_GIT_USER=\"\\${!LABELED_GIT_USER_KEY-}\"\n\n if [[ -n \"$LABELED_GIT_TOKEN\" ]]; then\n RESOLVED_GIT_AUTH_TOKEN=\"$LABELED_GIT_TOKEN\"\n elif [[ -n \"$LABELED_GITHUB_TOKEN\" ]]; then\n RESOLVED_GIT_AUTH_TOKEN=\"$LABELED_GITHUB_TOKEN\"\n fi\n\n if [[ -n \"$LABELED_GIT_USER\" ]]; then\n RESOLVED_GIT_AUTH_USER=\"$LABELED_GIT_USER\"\n fi\n fi`\n\nconst renderCloneAuthRepoUrl = (): string =>\n ` AUTH_REPO_URL=\"$REPO_URL\"\n if [[ -n \"$RESOLVED_GIT_AUTH_TOKEN\" && \"$REPO_URL\" == https://* ]]; then\n AUTH_REPO_URL=\"$(printf \"%s\" \"$REPO_URL\" | sed \"s#^https://#https://\\${RESOLVED_GIT_AUTH_USER}:\\${RESOLVED_GIT_AUTH_TOKEN}@#\")\"\n fi`\n\nconst renderCloneCacheInit = (config: TemplateConfig): string =>\n ` CLONE_CACHE_ARGS=\"\"\n CACHE_REPO_DIR=\"\"\n CACHE_ROOT=\"/home/${config.sshUser}/.docker-git/.cache/git-mirrors\"\n if command -v sha256sum >/dev/null 2>&1; then\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | sha256sum | awk '{print $1}')\"\n elif command -v shasum >/dev/null 2>&1; then\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | shasum -a 256 | awk '{print $1}')\"\n else\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | tr '/:@' '_' | tr -cd '[:alnum:]_.-')\"\n fi\n\n if [[ -n \"$REPO_CACHE_KEY\" ]]; then\n CACHE_REPO_DIR=\"$CACHE_ROOT/$REPO_CACHE_KEY.git\"\n mkdir -p \"$CACHE_ROOT\"\n chown 1000:1000 \"$CACHE_ROOT\" || true\n if [[ -d \"$CACHE_REPO_DIR\" ]]; then\n if su - ${config.sshUser} -c \"git --git-dir '$CACHE_REPO_DIR' rev-parse --is-bare-repository >/dev/null 2>&1\"; then\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git --git-dir '$CACHE_REPO_DIR' fetch --progress --prune '$AUTH_REPO_URL' '+refs/*:refs/*'\"; then\n echo \"[clone-cache] mirror refresh failed for $REPO_URL\"\n fi\n CLONE_CACHE_ARGS=\"--reference-if-able '$CACHE_REPO_DIR' --dissociate\"\n echo \"[clone-cache] using mirror: $CACHE_REPO_DIR\"\n else\n echo \"[clone-cache] invalid mirror removed: $CACHE_REPO_DIR\"\n rm -rf \"$CACHE_REPO_DIR\"\n fi\n fi\n fi`\n\nconst renderCloneBodyStart = (config: TemplateConfig): string =>\n [\n renderCloneGuard(config),\n renderCloneAuthSelection(),\n renderCloneAuthRepoUrl(),\n renderCloneCacheInit(config)\n ].join(\"\\n\\n\")\n\nconst renderCloneBodyRef = (config: TemplateConfig): string =>\n ` if [[ -n \"$REPO_REF\" ]]; then\n if [[ \"$REPO_REF\" == refs/pull/* ]]; then\n REF_BRANCH=\"pr-$(printf \"%s\" \"$REPO_REF\" | tr '/:' '--')\"\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n else\n if ! su - ${config.sshUser} -c \"cd '$TARGET_DIR' && GIT_TERMINAL_PROMPT=0 git fetch --progress origin '$REPO_REF':'$REF_BRANCH' && git checkout '$REF_BRANCH'\"; then\n echo \"[clone] git fetch failed for $REPO_REF\"\n CLONE_OK=0\n fi\n fi\n else\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS --branch '$REPO_REF' '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n DEFAULT_REF=\"$(git ls-remote --symref \"$AUTH_REPO_URL\" HEAD 2>/dev/null | awk '/^ref:/ {print $2}' | head -n 1 || true)\"\n DEFAULT_BRANCH=\"$(printf \"%s\" \"$DEFAULT_REF\" | sed 's#^refs/heads/##')\"\n if [[ -n \"$DEFAULT_BRANCH\" ]]; then\n echo \"[clone] branch '$REPO_REF' missing; retrying with '$DEFAULT_BRANCH'\"\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS --branch '$DEFAULT_BRANCH' '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n elif [[ \"$REPO_REF\" == issue-* ]]; then\n if ! su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git checkout -B '$REPO_REF'\"; then\n echo \"[clone] failed to create local branch '$REPO_REF'\"\n CLONE_OK=0\n fi\n fi\n else\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n fi\n fi\n fi\n else\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n fi\n fi`\n\nconst renderCloneCacheFinalize = (config: TemplateConfig): string =>\n `CACHE_REPO_DIR=\"\\${CACHE_REPO_DIR:-}\"\nif [[ \"$CLONE_OK\" -eq 1 && -d \"$TARGET_DIR/.git\" && -n \"$CACHE_REPO_DIR\" && ! -d \"$CACHE_REPO_DIR\" ]]; then\n CACHE_TMP_DIR=\"$CACHE_REPO_DIR.tmp-$$\"\n if su - ${config.sshUser} -c \"rm -rf '$CACHE_TMP_DIR' && GIT_TERMINAL_PROMPT=0 git clone --mirror --progress '$TARGET_DIR/.git' '$CACHE_TMP_DIR'\"; then\n if mv \"$CACHE_TMP_DIR\" \"$CACHE_REPO_DIR\" 2>/dev/null; then\n echo \"[clone-cache] mirror created: $CACHE_REPO_DIR\"\n else\n rm -rf \"$CACHE_TMP_DIR\"\n fi\n else\n echo \"[clone-cache] mirror bootstrap failed for $REPO_URL\"\n rm -rf \"$CACHE_TMP_DIR\"\n fi\nfi`\n\nconst renderCloneBody = (config: TemplateConfig): string =>\n [\n renderCloneBodyStart(config),\n renderCloneBodyRef(config),\n \"fi\",\n \"\",\n renderCloneRemotes(config),\n \"\",\n renderCloneCacheFinalize(config)\n ].join(\"\\n\")\n\nconst renderCloneFinalize = (): string =>\n `if [[ \"$CLONE_OK\" -eq 1 ]]; then\n echo \"[clone] done\"\n touch \"$CLONE_DONE_PATH\"\nelse\n echo \"[clone] failed\"\n touch \"$CLONE_FAIL_PATH\"\nfi`\n\nconst renderEntrypointClone = (config: TemplateConfig): string =>\n [renderClonePreamble(), renderCloneBody(config), renderCloneFinalize()].join(\"\\n\\n\")\n\nexport const renderEntrypointBackgroundTasks = (config: TemplateConfig): string =>\n `# 4) Start background tasks so SSH can come up immediately\n(\n${renderEntrypointAutoUpdate()}\n\n${renderEntrypointClone(config)}\n) &`\n","import type { TemplateConfig } from \"./domain.js\"\nimport {\n renderEntrypointAuthorizedKeys,\n renderEntrypointBaseline,\n renderEntrypointDisableMotd,\n renderEntrypointDockerSocket,\n renderEntrypointHeader,\n renderEntrypointInputRc,\n renderEntrypointPackageCache,\n renderEntrypointSshd,\n renderEntrypointZshShell,\n renderEntrypointZshUserRc\n} from \"./templates-entrypoint/base.js\"\nimport { renderEntrypointClaudeConfig } from \"./templates-entrypoint/claude.js\"\nimport {\n renderEntrypointAgentsNotice,\n renderEntrypointCodexHome,\n renderEntrypointCodexResumeHint,\n renderEntrypointCodexSharedAuth,\n renderEntrypointMcpPlaywright\n} from \"./templates-entrypoint/codex.js\"\nimport { renderEntrypointGitConfig, renderEntrypointGitHooks } from \"./templates-entrypoint/git.js\"\nimport { renderEntrypointDockerGitBootstrap } from \"./templates-entrypoint/nested-docker-git.js\"\nimport { renderEntrypointOpenCodeConfig } from \"./templates-entrypoint/opencode.js\"\nimport { renderEntrypointBackgroundTasks } from \"./templates-entrypoint/tasks.js\"\nimport {\n renderEntrypointBashCompletion,\n renderEntrypointBashHistory,\n renderEntrypointPrompt,\n renderEntrypointZshConfig\n} from \"./templates-prompt.js\"\n\nexport const renderEntrypoint = (config: TemplateConfig): string =>\n [\n renderEntrypointHeader(config),\n renderEntrypointPackageCache(config),\n renderEntrypointAuthorizedKeys(config),\n renderEntrypointCodexHome(config),\n renderEntrypointCodexSharedAuth(config),\n renderEntrypointOpenCodeConfig(config),\n renderEntrypointDockerGitBootstrap(config),\n renderEntrypointMcpPlaywright(config),\n renderEntrypointZshShell(config),\n renderEntrypointZshUserRc(config),\n renderEntrypointPrompt(),\n renderEntrypointBashCompletion(),\n renderEntrypointBashHistory(),\n renderEntrypointInputRc(config),\n renderEntrypointZshConfig(),\n renderEntrypointCodexResumeHint(config),\n renderEntrypointAgentsNotice(config),\n renderEntrypointDockerSocket(config),\n renderEntrypointGitConfig(config),\n renderEntrypointClaudeConfig(config),\n renderEntrypointGitHooks(),\n renderEntrypointBackgroundTasks(config),\n renderEntrypointBaseline(),\n renderEntrypointDisableMotd(),\n renderEntrypointSshd()\n ].join(\"\\n\\n\")\n","import { resolveComposeNetworkName, type TemplateConfig } from \"../domain.js\"\n\ntype ComposeFragments = {\n readonly networkMode: TemplateConfig[\"dockerNetworkMode\"]\n readonly networkName: string\n readonly maybeGitTokenLabelEnv: string\n readonly maybeCodexAuthLabelEnv: string\n readonly maybeClaudeAuthLabelEnv: string\n readonly maybeDependsOn: string\n readonly maybePlaywrightEnv: string\n readonly maybeBrowserService: string\n readonly maybeBrowserVolume: string\n readonly forkRepoUrl: string\n}\n\ntype PlaywrightFragments = Pick<\n ComposeFragments,\n \"maybeDependsOn\" | \"maybePlaywrightEnv\" | \"maybeBrowserService\" | \"maybeBrowserVolume\"\n>\n\nconst renderGitTokenLabelEnv = (gitTokenLabel: string): string =>\n gitTokenLabel.length > 0\n ? ` GITHUB_AUTH_LABEL: \"${gitTokenLabel}\"\\n GIT_AUTH_LABEL: \"${gitTokenLabel}\"\\n`\n : \"\"\n\nconst renderCodexAuthLabelEnv = (codexAuthLabel: string): string =>\n codexAuthLabel.length > 0\n ? ` CODEX_AUTH_LABEL: \"${codexAuthLabel}\"\\n`\n : \"\"\n\nconst renderClaudeAuthLabelEnv = (claudeAuthLabel: string): string =>\n claudeAuthLabel.length > 0\n ? ` CLAUDE_AUTH_LABEL: \"${claudeAuthLabel}\"\\n`\n : \"\"\n\nconst buildPlaywrightFragments = (\n config: TemplateConfig,\n networkName: string\n): PlaywrightFragments => {\n if (!config.enableMcpPlaywright) {\n return {\n maybeDependsOn: \"\",\n maybePlaywrightEnv: \"\",\n maybeBrowserService: \"\",\n maybeBrowserVolume: \"\"\n }\n }\n\n const browserServiceName = `${config.serviceName}-browser`\n const browserContainerName = `${config.containerName}-browser`\n const browserVolumeName = `${config.volumeName}-browser`\n const browserDockerfile = \"Dockerfile.browser\"\n const browserCdpEndpoint = `http://${browserServiceName}:9223`\n\n return {\n maybeDependsOn: ` depends_on:\\n - ${browserServiceName}\\n`,\n maybePlaywrightEnv:\n ` MCP_PLAYWRIGHT_ENABLE: \"1\"\\n MCP_PLAYWRIGHT_CDP_ENDPOINT: \"${browserCdpEndpoint}\"\\n`,\n maybeBrowserService:\n `\\n ${browserServiceName}:\\n build:\\n context: .\\n dockerfile: ${browserDockerfile}\\n container_name: ${browserContainerName}\\n environment:\\n VNC_NOPW: \"1\"\\n shm_size: \"2gb\"\\n expose:\\n - \"9223\"\\n volumes:\\n - ${browserVolumeName}:/data\\n networks:\\n - ${networkName}\\n`,\n maybeBrowserVolume: ` ${browserVolumeName}:\\n`\n }\n}\n\nconst buildComposeFragments = (config: TemplateConfig): ComposeFragments => {\n const networkMode = config.dockerNetworkMode\n const networkName = resolveComposeNetworkName(config)\n const forkRepoUrl = config.forkRepoUrl ?? \"\"\n const gitTokenLabel = config.gitTokenLabel?.trim() ?? \"\"\n const codexAuthLabel = config.codexAuthLabel?.trim() ?? \"\"\n const claudeAuthLabel = config.claudeAuthLabel?.trim() ?? \"\"\n const maybeGitTokenLabelEnv = renderGitTokenLabelEnv(gitTokenLabel)\n const maybeCodexAuthLabelEnv = renderCodexAuthLabelEnv(codexAuthLabel)\n const maybeClaudeAuthLabelEnv = renderClaudeAuthLabelEnv(claudeAuthLabel)\n const playwright = buildPlaywrightFragments(config, networkName)\n\n return {\n networkMode,\n networkName,\n maybeGitTokenLabelEnv,\n maybeCodexAuthLabelEnv,\n maybeClaudeAuthLabelEnv,\n maybeDependsOn: playwright.maybeDependsOn,\n maybePlaywrightEnv: playwright.maybePlaywrightEnv,\n maybeBrowserService: playwright.maybeBrowserService,\n maybeBrowserVolume: playwright.maybeBrowserVolume,\n forkRepoUrl\n }\n}\n\nconst renderComposeServices = (config: TemplateConfig, fragments: ComposeFragments): string =>\n `services:\n ${config.serviceName}:\n build: .\n container_name: ${config.containerName}\n environment:\n REPO_URL: \"${config.repoUrl}\"\n REPO_REF: \"${config.repoRef}\"\n FORK_REPO_URL: \"${fragments.forkRepoUrl}\"\n${fragments.maybeGitTokenLabelEnv} # Optional token label selector (maps to GITHUB_TOKEN__<LABEL>/GIT_AUTH_TOKEN__<LABEL>)\n${fragments.maybeCodexAuthLabelEnv} # Optional Codex account label selector (maps to CODEX_AUTH_LABEL)\n${fragments.maybeClaudeAuthLabelEnv} # Optional Claude account label selector (maps to CLAUDE_AUTH_LABEL)\n TARGET_DIR: \"${config.targetDir}\"\n CODEX_HOME: \"${config.codexHome}\"\n${fragments.maybePlaywrightEnv}${fragments.maybeDependsOn} env_file:\n - ${config.envGlobalPath}\n - ${config.envProjectPath}\n ports:\n - \"127.0.0.1:${config.sshPort}:22\"\n volumes:\n - ${config.volumeName}:/home/${config.sshUser}\n - ${config.dockerGitPath}:/home/${config.sshUser}/.docker-git\n - ${config.authorizedKeysPath}:/authorized_keys:ro\n - ${config.codexAuthPath}:${config.codexHome}\n - ${config.codexSharedAuthPath}:${config.codexHome}-shared\n - /var/run/docker.sock:/var/run/docker.sock\n networks:\n - ${fragments.networkName}\n${fragments.maybeBrowserService}`\n\nconst renderComposeNetworks = (\n networkMode: TemplateConfig[\"dockerNetworkMode\"],\n networkName: string\n): string =>\n networkMode === \"shared\"\n ? `networks:\n ${networkName}:\n external: true`\n : `networks:\n ${networkName}:\n driver: bridge`\n\nconst renderComposeVolumes = (config: TemplateConfig, maybeBrowserVolume: string): string =>\n `volumes:\n ${config.volumeName}:\n${maybeBrowserVolume}`\n\nexport const renderDockerCompose = (config: TemplateConfig): string => {\n const fragments = buildComposeFragments(config)\n return [\n renderComposeServices(config, fragments),\n renderComposeNetworks(fragments.networkMode, fragments.networkName),\n renderComposeVolumes(config, fragments.maybeBrowserVolume)\n ].join(\"\\n\\n\")\n}\n","import type { TemplateConfig } from \"../domain.js\"\nimport { renderDockerfilePrompt } from \"../templates-prompt.js\"\n\nconst renderDockerfilePrelude = (): string =>\n `FROM ubuntu:24.04\n\nENV DEBIAN_FRONTEND=noninteractive\nENV NVM_DIR=/usr/local/nvm\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssh-server git gh ca-certificates curl unzip bsdutils sudo \\\n make docker.io docker-compose-v2 bash-completion zsh zsh-autosuggestions xauth \\\n ncurses-term \\\n && rm -rf /var/lib/apt/lists/*\n\n# Passwordless sudo for all users (container is disposable)\nRUN printf \"%s\\\\n\" \"ALL ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/zz-all \\\n && chmod 0440 /etc/sudoers.d/zz-all`\n\nconst renderDockerfileNode = (): string =>\n `# Tooling: Node 24 (NodeSource) + nvm\nRUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \\\n && apt-get install -y --no-install-recommends nodejs \\\n && node -v \\\n && npm -v \\\n && corepack --version \\\n && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/local/nvm \\\n && curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\nRUN printf \"export NVM_DIR=/usr/local/nvm\\\\n[ -s /usr/local/nvm/nvm.sh ] && . /usr/local/nvm/nvm.sh\\\\n\" \\\n > /etc/profile.d/nvm.sh && chmod 0644 /etc/profile.d/nvm.sh`\n\nconst renderDockerfileBunPrelude = (config: TemplateConfig): string =>\n `# Tooling: pnpm + Codex CLI + oh-my-opencode (bun) + Claude Code CLI (npm)\nRUN corepack enable && corepack prepare pnpm@${config.pnpmVersion} --activate\nENV TERM=xterm-256color\nRUN set -eu; \\\n for attempt in 1 2 3 4 5; do \\\n if curl -fsSL --retry 5 --retry-all-errors --retry-delay 2 https://bun.sh/install -o /tmp/bun-install.sh \\\n && BUN_INSTALL=/usr/local/bun bash /tmp/bun-install.sh; then \\\n rm -f /tmp/bun-install.sh; \\\n exit 0; \\\n fi; \\\n echo \"bun install attempt \\${attempt} failed; retrying...\" >&2; \\\n rm -f /tmp/bun-install.sh; \\\n sleep $((attempt * 2)); \\\n done; \\\n echo \"bun install failed after retries\" >&2; \\\n exit 1\nRUN ln -sf /usr/local/bun/bin/bun /usr/local/bin/bun\nRUN BUN_INSTALL=/usr/local/bun script -q -e -c \"bun add -g @openai/codex@latest oh-my-opencode@latest\" /dev/null\nRUN ln -sf /usr/local/bun/bin/codex /usr/local/bin/codex\nRUN ln -sf /usr/local/bun/bin/oh-my-opencode /usr/local/bin/oh-my-opencode\nRUN npm install -g @anthropic-ai/claude-code@latest\nRUN claude --version`\n\nconst renderDockerfileOpenCode = (): string =>\n `# Tooling: OpenCode (binary)\nRUN curl -fsSL https://opencode.ai/install | HOME=/usr/local bash -s -- --no-modify-path\nRUN ln -sf /usr/local/.opencode/bin/opencode /usr/local/bin/opencode\nRUN opencode --version`\n\nconst gitleaksVersion = \"8.28.0\"\n\nconst renderDockerfileGitleaks = (): string =>\n `# Tooling: gitleaks (secret scanner for .knowledge/.knowlenge hooks)\nRUN ARCH=\"$(uname -m)\" \\\n && case \"$ARCH\" in \\\n x86_64|amd64) GITLEAKS_ARCH=\"x64\" ;; \\\n aarch64|arm64) GITLEAKS_ARCH=\"arm64\" ;; \\\n *) echo \"Unsupported arch for gitleaks: $ARCH\" >&2; exit 1 ;; \\\n esac \\\n && curl -fsSL \"https://github.com/gitleaks/gitleaks/releases/download/v${gitleaksVersion}/gitleaks_${gitleaksVersion}_linux_$GITLEAKS_ARCH.tar.gz\" \\\n | tar -xz -C /usr/local/bin gitleaks \\\n && chmod +x /usr/local/bin/gitleaks \\\n && gitleaks version`\n\nconst dockerfilePlaywrightMcpBlock = String.raw`RUN npm install -g @playwright/mcp@latest\n\n# docker-git: wrapper that converts a CDP HTTP endpoint into a usable WS endpoint\n# Some Chromium images return webSocketDebuggerUrl pointing at 127.0.0.1 (container-local).\nRUN cat <<'EOF' > /usr/local/bin/docker-git-playwright-mcp\n#!/usr/bin/env bash\nset -euo pipefail\n\n# Fast-path for help/version (avoid waiting for the browser sidecar).\nfor arg in \"$@\"; do\n case \"$arg\" in\n -h|--help|-V|--version)\n exec playwright-mcp \"$@\"\n ;;\n esac\ndone\n\nCDP_ENDPOINT=\"\\${MCP_PLAYWRIGHT_CDP_ENDPOINT:-}\"\nif [[ -z \"$CDP_ENDPOINT\" ]]; then\n CDP_ENDPOINT=\"http://__SERVICE_NAME__-browser:9223\"\nfi\n\n# kechangdev/browser-vnc binds Chromium CDP on 127.0.0.1:9222; it also host-checks HTTP requests.\nJSON=\"$(curl -sSf --connect-timeout 3 --max-time 10 -H 'Host: 127.0.0.1:9222' \"\\${CDP_ENDPOINT%/}/json/version\")\"\nWS_URL=\"$(printf \"%s\" \"$JSON\" | node -e 'const fs=require(\"fs\"); const j=JSON.parse(fs.readFileSync(0,\"utf8\")); process.stdout.write(j.webSocketDebuggerUrl || \"\")')\"\nif [[ -z \"$WS_URL\" ]]; then\n echo \"docker-git-playwright-mcp: webSocketDebuggerUrl missing\" >&2\n exit 1\nfi\n\n# Rewrite ws origin to match the CDP endpoint origin (docker DNS).\nBASE_WS=\"$(CDP_ENDPOINT=\"$CDP_ENDPOINT\" node -e 'const { URL } = require(\"url\"); const u=new URL(process.env.CDP_ENDPOINT); const proto=u.protocol===\"https:\"?\"wss:\":\"ws:\"; process.stdout.write(proto + \"//\" + u.host)')\"\nWS_REWRITTEN=\"$(BASE_WS=\"$BASE_WS\" WS_URL=\"$WS_URL\" node -e 'const { URL } = require(\"url\"); const base=new URL(process.env.BASE_WS); const ws=new URL(process.env.WS_URL); ws.protocol=base.protocol; ws.host=base.host; process.stdout.write(ws.toString())')\"\n\nEXTRA_ARGS=()\nif [[ \"\\${MCP_PLAYWRIGHT_ISOLATED:-1}\" == \"1\" ]]; then\n EXTRA_ARGS+=(--isolated)\nfi\n\nexec playwright-mcp --cdp-endpoint \"$WS_REWRITTEN\" \"\\${EXTRA_ARGS[@]}\" \"$@\"\nEOF\nRUN chmod +x /usr/local/bin/docker-git-playwright-mcp`\n\nconst renderDockerfileBunProfile = (): string =>\n `RUN printf \"export PATH=/usr/local/bun/bin:$PATH\\\\n\" \\\n > /etc/profile.d/bun.sh && chmod 0644 /etc/profile.d/bun.sh`\n\nconst renderDockerfileBun = (config: TemplateConfig): string =>\n [\n renderDockerfileBunPrelude(config),\n config.enableMcpPlaywright\n ? dockerfilePlaywrightMcpBlock\n .replaceAll(\"\\\\${\", \"${\")\n .replaceAll(\"__SERVICE_NAME__\", config.serviceName)\n : \"\",\n renderDockerfileBunProfile()\n ]\n .filter((chunk) => chunk.trim().length > 0)\n .join(\"\\n\")\n\nconst renderDockerfileUsers = (config: TemplateConfig): string =>\n `# Create non-root user for SSH (align UID/GID with host user 1000)\nRUN if id -u ubuntu >/dev/null 2>&1; then \\\n if getent group 1000 >/dev/null 2>&1; then \\\n EXISTING_GROUP=\"$(getent group 1000 | cut -d: -f1)\"; \\\n if [ \"$EXISTING_GROUP\" != \"${config.sshUser}\" ]; then groupmod -n ${config.sshUser} \"$EXISTING_GROUP\" || true; fi; \\\n fi; \\\n usermod -l ${config.sshUser} -d /home/${config.sshUser} -m -s /usr/bin/zsh ubuntu || true; \\\n fi\nRUN if id -u ${config.sshUser} >/dev/null 2>&1; then \\\n usermod -u 1000 -g 1000 -o ${config.sshUser}; \\\n else \\\n groupadd -g 1000 ${config.sshUser} || true; \\\n useradd -m -s /usr/bin/zsh -u 1000 -g 1000 -o ${config.sshUser}; \\\n fi\nRUN printf \"%s\\\\n\" \"${config.sshUser} ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/${config.sshUser} \\\n && chmod 0440 /etc/sudoers.d/${config.sshUser}\n\n# sshd runtime dir\nRUN mkdir -p /run/sshd\n\n# Harden sshd: disable password auth and root login\nRUN printf \"%s\\\\n\" \\\n \"PasswordAuthentication no\" \\\n \"PermitRootLogin no\" \\\n \"PubkeyAuthentication yes\" \\\n \"X11Forwarding yes\" \\\n \"X11UseLocalhost yes\" \\\n \"PermitUserEnvironment yes\" \\\n \"AllowUsers ${config.sshUser}\" \\\n > /etc/ssh/sshd_config.d/${config.sshUser}.conf`\n\nconst renderDockerfileWorkspace = (config: TemplateConfig): string =>\n `# Workspace path (supports root-level dirs like /repo)\nRUN mkdir -p ${config.targetDir} \\\n && chown -R 1000:1000 /home/${config.sshUser} \\\n && if [ \"${config.targetDir}\" != \"/\" ]; then chown -R 1000:1000 \"${config.targetDir}\"; fi\n\nCOPY entrypoint.sh /entrypoint.sh\nRUN chmod +x /entrypoint.sh\n\nEXPOSE 22\nENTRYPOINT [\"/entrypoint.sh\"]`\n\nexport const renderDockerfile = (config: TemplateConfig): string =>\n [\n renderDockerfilePrelude(),\n renderDockerfilePrompt(),\n renderDockerfileNode(),\n renderDockerfileBun(config),\n renderDockerfileOpenCode(),\n renderDockerfileGitleaks(),\n renderDockerfileUsers(config),\n renderDockerfileWorkspace(config)\n ].join(\"\\n\\n\")\n","export const renderPlaywrightBrowserDockerfile = (): string =>\n `FROM kechangdev/browser-vnc:latest\n\n# bash for noVNC startup, procps for ps -p used by novnc_proxy, socat for CDP proxy\n# python3/net-tools for diagnostics\nRUN apk add --no-cache bash procps socat python3 net-tools\n\nCOPY mcp-playwright-start-extra.sh /usr/local/bin/mcp-playwright-start-extra.sh\nRUN chmod +x /usr/local/bin/mcp-playwright-start-extra.sh\n\n# Start extra services in background, keep base stack in foreground\n# Clear stale Chromium profile locks before boot\nENTRYPOINT [\"/bin/sh\", \"-lc\", \"rm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true; /usr/local/bin/mcp-playwright-start-extra.sh & exec /start.sh\"]`\n\nexport const renderPlaywrightStartExtra = (): string =>\n `#!/bin/sh\nset -eu\n\n# Clear stale Chromium locks from previous container runs\nrm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true\n\n# Wait for chromium/x11vnc/noVNC to come up\nsleep 2\n\n# CDP proxy: expose 9223 on the docker network, forward to 127.0.0.1:9222 inside the browser container\nsocat TCP-LISTEN:9223,fork,reuseaddr TCP:127.0.0.1:9222 >/var/log/socat-9223.log 2>&1 &\n\n# Optional VNC password disabling (useful if you publish VNC/noVNC ports)\nif [ \"\\${VNC_NOPW:-1}\" = \"1\" ]; then\n pkill x11vnc || true\n x11vnc -display :99 -rfbport 5900 -nopw -forever -shared -bg -o /var/log/x11vnc-nopw.log\nfi\n\necho \"extra services started\"\nexit 0\n`\n","import type { TemplateConfig } from \"./domain.js\"\nimport { renderEntrypoint } from \"./templates-entrypoint.js\"\nimport { renderDockerCompose } from \"./templates/docker-compose.js\"\nimport { renderDockerfile } from \"./templates/dockerfile.js\"\nimport { renderPlaywrightBrowserDockerfile, renderPlaywrightStartExtra } from \"./templates/playwright.js\"\n\nexport type FileSpec =\n | { readonly _tag: \"File\"; readonly relativePath: string; readonly contents: string; readonly mode?: number }\n | { readonly _tag: \"Dir\"; readonly relativePath: string }\n\nconst renderGitignore = (): string =>\n `# docker-git project files\n# NOTE: this directory is intended to be committed to the docker-git state repository.\n# It intentionally does not ignore .orch/ or auth files; keep the state repo private.\n\n# Volatile Codex artifacts (do not commit)\n.orch/auth/codex/log/\n.orch/auth/codex/tmp/\n.orch/auth/codex/sessions/\n.orch/auth/codex/models_cache.json\n`\n\nconst renderDockerignore = (): string =>\n `# docker-git build context\n.orch/\nauthorized_keys\n`\n\nconst renderConfigJson = (config: TemplateConfig): string =>\n `${JSON.stringify({ schemaVersion: 1, template: config }, null, 2)}\n`\n\nexport const planFiles = (config: TemplateConfig): ReadonlyArray<FileSpec> => {\n const maybePlaywrightFiles = config.enableMcpPlaywright\n ? ([\n { _tag: \"File\", relativePath: \"Dockerfile.browser\", contents: renderPlaywrightBrowserDockerfile() },\n {\n _tag: \"File\",\n relativePath: \"mcp-playwright-start-extra.sh\",\n contents: renderPlaywrightStartExtra(),\n mode: 0o755\n }\n ] satisfies ReadonlyArray<FileSpec>)\n : ([] satisfies ReadonlyArray<FileSpec>)\n\n return [\n { _tag: \"File\", relativePath: \"Dockerfile\", contents: renderDockerfile(config) },\n { _tag: \"File\", relativePath: \"entrypoint.sh\", contents: renderEntrypoint(config), mode: 0o755 },\n { _tag: \"File\", relativePath: \"docker-compose.yml\", contents: renderDockerCompose(config) },\n { _tag: \"File\", relativePath: \".dockerignore\", contents: renderDockerignore() },\n { _tag: \"File\", relativePath: \"docker-git.json\", contents: renderConfigJson(config) },\n { _tag: \"File\", relativePath: \".gitignore\", contents: renderGitignore() },\n ...maybePlaywrightFiles,\n { _tag: \"Dir\", relativePath: \".orch/auth/codex\" },\n { _tag: \"Dir\", relativePath: \".orch/env\" }\n ]\n}\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, Match } from \"effect\"\n\nimport { type TemplateConfig } from \"../core/domain.js\"\nimport { type FileSpec, planFiles } from \"../core/templates.js\"\nimport { FileExistsError } from \"./errors.js\"\nimport { resolveBaseDir } from \"./paths.js\"\n\nconst ensureParentDir = (path: Path.Path, fs: FileSystem.FileSystem, filePath: string) =>\n fs.makeDirectory(path.dirname(filePath), { recursive: true })\n\nconst isFileSpec = (spec: FileSpec): spec is Extract<FileSpec, { readonly _tag: \"File\" }> => spec._tag === \"File\"\n\nconst resolveSpecPath = (\n path: Path.Path,\n baseDir: string,\n spec: Extract<FileSpec, { readonly _tag: \"File\" }>\n): string => path.join(baseDir, spec.relativePath)\n\nconst writeSpec = (\n path: Path.Path,\n fs: FileSystem.FileSystem,\n baseDir: string,\n spec: FileSpec\n) => {\n const fullPath = path.join(baseDir, spec.relativePath)\n\n return Match.value(spec).pipe(\n Match.when({ _tag: \"Dir\" }, () => fs.makeDirectory(fullPath, { recursive: true })),\n Match.when({ _tag: \"File\" }, (file) =>\n Effect.gen(function*(_) {\n yield* _(ensureParentDir(path, fs, fullPath))\n yield* _(\n fs.writeFileString(\n fullPath,\n file.contents,\n file.mode === undefined ? undefined : { mode: file.mode }\n )\n )\n })),\n Match.exhaustive\n )\n}\n\nconst collectExistingFilePaths = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n baseDir: string,\n specs: ReadonlyArray<FileSpec>\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const existingPaths: Array<string> = []\n for (const spec of specs) {\n if (!isFileSpec(spec)) {\n continue\n }\n const filePath = resolveSpecPath(path, baseDir, spec)\n const exists = yield* _(fs.exists(filePath))\n if (exists) {\n existingPaths.push(filePath)\n }\n }\n return existingPaths\n })\n\nconst failOnExistingFiles = (\n existingFilePaths: ReadonlyArray<string>,\n skipExistingFiles: boolean\n): Effect.Effect<void, FileExistsError> => {\n if (skipExistingFiles || existingFilePaths.length === 0) {\n return Effect.void\n }\n const firstPath = existingFilePaths[0]\n if (!firstPath) {\n return Effect.void\n }\n return Effect.fail(new FileExistsError({ path: firstPath }))\n}\n\n// CHANGE: write generated docker-git files to disk\n// WHY: isolate all filesystem effects in a thin shell\n// QUOTE(ТЗ): \"создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg, dir: write(plan(cfg), dir) -> files(dir, cfg)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: does not overwrite files unless force=true\n// COMPLEXITY: O(n) where n = |files|\nexport const writeProjectFiles = (\n outDir: string,\n config: TemplateConfig,\n force: boolean,\n skipExistingFiles: boolean = false\n): Effect.Effect<\n ReadonlyArray<string>,\n FileExistsError | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved: baseDir } = yield* _(resolveBaseDir(outDir))\n\n yield* _(fs.makeDirectory(baseDir, { recursive: true }))\n\n const specs = planFiles(config)\n const created: Array<string> = []\n const existingFilePaths = force ? [] : yield* _(collectExistingFilePaths(fs, path, baseDir, specs))\n const existingSet = new Set(existingFilePaths)\n\n yield* _(failOnExistingFiles(existingFilePaths, skipExistingFiles))\n\n for (const spec of specs) {\n if (!force && skipExistingFiles && isFileSpec(spec)) {\n const filePath = resolveSpecPath(path, baseDir, spec)\n if (existingSet.has(filePath)) {\n continue\n }\n }\n yield* _(writeSpec(path, fs, baseDir, spec))\n if (isFileSpec(spec)) {\n created.push(resolveSpecPath(path, baseDir, spec))\n }\n }\n\n return created\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\n\nconst toPosixPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst isLegacyDockerGitRelativePath = (value: string): boolean => {\n const normalized = value.replaceAll(\"\\\\\", \"/\").trim()\n return normalized === \".docker-git\" ||\n normalized === \"./.docker-git\" ||\n normalized.startsWith(\".docker-git/\") ||\n normalized.startsWith(\"./.docker-git/\")\n}\n\nconst shouldNormalizePath = (path: Path.Path, value: string): boolean =>\n path.isAbsolute(value) || isLegacyDockerGitRelativePath(value)\n\nconst withFallback = (value: string, fallback: string): string => value.length > 0 ? value : fallback\n\nconst pathFieldsForNormalization = (template: TemplateConfig): ReadonlyArray<string> => [\n template.dockerGitPath,\n template.authorizedKeysPath,\n template.envGlobalPath,\n template.envProjectPath,\n template.codexAuthPath,\n template.codexSharedAuthPath\n]\n\nconst hasLegacyTemplatePaths = (path: Path.Path, template: TemplateConfig): boolean =>\n pathFieldsForNormalization(template).some((value) => shouldNormalizePath(path, value))\n\nconst normalizeTemplateConfig = (\n path: Path.Path,\n projectsRoot: string,\n projectDir: string,\n template: TemplateConfig\n): TemplateConfig | null => {\n if (!hasLegacyTemplatePaths(path, template)) {\n return null\n }\n\n // The state repo is shared across machines, so never persist absolute host paths in tracked files.\n const authorizedKeysAbs = path.join(projectsRoot, \"authorized_keys\")\n const authorizedKeysRel = toPosixPath(path.relative(projectDir, authorizedKeysAbs))\n const dockerGitRel = toPosixPath(path.relative(projectDir, projectsRoot))\n\n const envGlobalPath = \"./.orch/env/global.env\"\n const envProjectPath = \"./.orch/env/project.env\"\n const codexAuthPath = \"./.orch/auth/codex\"\n const codexSharedAbs = path.join(projectsRoot, \".orch\", \"auth\", \"codex\")\n const codexSharedRel = toPosixPath(path.relative(projectDir, codexSharedAbs))\n\n return {\n ...template,\n dockerGitPath: withFallback(dockerGitRel, \"./.docker-git\"),\n authorizedKeysPath: withFallback(authorizedKeysRel, \"./authorized_keys\"),\n envGlobalPath,\n envProjectPath,\n codexAuthPath,\n codexSharedAuthPath: withFallback(codexSharedRel, \"./.orch/auth/codex\")\n }\n}\n\n// CHANGE: normalize legacy docker-git project files inside the git-synced state repo\n// WHY: state is stored in git and must be portable across machines/OSes (no absolute host paths)\n// QUOTE(ТЗ): \"в них не должно быть зарадкожено полных путей типо /home/dev\" / \"контейнеры должны одинаково ставится на разные ОС\"\n// REF: user-request-2026-02-09-state-normalize-paths\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: normalize(p) -> portable(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: preserves repo identity (repoUrl/repoRef/containerName/ports); only rewrites host-path fields\n// COMPLEXITY: O(n) where n = |projects|\nexport const normalizeLegacyStateProjects = (\n projectsRoot: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const root = path.resolve(projectsRoot)\n const configPaths = yield* _(findDockerGitConfigPaths(fs, path, root))\n if (configPaths.length === 0) {\n return\n }\n\n let updated = 0\n for (const configPath of configPaths) {\n const projectDir = path.dirname(configPath)\n const config = yield* _(\n readProjectConfig(projectDir).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed(null),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (config === null) {\n continue\n }\n\n const normalized = normalizeTemplateConfig(path, root, projectDir, config.template)\n if (normalized === null) {\n continue\n }\n\n yield* _(\n writeProjectFiles(projectDir, normalized, true).pipe(\n Effect.catchTag(\n \"FileExistsError\",\n (error) =>\n Effect.logWarning(\n `Skipping normalization for ${projectDir}: ${error.path} already exists`\n ).pipe(Effect.zipRight(Effect.succeed<ReadonlyArray<string>>([])))\n ),\n Effect.asVoid\n )\n )\n updated += 1\n }\n\n if (updated > 0) {\n yield* _(Effect.log(`Normalized ${updated} docker-git project(s) in state repo.`))\n }\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\nimport { normalizeLegacyStateProjects } from \"../state-normalize.js\"\nimport { defaultSyncMessage } from \"./env.js\"\nimport { git, gitCapture, gitExitCode, successExitCode } from \"./git-commands.js\"\nimport type { GitAuthEnv } from \"./github-auth.js\"\nimport { tryBuildGithubCompareUrl, withGithubAskpassEnv } from \"./github-auth.js\"\n\ntype StateRepoEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveOriginPushTarget = (originUrl: string | null): string => {\n const trimmed = originUrl?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : \"origin\"\n}\n\nconst resolveSyncMessage = (value: string | null): string => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : defaultSyncMessage\n}\n\nconst logOpenPr = (originUrl: string, baseBranch: string, prBranch: string, compareUrl: string | null) =>\n compareUrl\n ? Effect.log(`Open PR: ${compareUrl}`)\n : Effect.log(`Open PR from '${prBranch}' into '${baseBranch}' (origin: ${originUrl}).`)\n\nconst commitAllIfNeeded = (\n root: string,\n message: string,\n env: GitAuthEnv\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(git(root, [\"add\", \"-A\"], env))\n const diffExit = yield* _(gitExitCode(root, [\"diff\", \"--cached\", \"--quiet\"], env))\n if (diffExit === successExitCode) {\n return\n }\n yield* _(git(root, [\"commit\", \"-m\", message], env))\n })\n\nconst sanitizeBranchComponent = (value: string): string =>\n value\n .trim()\n .replaceAll(\" \", \"-\")\n .replaceAll(\":\", \"-\")\n .replaceAll(\"..\", \"-\")\n .replaceAll(\"@{\", \"-\")\n .replaceAll(\"\\\\\", \"-\")\n .replaceAll(\"^\", \"-\")\n .replaceAll(\"~\", \"-\")\n\nconst rebaseOntoOriginIfPossible = (\n root: string,\n baseBranch: string,\n env: GitAuthEnv\n): Effect.Effect<\"ok\" | \"skipped\" | \"conflict\", CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n // Ensure we see the latest remote branch tip before attempting to rebase.\n const fetchExit = yield* _(gitExitCode(root, [\"fetch\", \"origin\", \"--prune\"], env))\n if (fetchExit !== successExitCode) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"git fetch origin --prune\", exitCode: fetchExit })))\n }\n\n const remoteRef = `refs/remotes/origin/${baseBranch}`\n const hasRemoteBranchExit = yield* _(gitExitCode(root, [\"show-ref\", \"--verify\", \"--quiet\", remoteRef], env))\n if (hasRemoteBranchExit !== successExitCode) {\n return \"skipped\"\n }\n\n const rebaseExit = yield* _(gitExitCode(root, [\"rebase\", `origin/${baseBranch}`], env))\n if (rebaseExit === successExitCode) {\n return \"ok\"\n }\n\n // Best-effort: avoid leaving the repo in a rebase-in-progress state.\n yield* _(gitExitCode(root, [\"rebase\", \"--abort\"], env))\n return \"conflict\"\n })\n\nconst pushToNewBranch = (\n root: string,\n baseBranch: string,\n originPushTarget: string,\n env: GitAuthEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const headShort = yield* _(\n gitCapture(root, [\"rev-parse\", \"--short\", \"HEAD\"], env).pipe(Effect.map((value) => value.trim()))\n )\n const timestamp = yield* _(Effect.sync(() => new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\")))\n const branch = sanitizeBranchComponent(`state-sync/${baseBranch}/${timestamp}-${headShort}`)\n\n yield* _(git(root, [\"push\", \"--no-verify\", originPushTarget, `HEAD:refs/heads/${branch}`], env))\n return branch\n })\n\nconst resolveBaseBranch = (value: string): string => (value === \"HEAD\" ? \"main\" : value)\n\nconst getCurrentBranch = (\n root: string,\n env: GitAuthEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n gitCapture(root, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], env).pipe(Effect.map((value) => value.trim()))\n\nexport const runStateSyncOps = (\n root: string,\n originUrl: string,\n message: string | null,\n env: GitAuthEnv,\n options?: { readonly originPushUrlOverride?: string | null }\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const originPushUrlOverride = options?.originPushUrlOverride ?? null\n const originPushTarget = resolveOriginPushTarget(originPushUrlOverride)\n yield* _(normalizeLegacyStateProjects(root))\n yield* _(commitAllIfNeeded(root, resolveSyncMessage(message), env))\n\n const branch = yield* _(getCurrentBranch(root, env))\n const baseBranch = resolveBaseBranch(branch)\n\n const rebaseResult = yield* _(rebaseOntoOriginIfPossible(root, baseBranch, env))\n if (rebaseResult === \"conflict\") {\n const prBranch = yield* _(pushToNewBranch(root, baseBranch, originPushTarget, env))\n const compareUrl = tryBuildGithubCompareUrl(originUrl, baseBranch, prBranch)\n\n yield* _(Effect.logWarning(`State sync needs manual merge: pushed changes to branch '${prBranch}'.`))\n yield* _(logOpenPr(originUrl, baseBranch, prBranch, compareUrl))\n return\n }\n\n const pushExit = yield* _(\n gitExitCode(root, [\"push\", \"--no-verify\", originPushTarget, `HEAD:refs/heads/${baseBranch}`], env)\n )\n if (pushExit === successExitCode) {\n return\n }\n\n const prBranch = yield* _(pushToNewBranch(root, baseBranch, originPushTarget, env))\n const compareUrl = tryBuildGithubCompareUrl(originUrl, baseBranch, prBranch)\n yield* _(Effect.logWarning(`State push failed (exit ${pushExit}); pushed changes to branch '${prBranch}'.`))\n yield* _(logOpenPr(originUrl, baseBranch, prBranch, compareUrl))\n }).pipe(Effect.asVoid)\n\nexport const runStateSyncWithToken = (\n token: string,\n root: string,\n originUrl: string,\n message: string | null\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n withGithubAskpassEnv(\n token,\n (env) => runStateSyncOps(root, originUrl, message, env, { originPushUrlOverride: originUrl })\n )\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\nimport { runCommandExitCode } from \"../shell/command-runner.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { defaultProjectsRoot } from \"./menu-helpers.js\"\nimport { autoSyncEnvKey, autoSyncStrictEnvKey, isAutoSyncEnabled, isTruthyEnv } from \"./state-repo/env.js\"\nimport {\n git,\n gitBaseEnv,\n gitCapture,\n gitExitCode,\n hasOriginRemote,\n isGitRepo,\n successExitCode\n} from \"./state-repo/git-commands.js\"\nimport { isGithubHttpsRemote, resolveGithubToken, withGithubAskpassEnv } from \"./state-repo/github-auth.js\"\nimport { ensureStateGitignore } from \"./state-repo/gitignore.js\"\nimport { runStateSyncOps, runStateSyncWithToken } from \"./state-repo/sync-ops.js\"\n\ntype StateRepoEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveStateRoot = (path: Path.Path, cwd: string): string => path.resolve(defaultProjectsRoot(cwd))\n\nconst managedRepositoryCachePaths: ReadonlyArray<string> = [\".cache/git-mirrors\", \".cache/packages\"]\n\nconst ensureStateIgnoreAndUntrackCaches = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n yield* _(ensureStateGitignore(fs, path, root))\n // Best-effort idempotent cleanup: keep cache artifacts out of git history.\n yield* _(git(root, [\"rm\", \"-r\", \"--cached\", \"--ignore-unmatch\", ...managedRepositoryCachePaths], gitBaseEnv))\n }).pipe(Effect.asVoid)\n\nexport const statePath: Effect.Effect<void, PlatformError, Path.Path> = Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const cwd = process.cwd()\n const root = resolveStateRoot(path, cwd)\n yield* _(Effect.log(root))\n}).pipe(Effect.asVoid)\n\nexport const stateSync = (\n message: string | null\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n const repoExit = yield* _(gitExitCode(root, [\"rev-parse\", \"--is-inside-work-tree\"], gitBaseEnv))\n if (repoExit !== successExitCode) {\n yield* _(Effect.logWarning(`State dir is not a git repository: ${root}`))\n yield* _(Effect.logWarning(`Run: docker-git state init --repo-url <url>`))\n return yield* _(\n Effect.fail(new CommandFailedError({ command: \"git rev-parse --is-inside-work-tree\", exitCode: repoExit }))\n )\n }\n\n yield* _(ensureStateIgnoreAndUntrackCaches(fs, path, root))\n\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(Effect.logWarning(`State dir has no origin remote: ${root}`))\n yield* _(Effect.logWarning(`Run: docker-git state init --repo-url <url>`))\n return yield* _(\n Effect.fail(new CommandFailedError({ command: \"git remote get-url origin\", exitCode: originUrlExit }))\n )\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const syncEffect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? runStateSyncWithToken(token, root, originUrl, message)\n : runStateSyncOps(root, originUrl, message, gitBaseEnv)\n\n yield* _(syncEffect)\n }).pipe(Effect.asVoid)\n\nexport const autoSyncState = (message: string): Effect.Effect<void, never, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n const repoOk = yield* _(isGitRepo(root))\n if (!repoOk) {\n return\n }\n\n const originOk = yield* _(hasOriginRemote(root))\n const enabled = isAutoSyncEnabled(process.env[autoSyncEnvKey], originOk)\n if (!enabled) {\n return\n }\n\n const strictValue = process.env[autoSyncStrictEnvKey]\n const strict = strictValue !== undefined && strictValue.trim().length > 0 ? isTruthyEnv(strictValue) : false\n const effect = stateSync(message)\n if (strict) {\n yield* _(effect)\n return\n }\n yield* _(\n effect.pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `State auto-sync failed: ${\n error._tag === \"CommandFailedError\"\n ? `${error.command} (exit ${error.exitCode})`\n : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n )\n }).pipe(\n Effect.matchEffect({\n onFailure: (error) => Effect.logWarning(`State auto-sync failed: ${String(error)}`),\n onSuccess: () => Effect.void\n }),\n Effect.asVoid\n )\n\ntype StateInitInput = {\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nconst cloneStateRepo = (\n root: string,\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const cloneWithBranch = [\"clone\", \"--branch\", input.repoRef, input.repoUrl, root]\n const cloneBranchExit = yield* _(\n runCommandExitCode({ cwd: root, command: \"git\", args: cloneWithBranch, env: gitBaseEnv })\n )\n if (cloneBranchExit === successExitCode) {\n return\n }\n\n // Empty remotes (no branch yet) and remotes without the requested branch can fail here.\n // Fall back to cloning the default branch so we can still set up the repo and create the branch locally.\n yield* _(\n Effect.logWarning(\n `git clone --branch ${input.repoRef} failed (exit ${cloneBranchExit}); retrying without --branch`\n )\n )\n const cloneDefault = [\"clone\", input.repoUrl, root]\n const cloneDefaultExit = yield* _(\n runCommandExitCode({ cwd: root, command: \"git\", args: cloneDefault, env: gitBaseEnv })\n )\n if (cloneDefaultExit !== successExitCode) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"git clone\", exitCode: cloneDefaultExit })))\n }\n }).pipe(Effect.asVoid)\n\nconst initRepoIfNeeded = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string,\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n yield* _(fs.makeDirectory(root, { recursive: true }))\n\n const gitDir = path.join(root, \".git\")\n const hasGit = yield* _(fs.exists(gitDir))\n if (hasGit) {\n return\n }\n\n const entries = yield* _(fs.readDirectory(root))\n if (entries.length === 0) {\n yield* _(cloneStateRepo(root, input))\n yield* _(Effect.log(`State dir cloned: ${root}`))\n return\n }\n\n yield* _(git(root, [\"init\"], gitBaseEnv))\n }).pipe(Effect.asVoid)\n\nconst ensureOriginRemote = (\n root: string,\n repoUrl: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const setUrlExit = yield* _(gitExitCode(root, [\"remote\", \"set-url\", \"origin\", repoUrl], gitBaseEnv))\n if (setUrlExit === successExitCode) {\n return\n }\n yield* _(git(root, [\"remote\", \"add\", \"origin\", repoUrl], gitBaseEnv))\n })\n\nconst checkoutBranchBestEffort = (\n root: string,\n repoRef: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const checkoutExit = yield* _(gitExitCode(root, [\"checkout\", \"-B\", repoRef], gitBaseEnv))\n if (checkoutExit === successExitCode) {\n return\n }\n yield* _(Effect.logWarning(`git checkout -B ${repoRef} failed (exit ${checkoutExit})`))\n })\n\nexport const stateInit = (\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n yield* _(initRepoIfNeeded(fs, path, root, input))\n yield* _(ensureOriginRemote(root, input.repoUrl))\n yield* _(checkoutBranchBestEffort(root, input.repoRef))\n yield* _(ensureStateGitignore(fs, path, root))\n\n yield* _(Effect.log(`State dir ready: ${root}`))\n yield* _(Effect.log(`Remote: ${input.repoUrl}`))\n }).pipe(Effect.asVoid)\n\nexport const stateStatus = Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const output = yield* _(gitCapture(root, [\"status\", \"-sb\", \"--porcelain=v1\"], gitBaseEnv))\n yield* _(Effect.log(output.trim().length > 0 ? output.trimEnd() : \"(clean)\"))\n}).pipe(Effect.asVoid)\n\nexport const statePull = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(git(root, [\"pull\", \"--rebase\"], gitBaseEnv))\n return\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const effect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? withGithubAskpassEnv(token, (env) => git(root, [\"pull\", \"--rebase\"], env))\n : git(root, [\"pull\", \"--rebase\"], gitBaseEnv)\n yield* _(effect)\n}).pipe(Effect.asVoid)\n\nexport const statePush = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(git(root, [\"push\", \"-u\", \"origin\", \"HEAD\"], gitBaseEnv))\n return\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const effect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? withGithubAskpassEnv(\n token,\n (env) =>\n pipe(\n gitCapture(root, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], env),\n Effect.map((value) => value.trim()),\n Effect.map((branch) => (branch === \"HEAD\" ? \"main\" : branch)),\n Effect.flatMap((branch) => git(root, [\"push\", \"--no-verify\", originUrl, `HEAD:refs/heads/${branch}`], env))\n )\n )\n : git(root, [\"push\", \"--no-verify\", \"-u\", \"origin\", \"HEAD\"], gitBaseEnv)\n yield* _(effect)\n}).pipe(Effect.asVoid)\n\nexport const stateCommit = (\n message: string\n): Effect.Effect<\n void,\n CommandFailedError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n yield* _(ensureStateIgnoreAndUntrackCaches(fs, path, root))\n yield* _(git(root, [\"add\", \"-A\"], gitBaseEnv))\n const diffExit = yield* _(gitExitCode(root, [\"diff\", \"--cached\", \"--quiet\"], gitBaseEnv))\n\n if (diffExit === successExitCode) {\n yield* _(Effect.log(\"Nothing to commit.\"))\n return\n }\n\n yield* _(git(root, [\"commit\", \"-m\", message], gitBaseEnv))\n }).pipe(Effect.asVoid)\n","import { Effect } from \"effect\"\n\nconst cursorVisibleEscape = \"\\u001B[?25h\"\n\nconst hasInteractiveTty = (): boolean => process.stdin.isTTY && process.stdout.isTTY\n\n// CHANGE: ensure the terminal cursor is visible before handing control to interactive SSH\n// WHY: Ink/TTY transitions can leave cursor hidden, which makes SSH shells look frozen\n// QUOTE(ТЗ): \"не виден курсор в SSH терминале\"\n// REF: issue-3\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: interactive(t) -> cursor_visible(t)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, never>\n// INVARIANT: escape sequence is emitted only in interactive tty mode\n// COMPLEXITY: O(1)\nexport const ensureTerminalCursorVisible = (): Effect.Effect<void> =>\n Effect.sync(() => {\n if (!hasInteractiveTty()) {\n return\n }\n process.stdout.write(cursorVisibleEscape)\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect } from \"effect\"\n\nimport {\n defaultTemplateConfig,\n resolveComposeNetworkName,\n type TemplateConfig\n} from \"../core/domain.js\"\nimport {\n runDockerNetworkContainerCount,\n runDockerNetworkCreateBridge,\n runDockerNetworkExists,\n runDockerNetworkRemove\n} from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\n\nconst protectedNetworkNames = new Set([\"bridge\", \"host\", \"none\"])\n\nconst isProtectedNetwork = (networkName: string, sharedNetworkName: string): boolean =>\n protectedNetworkNames.has(networkName) || networkName === sharedNetworkName\n\n// CHANGE: ensure shared docker network exists before compose up\n// WHY: avoid compose failures when using `external: true` shared network mode\n// QUOTE(ТЗ): \"Что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cfg: mode(cfg)=\"shared\" -> exists(network(cfg))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: no-op for project-scoped network mode\n// COMPLEXITY: O(command)\nexport const ensureComposeNetworkReady = (\n cwd: string,\n template: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor> => {\n if (template.dockerNetworkMode !== \"shared\") {\n return Effect.void\n }\n\n const networkName = resolveComposeNetworkName(template)\n return runDockerNetworkExists(cwd, networkName).pipe(\n Effect.flatMap((exists) =>\n exists\n ? Effect.void\n : Effect.log(`Creating shared Docker network: ${networkName}`).pipe(\n Effect.zipRight(runDockerNetworkCreateBridge(cwd, networkName))\n ))\n )\n}\n\nconst gcNetworkByName = (\n cwd: string,\n networkName: string,\n sharedNetworkName: string\n): Effect.Effect<void, never, CommandExecutor> => {\n if (isProtectedNetwork(networkName, sharedNetworkName)) {\n return Effect.void\n }\n\n return runDockerNetworkContainerCount(cwd, networkName).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Skipping network GC for ${networkName}: ${error instanceof Error ? error.message : String(error)}`\n ),\n onSuccess: (containerCount) => {\n if (containerCount > 0) {\n return Effect.void\n }\n return runDockerNetworkRemove(cwd, networkName).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to remove detached network ${networkName}: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.log(`Removed detached docker-git network: ${networkName}`)\n })\n )\n }\n }),\n Effect.asVoid\n )\n}\n\n// CHANGE: garbage-collect detached project-scoped docker-git networks\n// WHY: prevent stale networks from exhausting Docker address pools\n// QUOTE(ТЗ): \"убирать мусорные сети автоматически\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: detached(n) -> eventually_removed(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, CommandExecutor>\n// INVARIANT: shared/system networks are never removed\n// COMPLEXITY: O(command)\nexport const gcProjectNetworkByTemplate = (\n cwd: string,\n template: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): Effect.Effect<void, never, CommandExecutor> => {\n if (template.dockerNetworkMode !== \"project\") {\n return Effect.void\n }\n\n return gcNetworkByName(cwd, resolveComposeNetworkName(template), template.dockerSharedNetworkName)\n}\n\n// CHANGE: best-effort cleanup of legacy project-scoped network by service name\n// WHY: delete flow may run after project files are gone, so we fallback to naming convention\n// QUOTE(ТЗ): \"Только так что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: gc(service=s) -> removes_only(detached_network(s))\n// PURITY: SHELL\n// EFFECT: Effect<void, never, CommandExecutor>\n// INVARIANT: never removes bridge/host/none/shared network names\n// COMPLEXITY: O(command)\nexport const gcProjectNetworkByServiceName = (\n cwd: string,\n serviceName: string,\n sharedNetworkName: string = defaultTemplateConfig.dockerSharedNetworkName\n): Effect.Effect<void, never, CommandExecutor> =>\n gcNetworkByName(cwd, `${serviceName}-net`, sharedNetworkName)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { deriveRepoPathParts } from \"../core/domain.js\"\nimport { runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { runDockerComposeDownVolumes } from \"../shell/docker.js\"\nimport { CommandFailedError, type DockerCommandError } from \"../shell/errors.js\"\nimport { gcProjectNetworkByServiceName } from \"./docker-network-gc.js\"\nimport { renderError } from \"./errors.js\"\nimport { defaultProjectsRoot } from \"./menu-helpers.js\"\nimport type { ProjectItem } from \"./projects-core.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\nconst isWithinProjectsRoot = (path: Path.Path, root: string, target: string): boolean => {\n const relative = path.relative(root, target)\n if (relative.length === 0) {\n return false\n }\n if (relative === \"..\") {\n return false\n }\n if (relative.startsWith(`..${path.sep}`)) {\n return false\n }\n return true\n}\n\nconst removeContainerByName = (\n cwd: string,\n containerName: string\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"rm\", \"-f\", containerName]\n },\n [0],\n (exitCode) => new CommandFailedError({ command: `docker rm -f ${containerName}`, exitCode })\n ).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(`docker rm -f fallback failed for ${containerName}: ${renderError(error)}`),\n onSuccess: () => Effect.log(`Removed container: ${containerName}`)\n }),\n Effect.asVoid\n )\n\nconst removeContainersFallback = (\n item: ProjectItem\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(removeContainerByName(item.projectDir, item.containerName))\n yield* _(removeContainerByName(item.projectDir, `${item.containerName}-browser`))\n })\n\n// CHANGE: delete a docker-git project directory (state) selected in the TUI\n// WHY: allow removing unwanted projects without rewriting git history (just delete the folder)\n// QUOTE(ТЗ): \"Сделай возможность так же удалять мусорный для меня контейнер... Не нужно чистить гит историю. Пусть просто папку с ним удалит\"\n// REF: user-request-2026-02-09-delete-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: delete(p) -> !exists(projectDir(p)) && !container_exists(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError | DockerCommandError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never deletes paths outside the projects root\n// COMPLEXITY: O(docker + fs)\nexport const deleteDockerGitProject = (\n item: ProjectItem\n): Effect.Effect<\n void,\n PlatformError | DockerCommandError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const root = path.resolve(defaultProjectsRoot(process.cwd()))\n const targetDir = path.resolve(item.projectDir)\n\n if (!isWithinProjectsRoot(path, root, targetDir)) {\n yield* _(Effect.logWarning(`Refusing to delete path outside projects root: ${targetDir}`))\n return\n }\n\n const exists = yield* _(fs.exists(targetDir))\n if (!exists) {\n yield* _(Effect.logWarning(`Project directory already missing: ${targetDir}`))\n return\n }\n\n // Best-effort: remove compose containers and volumes before deleting the project folder.\n yield* _(\n runDockerComposeDownVolumes(targetDir).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.gen(function*(_) {\n yield* _(Effect.logWarning(`docker compose down -v failed before delete: ${renderError(error)}`))\n yield* _(removeContainersFallback(item))\n }),\n onSuccess: () => Effect.void\n })\n )\n )\n yield* _(gcProjectNetworkByServiceName(targetDir, item.serviceName))\n\n yield* _(fs.remove(targetDir, { recursive: true, force: true }))\n\n const repoParts = deriveRepoPathParts(item.repoUrl).pathParts\n const label = repoParts.length > 0 ? repoParts.join(\"/\") : item.repoUrl\n yield* _(autoSyncState(`chore(state): delete ${label}`))\n }).pipe(Effect.asVoid)\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runDockerComposeDown } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\nimport { gcProjectNetworkByTemplate } from \"./docker-network-gc.js\"\nimport { renderError } from \"./errors.js\"\nimport { forEachProjectStatus, loadProjectIndex, renderProjectStatusHeader } from \"./projects-core.js\"\n\n// CHANGE: provide a \"stop all\" helper for docker-git managed projects\n// WHY: allow quickly stopping all running docker-git containers from the CLI/TUI\n// QUOTE(ТЗ): \"Выведи сюда возможность убивать все контейнеры\"\n// REF: user-request-2026-02-06-stop-all\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p ∈ Projects: downAll(p) → stopped(p) ∨ warned(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: continues stopping other projects when one docker compose down fails with DockerCommandError\n// COMPLEXITY: O(n) where n = |projects|\nexport const downAllDockerGitProjects: Effect.Effect<\n void,\n PlatformError,\n FileSystem | Path | CommandExecutor\n> = pipe(\n loadProjectIndex(),\n Effect.flatMap((index) =>\n index === null\n ? Effect.void\n : forEachProjectStatus(index.configPaths, (status) =>\n pipe(\n Effect.log(renderProjectStatusHeader(status)),\n Effect.zipRight(\n runDockerComposeDown(status.projectDir).pipe(\n Effect.catchTag(\"DockerCommandError\", (error: DockerCommandError) =>\n Effect.logWarning(\n `docker compose down failed for ${status.projectDir}: ${renderError(error)}`\n )),\n Effect.zipRight(gcProjectNetworkByTemplate(status.projectDir, status.config.template))\n )\n )\n ))\n ),\n Effect.asVoid\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runDockerPsNames } from \"../shell/docker.js\"\nimport type { CommandFailedError } from \"../shell/errors.js\"\nimport {\n loadProjectItem,\n loadProjectSummary,\n type ProjectItem,\n type ProjectSummary,\n renderProjectSummary,\n skipWithWarning,\n withProjectIndexAndSsh\n} from \"./projects-core.js\"\n\n// CHANGE: list docker-git projects with SSH connection info\n// WHY: provide a deterministic inventory of created environments\n// QUOTE(ТЗ): \"мне нужны мои... доступы к ним по SSH\"\n// REF: user-request-2026-01-27-list\n// SOURCE: n/a\n// FORMAT THEOREM: forall root: list(root) -> summaries(root)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: output is deterministic for a stable filesystem\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjects: Effect.Effect<\n void,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = pipe(\n withProjectIndexAndSsh((index, sshKey) =>\n Effect.gen(function*(_) {\n const available: Array<ProjectSummary> = []\n\n for (const configPath of index.configPaths) {\n const summary = yield* _(\n loadProjectSummary(configPath, sshKey).pipe(\n Effect.matchEffect({\n onFailure: skipWithWarning<ProjectSummary>(configPath),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (summary !== null) {\n available.push(summary)\n }\n }\n if (available.length === 0) {\n yield* _(Effect.log(`No readable docker-git projects found in ${index.projectsRoot}`))\n return\n }\n\n yield* _(Effect.log(`Found ${available.length} docker-git project(s) in ${index.projectsRoot}`))\n for (const summary of available) {\n yield* _(Effect.log(renderProjectSummary(summary)))\n }\n })\n ),\n Effect.asVoid\n)\n\n// CHANGE: collect docker-git connection info lines without logging\n// WHY: allow TUI to render connection info inline\n// QUOTE(ТЗ): \"А кнопка \\\"Show connection info\\\" ничего не отображает\"\n// REF: user-request-2026-02-01-tui-info\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: summary(p) -> line(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, PlatformError, FileSystem | Path>\n// INVARIANT: output order matches configPaths order\n// COMPLEXITY: O(n) where n = |projects|\nconst emptySummaries = (): ReadonlyArray<string> => []\nconst emptyItems = (): ReadonlyArray<ProjectItem> => []\n\nconst collectProjectValues = <A, B, E>(\n configPaths: ReadonlyArray<string>,\n sshKey: string | null,\n load: (configPath: string, sshKey: string | null) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path>,\n toValue: (value: A) => B\n): Effect.Effect<ReadonlyArray<B>, never, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const available: Array<B> = []\n\n for (const configPath of configPaths) {\n const value = yield* _(\n load(configPath, sshKey).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed(null),\n onSuccess: (item) => Effect.succeed(toValue(item))\n })\n )\n )\n if (value !== null) {\n available.push(value)\n }\n }\n\n return available\n })\n\nconst listProjectValues = <A, B, E>(\n load: (configPath: string, sshKey: string | null) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path>,\n toValue: (value: A) => B,\n empty: () => ReadonlyArray<B>\n): Effect.Effect<ReadonlyArray<B>, PlatformError, FileSystem.FileSystem | Path.Path> =>\n pipe(\n withProjectIndexAndSsh((index, sshKey) => collectProjectValues(index.configPaths, sshKey, load, toValue)),\n Effect.map((values) => values ?? empty())\n )\n\nexport const listProjectSummaries: Effect.Effect<\n ReadonlyArray<string>,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = listProjectValues(loadProjectSummary, renderProjectSummary, emptySummaries)\n\n// CHANGE: load docker-git projects for TUI selection\n// WHY: provide structured project data without noisy logs\n// QUOTE(ТЗ): \"А ты можешь сделать удобный выбор проектов?\"\n// REF: user-request-2026-02-02-select-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: item(p) -> selectable(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ProjectItem>, PlatformError, FileSystem | Path>\n// INVARIANT: output order matches configPaths order\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjectItems: Effect.Effect<\n ReadonlyArray<ProjectItem>,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = listProjectValues(loadProjectItem, (value) => value, emptyItems)\n\n// CHANGE: list only running docker-git projects (for \"Stop container\" UI)\n// WHY: stopping already-stopped projects is confusing and noisy\n// QUOTE(ТЗ): \"Смысл мне пытаться остановить тот контейнер который уже остановлен?\"\n// REF: user-request-2026-02-07-stop-only-running\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: running(container(p))\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ProjectItem>, PlatformError | CommandFailedError, FileSystem | Path | CommandExecutor>\n// INVARIANT: result order follows listProjectItems order\n// COMPLEXITY: O(n + command)\nexport const listRunningProjectItems: Effect.Effect<\n ReadonlyArray<ProjectItem>,\n PlatformError | CommandFailedError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> = pipe(\n Effect.all([listProjectItems, runDockerPsNames(process.cwd())]),\n Effect.map(([items, runningNames]) => items.filter((item) => runningNames.includes(item.containerName)))\n)\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nconst copyDirRecursive = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const sourceInfo = yield* _(fs.stat(sourcePath))\n if (sourceInfo.type !== \"Directory\") {\n return\n }\n yield* _(fs.makeDirectory(targetPath, { recursive: true }))\n const entries = yield* _(fs.readDirectory(sourcePath))\n for (const entry of entries) {\n const sourceEntry = path.join(sourcePath, entry)\n const targetEntry = path.join(targetPath, entry)\n const entryInfo = yield* _(fs.stat(sourceEntry))\n if (entryInfo.type === \"Directory\") {\n yield* _(copyDirRecursive(fs, path, sourceEntry, targetEntry))\n } else if (entryInfo.type === \"File\") {\n yield* _(fs.copyFile(sourceEntry, targetEntry))\n }\n }\n })\n\ntype CodexFileCopySpec = {\n readonly sourceDir: string\n readonly targetDir: string\n readonly fileName: string\n readonly label: string\n}\n\nexport const copyCodexFile = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n spec: CodexFileCopySpec\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const sourceFile = path.join(spec.sourceDir, spec.fileName)\n const targetFile = path.join(spec.targetDir, spec.fileName)\n const sourceExists = yield* _(fs.exists(sourceFile))\n if (!sourceExists) {\n return\n }\n const targetExists = yield* _(fs.exists(targetFile))\n if (targetExists) {\n return\n }\n yield* _(fs.copyFile(sourceFile, targetFile))\n yield* _(Effect.log(`Copied Codex ${spec.label} from ${sourceFile} to ${targetFile}`))\n })\n\nexport const copyDirIfEmpty = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourceDir: string,\n targetDir: string,\n label: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n if (sourceDir === targetDir) {\n return\n }\n const sourceExists = yield* _(fs.exists(sourceDir))\n if (!sourceExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourceDir))\n if (sourceInfo.type !== \"Directory\") {\n return\n }\n yield* _(fs.makeDirectory(targetDir, { recursive: true }))\n const targetEntries = yield* _(fs.readDirectory(targetDir))\n if (targetEntries.length > 0) {\n return\n }\n yield* _(copyDirRecursive(fs, path, sourceDir, targetDir))\n yield* _(Effect.log(`Copied ${label} from ${sourceDir} to ${targetDir}`))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport { copyCodexFile, copyDirIfEmpty } from \"./auth-copy.js\"\nimport { parseEnvEntries, removeEnvKey, upsertEnvKey } from \"./env-file.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\ntype CopyDecision = \"skip\" | \"copy\"\n\nconst defaultEnvContents = \"# docker-git env\\n# KEY=value\\n\"\n// CHANGE: enable web search tool in default Codex config (top-level)\n// WHY: avoid deprecated legacy flags and keep config minimal\n// QUOTE(ТЗ): \"да убери легаси\"\n// REF: user-request-2026-02-05-remove-legacy-web-search\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: config(c) -> web_search(c)=\"live\"\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: default config stays deterministic\n// COMPLEXITY: O(1)\nconst defaultCodexConfig = [\n \"# docker-git codex config\",\n \"model = \\\"gpt-5.3-codex\\\"\",\n \"model_reasoning_effort = \\\"xhigh\\\"\",\n \"personality = \\\"pragmatic\\\"\",\n \"\",\n \"approval_policy = \\\"never\\\"\",\n \"sandbox_mode = \\\"danger-full-access\\\"\",\n \"web_search = \\\"live\\\"\",\n \"\",\n \"[features]\",\n \"shell_snapshot = true\",\n \"multi_agent = true\",\n \"apps = true\",\n \"shell_tool = true\"\n].join(\"\\n\")\n\nconst resolvePathFromBase = (path: Path.Path, baseDir: string, targetPath: string): string =>\n path.isAbsolute(targetPath) ? targetPath : path.resolve(baseDir, targetPath)\n\nconst codexConfigMarker = \"# docker-git codex config\"\n\nconst normalizeConfigText = (text: string): string =>\n text\n .replaceAll(\"\\r\\n\", \"\\n\")\n .trim()\n\nconst shouldRewriteDockerGitCodexConfig = (existing: string): boolean => {\n const normalized = normalizeConfigText(existing)\n if (normalized.length === 0) {\n return true\n }\n if (!normalized.startsWith(codexConfigMarker)) {\n return false\n }\n return normalized !== normalizeConfigText(defaultCodexConfig)\n}\n\nconst shouldCopyEnv = (sourceText: string, targetText: string): CopyDecision => {\n if (sourceText.trim().length === 0) {\n return \"skip\"\n }\n if (targetText.trim().length === 0) {\n return \"copy\"\n }\n if (targetText.trim() === defaultEnvContents.trim() && sourceText.trim() !== defaultEnvContents.trim()) {\n return \"copy\"\n }\n return \"skip\"\n}\n\nconst isGithubTokenKey = (key: string): boolean =>\n key === \"GITHUB_TOKEN\" || key === \"GH_TOKEN\" || key.startsWith(\"GITHUB_TOKEN__\")\n\n// CHANGE: synchronize GitHub auth keys between env files\n// WHY: avoid stale per-project tokens that cause clone auth failures after token rotation\n// QUOTE(ТЗ): n/a\n// REF: user-request-2026-02-11-clone-invalid-token\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k ∈ github_token_keys: source(k)=v → merged(k)=v\n// PURITY: CORE\n// INVARIANT: non-auth keys in target are preserved\n// COMPLEXITY: O(n) where n = |env entries|\nexport const syncGithubAuthKeys = (sourceText: string, targetText: string): string => {\n const sourceTokenEntries = parseEnvEntries(sourceText).filter((entry) => isGithubTokenKey(entry.key))\n if (sourceTokenEntries.length === 0) {\n return targetText\n }\n\n const targetTokenKeys = parseEnvEntries(targetText)\n .filter((entry) => isGithubTokenKey(entry.key))\n .map((entry) => entry.key)\n\n let next = targetText\n for (const key of targetTokenKeys) {\n next = removeEnvKey(next, key)\n }\n for (const entry of sourceTokenEntries) {\n next = upsertEnvKey(next, entry.key, entry.value)\n }\n\n return next\n}\n\nconst syncGithubTokenKeysInFile = (\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs }) =>\n Effect.gen(function*(_) {\n const sourceExists = yield* _(fs.exists(sourcePath))\n if (!sourceExists) {\n return\n }\n const targetExists = yield* _(fs.exists(targetPath))\n if (!targetExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourcePath))\n const targetInfo = yield* _(fs.stat(targetPath))\n if (sourceInfo.type !== \"File\" || targetInfo.type !== \"File\") {\n return\n }\n\n const sourceText = yield* _(fs.readFileString(sourcePath))\n const targetText = yield* _(fs.readFileString(targetPath))\n const mergedText = syncGithubAuthKeys(sourceText, targetText)\n if (mergedText !== targetText) {\n yield* _(fs.writeFileString(targetPath, mergedText))\n yield* _(Effect.log(`Synced GitHub auth keys from ${sourcePath} to ${targetPath}`))\n }\n })\n )\n\nconst copyFileIfNeeded = (\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const sourceExists = yield* _(fs.exists(sourcePath))\n if (!sourceExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourcePath))\n if (sourceInfo.type !== \"File\") {\n return\n }\n yield* _(fs.makeDirectory(path.dirname(targetPath), { recursive: true }))\n const targetExists = yield* _(fs.exists(targetPath))\n if (!targetExists) {\n yield* _(fs.copyFile(sourcePath, targetPath))\n yield* _(Effect.log(`Copied env file from ${sourcePath} to ${targetPath}`))\n return\n }\n const sourceText = yield* _(fs.readFileString(sourcePath))\n const targetText = yield* _(fs.readFileString(targetPath))\n if (shouldCopyEnv(sourceText, targetText) === \"copy\") {\n yield* _(fs.writeFileString(targetPath, sourceText))\n yield* _(Effect.log(`Synced env file from ${sourcePath} to ${targetPath}`))\n }\n })\n )\n\n// CHANGE: ensure Codex config exists with full-access defaults\n// WHY: enable all codex commands without extra prompts inside containers\n// QUOTE(ТЗ): \"сразу настраивал полностью весь доступ ко всем командам\"\n// REF: user-request-2026-01-30-codex-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: missing(config(p)) -> config(p)=defaults\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: rewrites only docker-git-managed configs to keep defaults in sync\n// COMPLEXITY: O(n) where n = |config|\nexport const ensureCodexConfigFile = (\n baseDir: string,\n codexAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolvePathFromBase(path, baseDir, codexAuthPath)\n const configPath = path.join(resolved, \"config.toml\")\n const exists = yield* _(fs.exists(configPath))\n if (exists) {\n const current = yield* _(fs.readFileString(configPath))\n if (!shouldRewriteDockerGitCodexConfig(current)) {\n return\n }\n yield* _(fs.writeFileString(configPath, defaultCodexConfig))\n yield* _(Effect.log(`Updated Codex config at ${configPath}`))\n return\n }\n yield* _(fs.makeDirectory(resolved, { recursive: true }))\n yield* _(fs.writeFileString(configPath, defaultCodexConfig))\n yield* _(Effect.log(`Created Codex config at ${configPath}`))\n })\n )\n\ntype AuthPaths = {\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n}\n\nexport type AuthSyncSpec = {\n readonly sourceBase: string\n readonly targetBase: string\n readonly source: AuthPaths\n readonly target: AuthPaths\n}\n\nexport const syncAuthArtifacts = (\n spec: AuthSyncSpec\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const sourceGlobal = resolvePathFromBase(path, spec.sourceBase, spec.source.envGlobalPath)\n const targetGlobal = resolvePathFromBase(path, spec.targetBase, spec.target.envGlobalPath)\n const sourceProject = resolvePathFromBase(path, spec.sourceBase, spec.source.envProjectPath)\n const targetProject = resolvePathFromBase(path, spec.targetBase, spec.target.envProjectPath)\n const sourceCodex = resolvePathFromBase(path, spec.sourceBase, spec.source.codexAuthPath)\n const targetCodex = resolvePathFromBase(path, spec.targetBase, spec.target.codexAuthPath)\n\n yield* _(copyFileIfNeeded(sourceGlobal, targetGlobal))\n yield* _(syncGithubTokenKeysInFile(sourceGlobal, targetGlobal))\n yield* _(copyFileIfNeeded(sourceProject, targetProject))\n yield* _(fs.makeDirectory(targetCodex, { recursive: true }))\n if (sourceCodex !== targetCodex) {\n const sourceExists = yield* _(fs.exists(sourceCodex))\n if (sourceExists) {\n const sourceInfo = yield* _(fs.stat(sourceCodex))\n if (sourceInfo.type === \"Directory\") {\n const targetExists = yield* _(fs.exists(targetCodex))\n if (!targetExists) {\n yield* _(fs.makeDirectory(targetCodex, { recursive: true }))\n }\n // NOTE: We intentionally do not copy auth.json.\n // ChatGPT refresh tokens are rotating; copying them into each project causes refresh_token_reused.\n yield* _(\n copyCodexFile(fs, path, {\n sourceDir: sourceCodex,\n targetDir: targetCodex,\n fileName: \"config.toml\",\n label: \"config\"\n })\n )\n }\n }\n }\n })\n )\n\nexport const migrateLegacyOrchLayout = (\n baseDir: string,\n envGlobalPath: string,\n envProjectPath: string,\n codexAuthPath: string,\n ghAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const legacyRoot = path.resolve(baseDir, \".orch\")\n const legacyExists = yield* _(fs.exists(legacyRoot))\n if (!legacyExists) {\n return\n }\n const legacyInfo = yield* _(fs.stat(legacyRoot))\n if (legacyInfo.type !== \"Directory\") {\n return\n }\n\n const legacyEnvGlobal = path.join(legacyRoot, \"env\", \"global.env\")\n const legacyEnvProject = path.join(legacyRoot, \"env\", \"project.env\")\n const legacyCodex = path.join(legacyRoot, \"auth\", \"codex\")\n const legacyGh = path.join(legacyRoot, \"auth\", \"gh\")\n\n const resolvedEnvGlobal = resolvePathFromBase(path, baseDir, envGlobalPath)\n const resolvedEnvProject = resolvePathFromBase(path, baseDir, envProjectPath)\n const resolvedCodex = resolvePathFromBase(path, baseDir, codexAuthPath)\n const resolvedGh = resolvePathFromBase(path, baseDir, ghAuthPath)\n\n yield* _(copyFileIfNeeded(legacyEnvGlobal, resolvedEnvGlobal))\n yield* _(copyFileIfNeeded(legacyEnvProject, resolvedEnvProject))\n yield* _(copyDirIfEmpty(fs, path, legacyCodex, resolvedCodex, \"Codex auth\"))\n yield* _(copyDirIfEmpty(fs, path, legacyGh, resolvedGh, \"GH auth\"))\n })\n )\n","import * as NodeSocketServer from \"@effect/platform-node/NodeSocketServer\"\nimport { Effect } from \"effect\"\n\nimport { PortProbeError } from \"./errors.js\"\n\ntype ErrnoError = Error & { readonly code?: string }\n\nconst normalizeMessage = (error: Error): string => error.message\n\nconst isErrnoError = (error: Error): error is ErrnoError => \"code\" in error\n\n// CHANGE: probe TCP port availability on localhost\n// WHY: avoid docker compose failures due to port collisions\n// QUOTE(ТЗ): \"Bind for 127.0.0.1:2222 failed: port is already allocated\"\n// REF: user-request-2026-01-28-port\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: available(p) -> can_bind(p)\n// PURITY: SHELL\n// EFFECT: Effect<boolean, PortProbeError, never>\n// INVARIANT: returns false when the port is already in use\n// COMPLEXITY: O(1)\nexport const isPortAvailable = (\n port: number,\n host: string = \"127.0.0.1\"\n): Effect.Effect<boolean, PortProbeError> =>\n Effect.scoped(NodeSocketServer.make({ host, port })).pipe(\n Effect.as(true),\n Effect.catchTag(\"SocketServerError\", (error) => {\n const { cause } = error\n if (error.reason === \"Open\" && cause instanceof Error && isErrnoError(cause) && cause.code === \"EADDRINUSE\") {\n return Effect.succeed(false)\n }\n return Effect.fail(new PortProbeError({ port, message: normalizeMessage(error) }))\n })\n )\n\n// CHANGE: select the first available port in a range\n// WHY: auto-recover from occupied SSH ports\n// QUOTE(ТЗ): \"Bind for 127.0.0.1:2222 failed: port is already allocated\"\n// REF: user-request-2026-01-28-port\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: find(p) -> available(find(p))\n// PURITY: SHELL\n// EFFECT: Effect<number, PortProbeError, never>\n// INVARIANT: result is >= preferred when found\n// COMPLEXITY: O(n) where n = |attempts|\nexport const findAvailablePort = (\n preferred: number,\n attempts: number,\n host: string = \"127.0.0.1\"\n): Effect.Effect<number, PortProbeError> =>\n Effect.gen(function*(_) {\n const max = Math.max(1, attempts)\n for (let offset = 0; offset < max; offset += 1) {\n const candidate = preferred + offset\n const available = yield* _(isPortAvailable(candidate, host))\n if (available) {\n return candidate\n }\n }\n\n return yield* _(\n Effect.fail(\n new PortProbeError({\n port: preferred,\n message: `no available port in range ${preferred}-${preferred + max - 1}`\n })\n )\n )\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Either, Option } from \"effect\"\n\nimport { runDockerPsPublishedHostPorts } from \"../shell/docker.js\"\nimport { PortProbeError } from \"../shell/errors.js\"\nimport { isPortAvailable } from \"../shell/ports.js\"\nimport { listProjectItems } from \"./projects-list.js\"\n\nexport type ReservedPort = {\n readonly port: number\n readonly projectDir: string\n}\n\nconst dockerPublishedMarker = \"<docker:published>\"\n\nconst resolveExclude = (\n path: Path.Path,\n excludeDir: string | null\n): string | null => (excludeDir === null ? null : path.resolve(excludeDir))\n\nconst filterReserved = (\n path: Path.Path,\n excludeDir: string | null\n) =>\n(item: { readonly projectDir: string }): boolean => {\n const resolvedExclude = resolveExclude(path, excludeDir)\n if (resolvedExclude === null) {\n return true\n }\n return path.resolve(item.projectDir) !== resolvedExclude\n}\n\nconst reservePort = (\n reserved: Array<ReservedPort>,\n seen: Set<number>,\n port: number,\n projectDir: string\n): void => {\n if (seen.has(port)) {\n return\n }\n seen.add(port)\n reserved.push({ port, projectDir })\n}\n\nconst loadPublishedDockerPorts = (): Effect.Effect<ReadonlySet<number>, never, CommandExecutor.CommandExecutor> =>\n Effect.either(runDockerPsPublishedHostPorts(process.cwd())).pipe(\n Effect.flatMap(\n Either.match({\n onLeft: (error) =>\n Effect.logWarning(\n `Failed to read published Docker ports; falling back to TCP probing only: ${\n error instanceof Error ? error.message : String(error)\n }`\n ).pipe(Effect.as(new Set<number>())),\n onRight: (ports) => Effect.succeed(new Set(ports))\n })\n )\n )\n\n// CHANGE: collect SSH ports currently occupied by existing docker-git projects\n// WHY: avoid port collisions while allowing reuse of ports from stopped projects\n// QUOTE(ТЗ): \"для каждого докера брать должен свой порт\"\n// REF: user-request-2026-02-05-port-reserve\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p∈Projects: reserved(port(p))\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ReservedPort>, PlatformError | PortProbeError, FileSystem | Path.Path | CommandExecutor>\n// INVARIANT: excludes the current project dir when provided\n// COMPLEXITY: O(n) where n = number of projects\nexport const loadReservedPorts = (\n excludeDir: string | null\n): Effect.Effect<\n ReadonlyArray<ReservedPort>,\n PlatformError | PortProbeError,\n FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const items = yield* _(listProjectItems)\n const publishedByDocker = yield* _(loadPublishedDockerPorts())\n const reserved: Array<ReservedPort> = []\n const seen = new Set<number>()\n const filter = filterReserved(path, excludeDir)\n\n for (const item of items) {\n if (!filter(item)) {\n continue\n }\n const occupiedByDocker = publishedByDocker.has(item.sshPort)\n const occupiedBySocket = occupiedByDocker ? false : !(yield* _(isPortAvailable(item.sshPort)))\n if (occupiedByDocker || occupiedBySocket) {\n reservePort(reserved, seen, item.sshPort, item.projectDir)\n }\n }\n\n for (const port of publishedByDocker) {\n reservePort(reserved, seen, port, dockerPublishedMarker)\n }\n\n return reserved\n })\n\nconst isReserved = (reserved: ReadonlySet<number>, port: number): boolean => reserved.has(port)\n\nconst buildCandidates = (\n preferred: number,\n attempts: number,\n reserved: ReadonlySet<number>\n): ReadonlyArray<number> => {\n const max = Math.max(1, attempts)\n return Array.from({ length: max }, (_, index) => preferred + index)\n .filter((candidate) => !isReserved(reserved, candidate))\n}\n\n// CHANGE: find the first non-reserved, available port from a preferred range\n// WHY: avoid taking another project's assigned port\n// QUOTE(ТЗ): \"А не бороться за чужой порт\"\n// REF: user-request-2026-02-05-port-reserve\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: selected(p) → available(p) ∧ not_reserved(p)\n// PURITY: SHELL\n// EFFECT: Effect<number, PortProbeError, never>\n// INVARIANT: result is >= preferred when found\n// COMPLEXITY: O(n) where n = attempts\nexport const selectAvailablePort = (\n preferred: number,\n attempts: number,\n reserved: ReadonlySet<number>\n): Effect.Effect<number, PortProbeError> =>\n Effect.gen(function*(_) {\n const candidates = buildCandidates(preferred, attempts, reserved)\n const selected = yield* _(\n Effect.reduce(candidates, Option.none<number>(), (current, candidate) =>\n Option.isSome(current)\n ? Effect.succeed(current)\n : isPortAvailable(candidate).pipe(\n Effect.map((available) => Option.fromNullable(available ? candidate : null))\n ))\n )\n if (Option.isSome(selected)) {\n return selected.value\n }\n return yield* _(\n Effect.fail(\n new PortProbeError({\n port: preferred,\n message: `no available port in range ${preferred}-${preferred + Math.max(1, attempts) - 1}`\n })\n )\n )\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { ProjectConfig, TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport {\n runDockerComposePsFormatted,\n runDockerComposeUp,\n runDockerInspectContainerBridgeIp,\n runDockerNetworkConnectBridge\n} from \"../shell/docker.js\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { ensureComposeNetworkReady } from \"./docker-network-gc.js\"\nimport { loadReservedPorts, selectAvailablePort } from \"./ports-reserve.js\"\nimport { parseComposePsOutput } from \"./projects-core.js\"\n\nconst maxPortAttempts = 25\n\n// CHANGE: update template port when the preferred SSH port is reserved or busy\n// WHY: keep each project on a unique port even across restarts\n// QUOTE(ТЗ): \"Почему контейнер пытается подниматься на существующий порт?\"\n// REF: user-request-2026-02-05-port-conflict\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: reserved(p) ∨ occupied(p) → selected(p') ∧ available(p')\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, PortProbeError | PlatformError | FileExistsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: config is rewritten when port changes\n// COMPLEXITY: O(n) where n = maxPortAttempts\nconst ensureAvailableSshPort = (\n projectDir: string,\n config: ProjectConfig\n): Effect.Effect<\n TemplateConfig,\n PortProbeError | PlatformError | FileExistsError,\n FileSystem | Path | CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const reserved = yield* _(loadReservedPorts(projectDir))\n const reservedPorts = new Set(reserved.map((entry) => entry.port))\n const selected = yield* _(selectAvailablePort(config.template.sshPort, maxPortAttempts, reservedPorts))\n if (selected === config.template.sshPort) {\n return config.template\n }\n const reason = reservedPorts.has(config.template.sshPort)\n ? \"already reserved by another docker-git project\"\n : \"already in use\"\n yield* _(\n Effect.logWarning(\n `SSH port ${config.template.sshPort} is ${reason}; using ${selected} instead.`\n )\n )\n const updatedTemplate: TemplateConfig = { ...config.template, sshPort: selected }\n return updatedTemplate\n })\n\n// CHANGE: start docker compose with a fresh port check for existing projects\n// WHY: keep \"docker compose up\" resilient to later port collisions\n// QUOTE(ТЗ): \"Почему контейнер пытается подниматься на существующий порт?\"\n// REF: user-request-2026-02-05-port-conflict\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: up(p) → available(ssh_port(p))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | PortProbeError | FileExistsError | DockerCommandError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: docker compose runs after port is validated\n// COMPLEXITY: O(n) where n = maxPortAttempts\nexport const runDockerComposeUpWithPortCheck = (\n projectDir: string\n): Effect.Effect<\n TemplateConfig,\n ConfigNotFoundError | ConfigDecodeError | PortProbeError | FileExistsError | DockerCommandError | PlatformError,\n FileSystem | Path | CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const config = yield* _(readProjectConfig(projectDir))\n const alreadyRunning = yield* _(\n runDockerComposePsFormatted(projectDir).pipe(\n Effect.map((raw) => parseComposePsOutput(raw)),\n Effect.map((rows) => rows.length > 0)\n )\n )\n\n // Avoid port churn when the project's compose environment is already running.\n const updated = alreadyRunning\n ? config.template\n : yield* _(ensureAvailableSshPort(projectDir, config))\n // Keep generated templates in sync with the running CLI version.\n yield* _(writeProjectFiles(projectDir, updated, true))\n yield* _(ensureCodexConfigFile(projectDir, updated.codexAuthPath))\n yield* _(ensureComposeNetworkReady(projectDir, updated))\n yield* _(runDockerComposeUp(projectDir))\n\n const ensureBridgeAccess = (containerName: string) =>\n runDockerInspectContainerBridgeIp(projectDir, containerName).pipe(\n Effect.flatMap((bridgeIp) =>\n bridgeIp.length > 0\n ? Effect.void\n : runDockerNetworkConnectBridge(projectDir, containerName)\n ),\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to connect ${containerName} to bridge network: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n\n yield* _(ensureBridgeAccess(updated.containerName))\n if (updated.enableMcpPlaywright) {\n yield* _(ensureBridgeAccess(`${updated.containerName}-browser`))\n }\n\n return updated\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Duration, Effect, pipe, Schedule } from \"effect\"\n\nimport { runCommandExitCode, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { runDockerComposePsFormatted } from \"../shell/docker.js\"\nimport {\n CommandFailedError,\n type ConfigDecodeError,\n type ConfigNotFoundError,\n type DockerCommandError,\n type FileExistsError,\n type PortProbeError\n} from \"../shell/errors.js\"\nimport { renderError } from \"./errors.js\"\nimport {\n buildSshCommand,\n forEachProjectStatus,\n formatComposeRows,\n parseComposePsOutput,\n type ProjectItem,\n renderProjectStatusHeader,\n withProjectIndexAndSsh\n} from \"./projects-core.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\nimport { ensureTerminalCursorVisible } from \"./terminal-cursor.js\"\n\nconst buildSshArgs = (item: ProjectItem): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (item.sshKeyPath !== null) {\n args.push(\"-i\", item.sshKeyPath)\n }\n args.push(\n \"-tt\",\n \"-Y\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(item.sshPort),\n `${item.sshUser}@localhost`\n )\n return args\n}\n\nconst buildSshProbeArgs = (item: ProjectItem): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (item.sshKeyPath !== null) {\n args.push(\"-i\", item.sshKeyPath)\n }\n args.push(\n \"-T\",\n \"-o\",\n \"BatchMode=yes\",\n \"-o\",\n \"ConnectTimeout=2\",\n \"-o\",\n \"ConnectionAttempts=1\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(item.sshPort),\n `${item.sshUser}@localhost`,\n \"true\"\n )\n return args\n}\n\nconst waitForSshReady = (\n item: ProjectItem\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> => {\n const probe = Effect.gen(function*(_) {\n const exitCode = yield* _(\n runCommandExitCode({\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshProbeArgs(item)\n })\n )\n if (exitCode !== 0) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"ssh wait\", exitCode })))\n }\n })\n\n return pipe(\n Effect.log(`Waiting for SSH on localhost:${item.sshPort} ...`),\n Effect.zipRight(\n Effect.retry(\n probe,\n pipe(\n Schedule.spaced(Duration.seconds(2)),\n Schedule.intersect(Schedule.recurs(30))\n )\n )\n ),\n Effect.tap(() => Effect.log(\"SSH is ready.\"))\n )\n}\n\n// CHANGE: connect to a project via SSH using its resolved settings\n// WHY: allow TUI to open a shell immediately after selection\n// QUOTE(ТЗ): \"выбор проекта сразу подключает по SSH\"\n// REF: user-request-2026-02-02-select-ssh\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: connect(p) -> ssh(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: command is ssh with deterministic args\n// COMPLEXITY: O(1)\nexport const connectProjectSsh = (\n item: ProjectItem\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n ensureTerminalCursorVisible(),\n Effect.zipRight(\n runCommandWithExitCodes(\n {\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshArgs(item)\n },\n [0, 130],\n (exitCode) => new CommandFailedError({ command: \"ssh\", exitCode })\n )\n )\n )\n\n// CHANGE: ensure docker compose is up before SSH connection\n// WHY: selected project should auto-start when not running\n// QUOTE(ТЗ): \"Если не поднят то пусть поднимает\"\n// REF: user-request-2026-02-02-select-up\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: up(p) -> ssh(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | DockerCommandError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: docker compose up runs before ssh\n// COMPLEXITY: O(1)\nexport const connectProjectSshWithUp = (\n item: ProjectItem\n): Effect.Effect<\n void,\n | CommandFailedError\n | ConfigNotFoundError\n | ConfigDecodeError\n | FileExistsError\n | PortProbeError\n | DockerCommandError\n | PlatformError,\n CommandExecutor.CommandExecutor | Fs | PathService\n> =>\n pipe(\n Effect.log(`Starting docker compose for ${item.displayName} ...`),\n Effect.zipRight(runDockerComposeUpWithPortCheck(item.projectDir)),\n Effect.map((template) => ({ ...item, sshPort: template.sshPort })),\n Effect.tap((updated) => waitForSshReady(updated)),\n Effect.flatMap((updated) => connectProjectSsh(updated))\n )\n\n// CHANGE: show docker compose status for all known docker-git projects\n// WHY: allow checking active containers without switching directories\n// QUOTE(ТЗ): \"как посмотреть какие активны?\"\n// REF: user-request-2026-01-27-status\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: status(p) -> output(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: each project emits a header before docker compose output\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjectStatus: Effect.Effect<\n void,\n PlatformError,\n Fs | PathService | CommandExecutor.CommandExecutor\n> = Effect.asVoid(\n withProjectIndexAndSsh((index, sshKey) =>\n forEachProjectStatus(index.configPaths, (status) =>\n pipe(\n Effect.log(renderProjectStatusHeader(status)),\n Effect.zipRight(\n Effect.log(`SSH access: ${buildSshCommand(status.config.template, sshKey)}`)\n ),\n Effect.zipRight(\n runDockerComposePsFormatted(status.projectDir).pipe(\n Effect.map((raw) => parseComposePsOutput(raw)),\n Effect.map((rows) => formatComposeRows(rows)),\n Effect.flatMap((text) => Effect.log(text)),\n Effect.matchEffect({\n onFailure: (error: DockerCommandError | PlatformError) =>\n Effect.logWarning(\n `docker compose ps failed for ${status.projectDir}: ${renderError(error)}`\n ),\n onSuccess: () => Effect.void\n })\n )\n )\n ))\n )\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Duration, Effect, Fiber, Schedule } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport {\n runDockerComposeDownVolumes,\n runDockerComposeLogsFollow,\n runDockerComposeUp,\n runDockerComposeUpRecreate,\n runDockerExecExitCode,\n runDockerInspectContainerBridgeIp,\n runDockerNetworkConnectBridge\n} from \"../../shell/docker.js\"\nimport type { DockerCommandError } from \"../../shell/errors.js\"\nimport { CloneFailedError } from \"../../shell/errors.js\"\nimport { ensureComposeNetworkReady } from \"../docker-network-gc.js\"\nimport { findSshPrivateKey, resolveAuthorizedKeysPath } from \"../path-helpers.js\"\nimport { buildSshCommand } from \"../projects.js\"\n\nconst maxPortAttempts = 25\nconst clonePollInterval = Duration.seconds(1)\nconst cloneDonePath = \"/run/docker-git/clone.done\"\nconst cloneFailPath = \"/run/docker-git/clone.failed\"\n\nconst logSshAccess = (\n baseDir: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(path, baseDir, config.authorizedKeysPath)\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const sshCommand = buildSshCommand(config, sshKey)\n\n yield* _(Effect.log(`SSH access: ${sshCommand}`))\n if (!authExists) {\n yield* _(\n Effect.logWarning(\n `Authorized keys file missing: ${resolvedAuthorizedKeys} (SSH may fail without a matching key).`\n )\n )\n }\n })\n\ntype CloneState = \"pending\" | \"done\" | \"failed\"\ntype DockerUpError = CloneFailedError | DockerCommandError | PlatformError\ntype DockerUpEnvironment = CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\ntype DockerUpOptions = {\n readonly runUp: boolean\n readonly waitForClone: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nconst checkCloneState = (\n cwd: string,\n containerName: string\n): Effect.Effect<CloneState, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const failed = yield* _(runDockerExecExitCode(cwd, containerName, [\"test\", \"-f\", cloneFailPath]))\n if (failed === 0) {\n return \"failed\"\n }\n\n const done = yield* _(runDockerExecExitCode(cwd, containerName, [\"test\", \"-f\", cloneDonePath]))\n return done === 0 ? \"done\" : \"pending\"\n })\n\nconst waitForCloneCompletion = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, CloneFailedError | DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const logsFiber = yield* _(\n runDockerComposeLogsFollow(cwd).pipe(\n Effect.tapError((error) =>\n Effect.logWarning(\n `docker compose logs --follow failed: ${error instanceof Error ? error.message : String(error)}`\n )\n ),\n Effect.fork\n )\n )\n const result = yield* _(\n checkCloneState(cwd, config.containerName).pipe(\n Effect.repeat(\n Schedule.addDelay(\n Schedule.recurUntil<CloneState>((state) => state !== \"pending\"),\n () => clonePollInterval\n )\n )\n )\n )\n yield* _(Fiber.interrupt(logsFiber))\n if (result === \"failed\") {\n return yield* _(\n Effect.fail(\n new CloneFailedError({\n repoUrl: config.repoUrl,\n repoRef: config.repoRef,\n targetDir: config.targetDir\n })\n )\n )\n }\n })\n\nconst runDockerComposeUpByMode = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"],\n force: boolean,\n forceEnv: boolean\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(ensureComposeNetworkReady(resolvedOutDir, projectConfig))\n\n if (force) {\n yield* _(Effect.log(\"Force enabled: wiping docker compose volumes (docker compose down -v)...\"))\n yield* _(runDockerComposeDownVolumes(resolvedOutDir))\n yield* _(Effect.log(\"Running: docker compose up -d --build\"))\n yield* _(runDockerComposeUp(resolvedOutDir))\n return\n }\n if (forceEnv) {\n yield* _(Effect.log(\"Force env enabled: resetting env defaults and recreating containers (volumes preserved)...\"))\n yield* _(runDockerComposeUpRecreate(resolvedOutDir))\n return\n }\n yield* _(Effect.log(\"Running: docker compose up -d --build\"))\n yield* _(runDockerComposeUp(resolvedOutDir))\n })\n\nconst ensureContainerBridgeAccess = (\n resolvedOutDir: string,\n containerName: string\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n runDockerInspectContainerBridgeIp(resolvedOutDir, containerName).pipe(\n Effect.flatMap((bridgeIp) =>\n bridgeIp.length > 0\n ? Effect.void\n : runDockerNetworkConnectBridge(resolvedOutDir, containerName)\n ),\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to connect ${containerName} to bridge network: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n\nconst ensureBridgeAccess = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"]\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n // Make container ports reachable from other (non-compose) containers by IP.\n yield* _(ensureContainerBridgeAccess(resolvedOutDir, projectConfig.containerName))\n if (projectConfig.enableMcpPlaywright) {\n yield* _(ensureContainerBridgeAccess(resolvedOutDir, `${projectConfig.containerName}-browser`))\n }\n })\n\nexport const runDockerUpIfNeeded = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"],\n options: DockerUpOptions\n): Effect.Effect<void, DockerUpError, DockerUpEnvironment> =>\n Effect.gen(function*(_) {\n if (!options.runUp) {\n return\n }\n yield* _(runDockerComposeUpByMode(resolvedOutDir, projectConfig, options.force, options.forceEnv))\n yield* _(ensureBridgeAccess(resolvedOutDir, projectConfig))\n\n if (options.waitForClone) {\n yield* _(Effect.log(\"Streaming container logs until clone completes...\"))\n yield* _(waitForCloneCompletion(resolvedOutDir, projectConfig))\n }\n yield* _(Effect.log(\"Docker environment is up\"))\n yield* _(logSshAccess(resolvedOutDir, projectConfig))\n })\n\nexport const maxSshPortAttempts = maxPortAttempts\n","import type * as Path from \"@effect/platform/Path\"\nimport type { CreateCommand } from \"../../core/domain.js\"\n\nexport const resolvePathFromBase = (path: Path.Path, baseDir: string, targetPath: string): string =>\n path.isAbsolute(targetPath) ? targetPath : path.resolve(baseDir, targetPath)\n\nconst toPosixPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nexport const resolveDockerGitRootRelativePath = (\n path: Path.Path,\n projectsRoot: string,\n inputPath: string\n): string => {\n if (path.isAbsolute(inputPath)) {\n return inputPath\n }\n const normalized = inputPath\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\")\n if (normalized === \".docker-git\") {\n return projectsRoot\n }\n const prefix = \".docker-git/\"\n if (normalized.startsWith(prefix)) {\n return path.join(projectsRoot, normalized.slice(prefix.length))\n }\n return inputPath\n}\n\ntype ProjectConfigs = {\n readonly globalConfig: CreateCommand[\"config\"]\n readonly projectConfig: CreateCommand[\"config\"]\n}\n\nexport const buildProjectConfigs = (\n path: Path.Path,\n baseDir: string,\n resolvedOutDir: string,\n resolvedConfig: CreateCommand[\"config\"]\n): ProjectConfigs => {\n // docker-compose resolves relative host paths from the project directory (where docker-compose.yml lives).\n // To keep generated projects portable across host OSes, we avoid embedding absolute host paths in templates.\n const relativeFromOutDir = (absolutePath: string): string => toPosixPath(path.relative(resolvedOutDir, absolutePath))\n\n const globalConfig = {\n ...resolvedConfig,\n dockerGitPath: resolvePathFromBase(path, baseDir, resolvedConfig.dockerGitPath),\n authorizedKeysPath: resolvePathFromBase(path, baseDir, resolvedConfig.authorizedKeysPath),\n envGlobalPath: resolvePathFromBase(path, baseDir, resolvedConfig.envGlobalPath),\n envProjectPath: resolvePathFromBase(path, baseDir, resolvedConfig.envProjectPath),\n codexAuthPath: resolvePathFromBase(path, baseDir, resolvedConfig.codexAuthPath),\n codexSharedAuthPath: resolvePathFromBase(path, baseDir, resolvedConfig.codexSharedAuthPath)\n }\n const projectConfig = {\n ...resolvedConfig,\n dockerGitPath: relativeFromOutDir(globalConfig.dockerGitPath),\n authorizedKeysPath: relativeFromOutDir(globalConfig.authorizedKeysPath),\n envGlobalPath: \"./.orch/env/global.env\",\n envProjectPath: path.isAbsolute(resolvedConfig.envProjectPath)\n ? relativeFromOutDir(resolvedConfig.envProjectPath)\n : toPosixPath(resolvedConfig.envProjectPath),\n // Project-local Codex state (sessions/logs/etc) is kept under .orch.\n codexAuthPath: \"./.orch/auth/codex\",\n // Shared credentials root is mounted separately; entrypoint links auth.json into CODEX_HOME.\n codexSharedAuthPath: relativeFromOutDir(globalConfig.codexSharedAuthPath)\n }\n return { globalConfig, projectConfig }\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport type { PortProbeError } from \"../../shell/errors.js\"\nimport { loadReservedPorts, selectAvailablePort } from \"../ports-reserve.js\"\n\nconst maxPortAttempts = 25\n\nexport const resolveSshPort = (\n config: CreateCommand[\"config\"],\n outDir: string\n): Effect.Effect<\n CreateCommand[\"config\"],\n PortProbeError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const reserved = yield* _(loadReservedPorts(outDir))\n const reservedPorts = new Set(reserved.map((entry) => entry.port))\n const selected = yield* _(selectAvailablePort(config.sshPort, maxPortAttempts, reservedPorts))\n if (selected !== config.sshPort) {\n const reason = reservedPorts.has(config.sshPort)\n ? \"already reserved by another docker-git project\"\n : \"already in use\"\n yield* _(\n Effect.logWarning(\n `SSH port ${config.sshPort} is ${reason}; using ${selected} instead.`\n )\n )\n }\n return selected === config.sshPort ? config : { ...config, sshPort: selected }\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport type { FileExistsError } from \"../../shell/errors.js\"\nimport { writeProjectFiles } from \"../../shell/files.js\"\nimport { ensureCodexConfigFile, migrateLegacyOrchLayout, syncAuthArtifacts } from \"../auth-sync.js\"\nimport { findAuthorizedKeysSource, resolveAuthorizedKeysPath } from \"../path-helpers.js\"\nimport { withFsPathContext } from \"../runtime.js\"\nimport { resolvePathFromBase } from \"./paths.js\"\n\ntype ExistingFileState = \"exists\" | \"missing\"\n\nconst ensureFileReady = (\n fs: FileSystem.FileSystem,\n resolved: string,\n onDirectoryMessage: (resolvedPath: string, backupPath: string) => string\n): Effect.Effect<ExistingFileState, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(resolved))\n if (!exists) {\n return \"missing\"\n }\n\n const info = yield* _(fs.stat(resolved))\n if (info.type === \"Directory\") {\n const backupPath = `${resolved}.bak-${Date.now()}`\n yield* _(fs.rename(resolved, backupPath))\n yield* _(Effect.logWarning(onDirectoryMessage(resolved, backupPath)))\n return \"missing\"\n }\n\n return \"exists\"\n })\n\nconst ensureAuthorizedKeys = (\n baseDir: string,\n authorizedKeysPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolveAuthorizedKeysPath(path, baseDir, authorizedKeysPath)\n const state = yield* _(\n ensureFileReady(\n fs,\n resolved,\n (resolvedPath, backupPath) =>\n `Authorized keys was a directory, moved to ${backupPath}. Creating a file at ${resolvedPath}.`\n )\n )\n if (state === \"exists\") {\n return\n }\n\n const source = yield* _(findAuthorizedKeysSource(fs, path, process.cwd()))\n if (source === null) {\n yield* _(\n Effect.logError(\n `Authorized keys not found. Create ${resolved} with your public key to enable SSH.`\n )\n )\n return\n }\n\n yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))\n yield* _(fs.copyFile(source, resolved))\n yield* _(Effect.log(`Authorized keys copied from ${source} to ${resolved}`))\n })\n )\n\nconst defaultGlobalEnvContents = \"# docker-git env\\n# KEY=value\\n\"\n\nconst defaultProjectEnvContents = [\n \"# docker-git project env defaults\",\n \"CODEX_SHARE_AUTH=1\",\n \"CODEX_AUTO_UPDATE=1\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST=1\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=fg=8,italic\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=history completion\",\n \"MCP_PLAYWRIGHT_ISOLATED=1\",\n \"\"\n].join(\"\\n\")\n\nconst ensureEnvFile = (\n baseDir: string,\n envPath: string,\n defaultContents: string,\n overwrite: boolean = false\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolvePathFromBase(path, baseDir, envPath)\n const state = yield* _(\n ensureFileReady(\n fs,\n resolved,\n (_resolvedPath, backupPath) => `Env file was a directory, moved to ${backupPath}.`\n )\n )\n if (state === \"exists\" && !overwrite) {\n return\n }\n\n yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))\n yield* _(fs.writeFileString(resolved, defaultContents))\n })\n )\n\nexport type PrepareProjectFilesError = FileExistsError | PlatformError\ntype PrepareProjectFilesOptions = {\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nexport const prepareProjectFiles = (\n resolvedOutDir: string,\n baseDir: string,\n globalConfig: CreateCommand[\"config\"],\n projectConfig: CreateCommand[\"config\"],\n options: PrepareProjectFilesOptions\n): Effect.Effect<ReadonlyArray<string>, PrepareProjectFilesError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const rewriteManagedFiles = options.force || options.forceEnv\n const envOnlyRefresh = options.forceEnv && !options.force\n const createdFiles = yield* _(\n writeProjectFiles(resolvedOutDir, projectConfig, rewriteManagedFiles)\n )\n yield* _(ensureAuthorizedKeys(resolvedOutDir, projectConfig.authorizedKeysPath))\n yield* _(ensureEnvFile(resolvedOutDir, projectConfig.envGlobalPath, defaultGlobalEnvContents))\n yield* _(\n ensureEnvFile(\n resolvedOutDir,\n projectConfig.envProjectPath,\n defaultProjectEnvContents,\n envOnlyRefresh\n )\n )\n yield* _(ensureCodexConfigFile(baseDir, globalConfig.codexAuthPath))\n yield* _(\n syncAuthArtifacts({\n sourceBase: baseDir,\n targetBase: resolvedOutDir,\n source: {\n envGlobalPath: globalConfig.envGlobalPath,\n envProjectPath: globalConfig.envProjectPath,\n codexAuthPath: globalConfig.codexAuthPath\n },\n target: {\n envGlobalPath: projectConfig.envGlobalPath,\n envProjectPath: projectConfig.envProjectPath,\n codexAuthPath: projectConfig.codexAuthPath\n }\n })\n )\n // Ensure per-project config stays in sync even when `.orch/auth/codex` already exists.\n yield* _(ensureCodexConfigFile(resolvedOutDir, projectConfig.codexAuthPath))\n return createdFiles\n })\n\nexport const migrateProjectOrchLayout = (\n baseDir: string,\n globalConfig: CreateCommand[\"config\"],\n resolveRootPath: (value: string) => string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(\n baseDir,\n globalConfig.envGlobalPath,\n globalConfig.envProjectPath,\n globalConfig.codexAuthPath,\n resolveRootPath(\".docker-git/.orch/auth/gh\")\n )\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport { deriveRepoPathParts } from \"../../core/domain.js\"\nimport { runCommandWithExitCodes } from \"../../shell/command-runner.js\"\nimport { ensureDockerDaemonAccess } from \"../../shell/docker.js\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\nimport type {\n CloneFailedError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../../shell/errors.js\"\nimport { logDockerAccessInfo } from \"../access-log.js\"\nimport { renderError } from \"../errors.js\"\nimport { applyGithubForkConfig } from \"../github-fork.js\"\nimport { defaultProjectsRoot } from \"../menu-helpers.js\"\nimport { findSshPrivateKey } from \"../path-helpers.js\"\nimport { buildSshCommand } from \"../projects-core.js\"\nimport { autoSyncState } from \"../state-repo.js\"\nimport { ensureTerminalCursorVisible } from \"../terminal-cursor.js\"\nimport { runDockerUpIfNeeded } from \"./docker-up.js\"\nimport { buildProjectConfigs, resolveDockerGitRootRelativePath } from \"./paths.js\"\nimport { resolveSshPort } from \"./ports.js\"\nimport { migrateProjectOrchLayout, prepareProjectFiles } from \"./prepare-files.js\"\n\ntype CreateProjectRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype CreateProjectError =\n | FileExistsError\n | CloneFailedError\n | DockerAccessError\n | DockerCommandError\n | PortProbeError\n | PlatformError\n\ntype CreateContext = {\n readonly baseDir: string\n readonly resolveRootPath: (value: string) => string\n}\n\nconst makeCreateContext = (path: Path.Path, baseDir: string): CreateContext => {\n const projectsRoot = path.resolve(defaultProjectsRoot(baseDir))\n const resolveRootPath = (value: string): string => resolveDockerGitRootRelativePath(path, projectsRoot, value)\n return { baseDir, resolveRootPath }\n}\n\nconst resolveRootedConfig = (command: CreateCommand, ctx: CreateContext): CreateCommand[\"config\"] => ({\n ...command.config,\n dockerGitPath: ctx.resolveRootPath(command.config.dockerGitPath),\n authorizedKeysPath: ctx.resolveRootPath(command.config.authorizedKeysPath),\n envGlobalPath: ctx.resolveRootPath(command.config.envGlobalPath),\n envProjectPath: ctx.resolveRootPath(command.config.envProjectPath),\n codexAuthPath: ctx.resolveRootPath(command.config.codexAuthPath),\n codexSharedAuthPath: ctx.resolveRootPath(command.config.codexSharedAuthPath)\n})\n\nconst resolveCreateConfig = (\n command: CreateCommand,\n ctx: CreateContext,\n resolvedOutDir: string\n): Effect.Effect<\n CreateCommand[\"config\"],\n PortProbeError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n resolveSshPort(resolveRootedConfig(command, ctx), resolvedOutDir).pipe(\n Effect.flatMap((config) => applyGithubForkConfig(config))\n )\n\nconst logCreatedProject = (resolvedOutDir: string, createdFiles: ReadonlyArray<string>) =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Created docker-git project in ${resolvedOutDir}`))\n for (const file of createdFiles) {\n yield* _(Effect.log(` - ${file}`))\n }\n }).pipe(Effect.asVoid)\n\nconst formatStateSyncLabel = (repoUrl: string): string => {\n const repoPath = deriveRepoPathParts(repoUrl).pathParts.join(\"/\")\n return repoPath.length > 0 ? repoPath : repoUrl\n}\n\nconst isInteractiveTty = (): boolean => process.stdin.isTTY && process.stdout.isTTY\n\nconst buildSshArgs = (\n config: CreateCommand[\"config\"],\n sshKeyPath: string | null\n): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (sshKeyPath !== null) {\n args.push(\"-i\", sshKeyPath)\n }\n args.push(\n \"-tt\",\n \"-Y\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(config.sshPort),\n `${config.sshUser}@localhost`\n )\n return args\n}\n\n// CHANGE: auto-open SSH after environment is created (best-effort)\n// WHY: clone flow should drop the user into the container without manual copy/paste\n// QUOTE(ТЗ): \"Мне надо что бы он сразу открыл SSH\"\n// REF: issue-39\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: openSsh(c) -> ssh_session_started(c) || warning_logged(c)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, FileSystem | Path | CommandExecutor>\n// INVARIANT: SSH failures do not fail the create/clone command\n// COMPLEXITY: O(1) + ssh\nconst openSshBestEffort = (\n template: CreateCommand[\"config\"]\n): Effect.Effect<void, never, CreateProjectRuntime> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const sshCommand = buildSshCommand(template, sshKey)\n\n yield* _(Effect.log(`Opening SSH: ${sshCommand}`))\n yield* _(ensureTerminalCursorVisible())\n yield* _(\n runCommandWithExitCodes(\n {\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshArgs(template, sshKey)\n },\n [0, 130],\n (exitCode) => new CommandFailedError({ command: \"ssh\", exitCode })\n )\n )\n }).pipe(\n Effect.asVoid,\n Effect.matchEffect({\n onFailure: (error) => Effect.logWarning(`SSH auto-open failed: ${renderError(error)}`),\n onSuccess: () => Effect.void\n })\n )\n\nconst runCreateProject = (\n path: Path.Path,\n command: CreateCommand\n): Effect.Effect<void, CreateProjectError, CreateProjectRuntime> =>\n Effect.gen(function*(_) {\n if (command.runUp) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n }\n\n const ctx = makeCreateContext(path, process.cwd())\n const resolvedOutDir = path.resolve(ctx.resolveRootPath(command.outDir))\n\n const resolvedConfig = yield* _(resolveCreateConfig(command, ctx, resolvedOutDir))\n const { globalConfig, projectConfig } = buildProjectConfigs(path, ctx.baseDir, resolvedOutDir, resolvedConfig)\n\n yield* _(migrateProjectOrchLayout(ctx.baseDir, globalConfig, ctx.resolveRootPath))\n\n const createdFiles = yield* _(\n prepareProjectFiles(resolvedOutDir, ctx.baseDir, globalConfig, projectConfig, {\n force: command.force,\n forceEnv: command.forceEnv\n })\n )\n yield* _(logCreatedProject(resolvedOutDir, createdFiles))\n\n yield* _(\n runDockerUpIfNeeded(resolvedOutDir, projectConfig, {\n runUp: command.runUp,\n waitForClone: command.waitForClone,\n force: command.force,\n forceEnv: command.forceEnv\n })\n )\n if (command.runUp) {\n yield* _(logDockerAccessInfo(resolvedOutDir, projectConfig))\n }\n\n yield* _(autoSyncState(`chore(state): update ${formatStateSyncLabel(projectConfig.repoUrl)}`))\n\n if (command.openSsh) {\n if (!command.runUp) {\n yield* _(Effect.logWarning(\"Skipping SSH auto-open: docker compose up disabled (--no-up).\"))\n } else if (isInteractiveTty()) {\n yield* _(openSshBestEffort(projectConfig))\n } else {\n yield* _(Effect.logWarning(\"Skipping SSH auto-open: not running in an interactive TTY.\"))\n }\n }\n }).pipe(Effect.asVoid)\n\nexport const createProject = (command: CreateCommand): Effect.Effect<void, CreateProjectError, CreateProjectRuntime> =>\n Path.Path.pipe(Effect.flatMap((path) => runCreateProject(path, command)))\n","import { trimLeftChar, trimRightChar } from \"./strings.js\"\n\nconst trimEdgeUnderscores = (value: string): string => {\n let start = 0\n while (start < value.length && value[start] === \"_\") {\n start += 1\n }\n\n let end = value.length\n while (end > start && value[end - 1] === \"_\") {\n end -= 1\n }\n return value.slice(start, end)\n}\n\nconst trimEdgeHyphens = (value: string): string => {\n const withoutLeading = trimLeftChar(value, \"-\")\n return trimRightChar(withoutLeading, \"-\")\n}\n\nexport const normalizeGitTokenLabel = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return undefined\n }\n\n const normalized = trimmed\n .toUpperCase()\n .replaceAll(/[^A-Z0-9]+/g, \"_\")\n const cleaned = trimEdgeUnderscores(normalized)\n if (cleaned.length === 0 || cleaned === \"DEFAULT\") {\n return undefined\n }\n return cleaned\n}\n\nexport const normalizeAuthLabel = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return undefined\n }\n\n const normalized = trimmed\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n const cleaned = trimEdgeHyphens(normalized)\n if (cleaned.length === 0 || cleaned === \"default\") {\n return undefined\n }\n return cleaned\n}\n","import type { ApplyCommand, TemplateConfig } from \"../core/domain.js\"\nimport { normalizeAuthLabel, normalizeGitTokenLabel } from \"../core/token-labels.js\"\n\nexport const hasApplyOverrides = (command: ApplyCommand): boolean =>\n command.gitTokenLabel !== undefined ||\n command.codexTokenLabel !== undefined ||\n command.claudeTokenLabel !== undefined ||\n command.enableMcpPlaywright !== undefined\n\nexport const applyTemplateOverrides = (\n template: TemplateConfig,\n command: ApplyCommand | undefined\n): TemplateConfig => {\n if (command === undefined) {\n return template\n }\n\n let nextTemplate = template\n\n if (command.gitTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n gitTokenLabel: normalizeGitTokenLabel(command.gitTokenLabel)\n }\n }\n if (command.codexTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n codexAuthLabel: normalizeAuthLabel(command.codexTokenLabel)\n }\n }\n if (command.claudeTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n claudeAuthLabel: normalizeAuthLabel(command.claudeTokenLabel)\n }\n }\n if (command.enableMcpPlaywright !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n enableMcpPlaywright: command.enableMcpPlaywright\n }\n }\n\n return nextTemplate\n}\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport { type ApplyCommand, deriveRepoPathParts, type TemplateConfig } from \"../core/domain.js\"\nimport { parseGithubRepoUrl } from \"../core/repo.js\"\nimport { runCommandCapture, runCommandExitCode } from \"../shell/command-runner.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport type * as ShellErrors from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { applyTemplateOverrides, hasApplyOverrides } from \"./apply-overrides.js\"\nimport { ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\nimport { defaultProjectsRoot, findExistingUpwards } from \"./path-helpers.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\n\ntype ApplyProjectFilesError =\n | ShellErrors.ConfigNotFoundError\n | ShellErrors.ConfigDecodeError\n | ShellErrors.FileExistsError\n | PlatformError\ntype ApplyProjectFilesEnv = FileSystem | Path\n\n// CHANGE: apply existing docker-git.json to managed files in an already created project\n// WHY: allow updating current project/container config without creating a new project directory\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: apply_files(p) -> files(p) = plan(read_config(p))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: rewrites only managed files from docker-git.json\n// COMPLEXITY: O(n) where n = |managed_files|\nexport const applyProjectFiles = (\n projectDir: string,\n command?: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectFilesError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Applying docker-git config files in ${projectDir}...`))\n const config = yield* _(readProjectConfig(projectDir))\n const resolvedTemplate = applyTemplateOverrides(config.template, command)\n yield* _(writeProjectFiles(projectDir, resolvedTemplate, true))\n yield* _(ensureCodexConfigFile(projectDir, resolvedTemplate.codexAuthPath))\n return resolvedTemplate\n })\n\nexport type ApplyProjectConfigError =\n | ApplyProjectFilesError\n | ShellErrors.DockerAccessError\n | ShellErrors.DockerCommandError\n | ShellErrors.PortProbeError\n\ntype ApplyProjectConfigEnv = ApplyProjectFilesEnv | CommandExecutor\n\ntype RepoIdentity = {\n readonly fullPath: string\n readonly repo: string\n}\n\ntype ProjectCandidate = {\n readonly projectDir: string\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nconst gitSuccessExitCode = 0\nconst gitBranchDetached = \"HEAD\"\nconst maxLocalConfigSearchDepth = 6\nconst gitBaseEnv: Readonly<Record<string, string>> = {\n GIT_TERMINAL_PROMPT: \"0\"\n}\n\nconst emptyConfigPaths = (): ReadonlyArray<string> => []\nconst nullProjectCandidate = (): ProjectCandidate | null => null\nconst nullString = (): string | null => null\n\nconst normalizeRepoIdentity = (repoUrl: string): RepoIdentity => {\n const github = parseGithubRepoUrl(repoUrl)\n if (github !== null) {\n const owner = github.owner.trim().toLowerCase()\n const repo = github.repo.trim().toLowerCase()\n return { fullPath: `${owner}/${repo}`, repo }\n }\n\n const parts = deriveRepoPathParts(repoUrl)\n const normalizedParts = parts.pathParts.map((part) => part.toLowerCase())\n const repo = parts.repo.toLowerCase()\n return {\n fullPath: normalizedParts.join(\"/\"),\n repo\n }\n}\n\nconst toProjectDirBaseName = (projectDir: string): string => {\n const normalized = projectDir.replaceAll(\"\\\\\", \"/\")\n const parts = normalized.split(\"/\").filter((part) => part.length > 0)\n return parts.at(-1)?.toLowerCase() ?? \"\"\n}\n\nconst parsePrRefFromBranch = (branch: string): string | null => {\n const prefix = \"pr-\"\n if (!branch.toLowerCase().startsWith(prefix)) {\n return null\n }\n const id = branch.slice(prefix.length).trim()\n return id.length > 0 ? `refs/pull/${id}/head` : null\n}\n\nconst scoreBranchMatch = (\n branch: string | null,\n candidate: ProjectCandidate\n): number => {\n if (branch === null) {\n return 0\n }\n\n const branchLower = branch.toLowerCase()\n const candidateRef = candidate.repoRef.toLowerCase()\n const prRef = parsePrRefFromBranch(branchLower)\n const branchRefScore = candidateRef === branchLower ? 8 : 0\n const prRefScore = prRef !== null && candidateRef === prRef.toLowerCase() ? 8 : 0\n const dirNameScore = toProjectDirBaseName(candidate.projectDir) === branchLower ? 5 : 0\n return branchRefScore + prRefScore + dirNameScore\n}\n\nconst scoreCandidate = (\n remoteIdentities: ReadonlyArray<RepoIdentity>,\n branch: string | null,\n candidate: ProjectCandidate\n): number => {\n const candidateIdentity = normalizeRepoIdentity(candidate.repoUrl)\n const hasFullPathMatch = remoteIdentities.some((remote) => remote.fullPath === candidateIdentity.fullPath)\n const hasRepoMatch = remoteIdentities.some((remote) => remote.repo === candidateIdentity.repo)\n if (!hasFullPathMatch && !hasRepoMatch) {\n return 0\n }\n\n const repoScore = hasFullPathMatch ? 100 : 10\n return repoScore + scoreBranchMatch(branch, candidate)\n}\n\nconst selectCandidateProjectDir = (\n remoteIdentities: ReadonlyArray<RepoIdentity>,\n branch: string | null,\n candidates: ReadonlyArray<ProjectCandidate>\n): string | null => {\n const scored = candidates\n .map((candidate) => ({ candidate, score: scoreCandidate(remoteIdentities, branch, candidate) }))\n .filter((entry) => entry.score > 0)\n\n if (scored.length === 0) {\n return null\n }\n\n const topScore = Math.max(...scored.map((entry) => entry.score))\n const topCandidates = scored.filter((entry) => entry.score === topScore)\n if (topCandidates.length !== 1) {\n return null\n }\n\n return topCandidates[0]?.candidate.projectDir ?? null\n}\n\nconst tryGitCapture = (\n cwd: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string | null, never, CommandExecutor> => {\n const spec = { cwd, command: \"git\", args, env: gitBaseEnv }\n\n return runCommandExitCode(spec).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed<string | null>(null),\n onSuccess: (exitCode) =>\n exitCode === gitSuccessExitCode\n ? runCommandCapture(spec, [gitSuccessExitCode], (code) => ({ _tag: \"ApplyGitCaptureError\", code })).pipe(\n Effect.map((value) => value.trim()),\n Effect.match({\n onFailure: nullString,\n onSuccess: (value) => value\n })\n )\n : Effect.succeed<string | null>(null)\n })\n )\n}\n\nconst listProjectCandidates = (\n projectsRoot: string\n): Effect.Effect<ReadonlyArray<ProjectCandidate>, PlatformError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(projectsRoot))\n const configPaths = yield* _(\n findDockerGitConfigPaths(fs, path, resolved).pipe(\n Effect.match({\n onFailure: emptyConfigPaths,\n onSuccess: (value) => value\n })\n )\n )\n\n const candidates: Array<ProjectCandidate> = []\n for (const configPath of configPaths) {\n const projectDir = path.dirname(configPath)\n const candidate = yield* _(\n readProjectConfig(projectDir).pipe(\n Effect.match({\n onFailure: nullProjectCandidate,\n onSuccess: (config) => ({\n projectDir,\n repoUrl: config.template.repoUrl,\n repoRef: config.template.repoRef\n })\n })\n )\n )\n if (candidate !== null) {\n candidates.push(candidate)\n }\n }\n\n return candidates\n })\n\nconst collectRemoteIdentities = (\n repoRoot: string\n): Effect.Effect<ReadonlyArray<RepoIdentity>, never, CommandExecutor> =>\n Effect.gen(function*(_) {\n const listedRemotes = yield* _(tryGitCapture(repoRoot, [\"remote\"]))\n const dynamicNames = listedRemotes === null\n ? []\n : listedRemotes\n .split(/\\r?\\n/)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n const remoteNames = [...new Set([...dynamicNames, \"origin\", \"upstream\"])]\n const urls: Array<string> = []\n\n for (const remoteName of remoteNames) {\n const url = yield* _(tryGitCapture(repoRoot, [\"remote\", \"get-url\", remoteName]))\n if (url !== null && url.length > 0) {\n urls.push(url)\n }\n }\n\n const identityMap = new Map<string, RepoIdentity>()\n for (const url of urls) {\n const identity = normalizeRepoIdentity(url)\n identityMap.set(`${identity.fullPath}|${identity.repo}`, identity)\n }\n return [...identityMap.values()]\n })\n\nconst resolveFromCurrentTree = (): Effect.Effect<string | null, PlatformError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(\".\"))\n const configPath = yield* _(\n findExistingUpwards(fs, path, resolved, \"docker-git.json\", maxLocalConfigSearchDepth).pipe(\n Effect.match({\n onFailure: nullString,\n onSuccess: (value) => value\n })\n )\n )\n return configPath === null ? null : path.dirname(configPath)\n })\n\nconst normalizeBranch = (branch: string | null): string | null => {\n const normalized = branch?.trim() ?? \"\"\n if (normalized.length === 0 || normalized === gitBranchDetached) {\n return null\n }\n return normalized\n}\n\nconst resolveFromCurrentRepository = (): Effect.Effect<string | null, PlatformError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n const cwd = process.cwd()\n const repoRoot = yield* _(tryGitCapture(cwd, [\"rev-parse\", \"--show-toplevel\"]))\n if (repoRoot === null) {\n return null\n }\n\n const remoteIdentities = yield* _(collectRemoteIdentities(repoRoot))\n if (remoteIdentities.length === 0) {\n return null\n }\n\n const branch = normalizeBranch(yield* _(tryGitCapture(repoRoot, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"])))\n const projectsRoot = defaultProjectsRoot(cwd)\n const candidates = yield* _(listProjectCandidates(projectsRoot))\n if (candidates.length === 0) {\n return null\n }\n\n return selectCandidateProjectDir(remoteIdentities, branch, candidates)\n })\n\nconst resolveImplicitApplyProjectDir = (): Effect.Effect<string | null, PlatformError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n const localProjectDir = yield* _(resolveFromCurrentTree())\n if (localProjectDir !== null) {\n return localProjectDir\n }\n return yield* _(resolveFromCurrentRepository())\n })\n\nconst runApplyForProjectDir = (\n projectDir: string,\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n command.runUp ? applyProjectWithUp(projectDir, command) : applyProjectFiles(projectDir, command)\n\nconst applyProjectWithUp = (\n projectDir: string,\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Applying docker-git config and refreshing container in ${projectDir}...`))\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n if (hasApplyOverrides(command)) {\n yield* _(applyProjectFiles(projectDir, command))\n }\n return yield* _(runDockerComposeUpWithPortCheck(projectDir))\n })\n\n// CHANGE: add command handler to apply docker-git config on an existing project\n// WHY: update current project/container config without running create/clone again\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: apply(c) -> updated(project(c)) && (c.runUp -> container_refreshed(c))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ApplyProjectConfigError, FileSystem | Path | CommandExecutor>\n// INVARIANT: project path remains unchanged; command only updates managed artifacts\n// COMPLEXITY: O(n) + O(command)\nexport const applyProjectConfig = (\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n runApplyForProjectDir(command.projectDir, command).pipe(\n Effect.catchTag(\"ConfigNotFoundError\", (error) =>\n command.projectDir === \".\"\n ? Effect.gen(function*(_) {\n const inferredProjectDir = yield* _(resolveImplicitApplyProjectDir())\n if (inferredProjectDir === null) {\n return yield* _(Effect.fail(error))\n }\n yield* _(Effect.log(`Auto-resolved docker-git project directory: ${inferredProjectDir}`))\n return yield* _(runApplyForProjectDir(inferredProjectDir, command))\n })\n : Effect.fail(error))\n )\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Fiber from \"effect/Fiber\"\nimport type * as Scope from \"effect/Scope\"\nimport * as Stream from \"effect/Stream\"\n\nimport { AuthError, CommandFailedError } from \"../shell/errors.js\"\n\nconst oauthTokenEnvKey = \"DOCKER_GIT_CLAUDE_OAUTH_TOKEN\"\nconst tokenMarker = \"Your OAuth token (valid for 1 year):\"\nconst outputWindowSize = 262_144\n\nconst oauthTokenRegex = /([A-Za-z0-9][A-Za-z0-9._-]{20,})/u\n\nconst ansiEscape = \"\\u001B\"\nconst ansiBell = \"\\u0007\"\n\nconst isAnsiFinalByte = (codePoint: number | undefined): boolean =>\n codePoint !== undefined && codePoint >= 0x40 && codePoint <= 0x7E\n\nconst skipCsiSequence = (raw: string, start: number): number => {\n const length = raw.length\n let index = start + 2\n while (index < length) {\n const codePoint = raw.codePointAt(index)\n if (isAnsiFinalByte(codePoint)) {\n return index + 1\n }\n index += 1\n }\n return index\n}\n\nconst skipOscSequence = (raw: string, start: number): number => {\n const length = raw.length\n let index = start + 2\n while (index < length) {\n const char = raw[index] ?? \"\"\n if (char === ansiBell) {\n return index + 1\n }\n if (char === ansiEscape && raw[index + 1] === \"\\\\\") {\n return index + 2\n }\n index += 1\n }\n return index\n}\n\nconst skipEscapeSequence = (raw: string, start: number): number => {\n const next = raw[start + 1] ?? \"\"\n if (next === \"[\") {\n return skipCsiSequence(raw, start)\n }\n if (next === \"]\") {\n return skipOscSequence(raw, start)\n }\n return Math.min(raw.length, start + 2)\n}\n\nconst stripAnsi = (raw: string): string => {\n const cleaned: Array<string> = []\n let index = 0\n\n while (index < raw.length) {\n const current = raw[index] ?? \"\"\n if (current !== ansiEscape) {\n cleaned.push(current)\n index += 1\n continue\n }\n index = skipEscapeSequence(raw, index)\n }\n\n return cleaned.join(\"\")\n}\n\nconst extractOauthToken = (rawOutput: string): string | null => {\n const normalized = stripAnsi(rawOutput).replaceAll(\"\\r\", \"\\n\")\n const markerIndex = normalized.lastIndexOf(tokenMarker)\n if (markerIndex === -1) {\n return null\n }\n\n const tail = normalized.slice(markerIndex + tokenMarker.length)\n const match = oauthTokenRegex.exec(tail)\n return match?.[1] ?? null\n}\n\nconst oauthTokenFromEnv = (): string | null => {\n const value = (process.env[oauthTokenEnvKey] ?? \"\").trim()\n return value.length > 0 ? value : null\n}\n\nconst ensureOauthToken = (rawToken: string): Effect.Effect<string, AuthError> => {\n const token = rawToken.trim()\n return token.length > 0\n ? Effect.succeed(token)\n : Effect.fail(new AuthError({ message: \"Claude OAuth token is empty.\" }))\n}\n\ntype DockerSetupTokenSpec = {\n readonly cwd: string\n readonly image: string\n readonly hostPath: string\n readonly containerPath: string\n readonly env: ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n}\n\nconst buildDockerSetupTokenSpec = (\n cwd: string,\n accountPath: string,\n image: string,\n containerPath: string\n): DockerSetupTokenSpec => ({\n cwd,\n image,\n hostPath: accountPath,\n containerPath,\n env: [`CLAUDE_CONFIG_DIR=${containerPath}`],\n args: [\"setup-token\"]\n})\n\nconst buildDockerSetupTokenArgs = (spec: DockerSetupTokenSpec): ReadonlyArray<string> => {\n const base: Array<string> = [\"run\", \"--rm\", \"-i\", \"-t\", \"-v\", `${spec.hostPath}:${spec.containerPath}`]\n for (const entry of spec.env) {\n const trimmed = entry.trim()\n if (trimmed.length === 0) {\n continue\n }\n base.push(\"-e\", trimmed)\n }\n return [...base, spec.image, ...spec.args]\n}\n\nconst startDockerProcess = (\n executor: CommandExecutor.CommandExecutor,\n spec: DockerSetupTokenSpec\n): Effect.Effect<CommandExecutor.Process, PlatformError, Scope.Scope> =>\n executor.start(\n pipe(\n Command.make(\"docker\", ...buildDockerSetupTokenArgs(spec)),\n Command.workingDirectory(spec.cwd),\n Command.stdin(\"inherit\"),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n )\n\nconst writeChunkToFd = (fd: number, chunk: Uint8Array): void => {\n if (fd === 2) {\n process.stderr.write(chunk)\n return\n }\n process.stdout.write(chunk)\n}\n\nconst pumpDockerOutput = (\n source: Stream.Stream<Uint8Array, PlatformError>,\n fd: number,\n tokenBox: { value: string | null }\n): Effect.Effect<void, PlatformError> => {\n const decoder = new TextDecoder(\"utf-8\")\n let outputWindow = \"\"\n\n return pipe(\n source,\n Stream.runForEach((chunk) =>\n Effect.sync(() => {\n writeChunkToFd(fd, chunk)\n outputWindow += decoder.decode(chunk)\n if (outputWindow.length > outputWindowSize) {\n outputWindow = outputWindow.slice(-outputWindowSize)\n }\n if (tokenBox.value !== null) {\n return\n }\n const parsed = extractOauthToken(outputWindow)\n if (parsed !== null) {\n tokenBox.value = parsed\n }\n }).pipe(Effect.asVoid)\n )\n ).pipe(Effect.asVoid)\n}\n\nconst ensureExitOk = (exitCode: number): Effect.Effect<void, CommandFailedError> =>\n exitCode === 0 ? Effect.void : Effect.fail(new CommandFailedError({ command: \"claude setup-token\", exitCode }))\n\nconst resolveCapturedToken = (token: string | null): Effect.Effect<string, AuthError> =>\n token === null\n ? Effect.fail(\n new AuthError({\n message:\n \"Claude OAuth completed without a captured token. Retry login and ensure the flow reaches 'Long-lived authentication token created successfully'.\"\n })\n )\n : ensureOauthToken(token)\n\nexport const runClaudeOauthLoginWithPrompt = (\n cwd: string,\n accountPath: string,\n options: {\n readonly image: string\n readonly containerPath: string\n }\n): Effect.Effect<string, AuthError | CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> => {\n const envToken = oauthTokenFromEnv()\n if (envToken !== null) {\n return ensureOauthToken(envToken)\n }\n\n return Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const spec = buildDockerSetupTokenSpec(cwd, accountPath, options.image, options.containerPath)\n const proc = yield* _(startDockerProcess(executor, spec))\n\n const tokenBox: { value: string | null } = { value: null }\n const stdoutFiber = yield* _(Effect.forkScoped(pumpDockerOutput(proc.stdout, 1, tokenBox)))\n const stderrFiber = yield* _(Effect.forkScoped(pumpDockerOutput(proc.stderr, 2, tokenBox)))\n\n const exitCode = yield* _(proc.exitCode.pipe(Effect.map(Number)))\n yield* _(Fiber.join(stdoutFiber))\n yield* _(Fiber.join(stderrFiber))\n yield* _(ensureExitOk(exitCode))\n\n return yield* _(resolveCapturedToken(tokenBox.value))\n })\n )\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport { Effect, Either } from \"effect\"\n\nimport type { AuthClaudeLoginCommand, AuthClaudeLogoutCommand, AuthClaudeStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { runDockerAuth, runDockerAuthCapture } from \"../shell/docker-auth.js\"\nimport type { AuthError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { runClaudeOauthLoginWithPrompt } from \"./auth-claude-oauth.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype ClaudeRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype ClaudeAccountContext = {\n readonly accountLabel: string\n readonly accountPath: string\n readonly cwd: string\n readonly fs: FileSystem.FileSystem\n}\n\nexport const claudeAuthRoot = \".docker-git/.orch/auth/claude\"\n\nconst claudeImageName = \"docker-git-auth-claude:latest\"\nconst claudeImageDir = \".docker-git/.orch/auth/claude/.image\"\nconst claudeConfigDir = \"/claude-config\"\nconst claudeOauthTokenFileName = \".oauth-token\"\n\nconst claudeOauthTokenPath = (accountPath: string): string => `${accountPath}/${claudeOauthTokenFileName}`\n\nconst ensureClaudeOrchLayout = (\n cwd: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(\n cwd,\n defaultTemplateConfig.envGlobalPath,\n defaultTemplateConfig.envProjectPath,\n defaultTemplateConfig.codexAuthPath,\n \".docker-git/.orch/auth/gh\"\n )\n\nconst renderClaudeDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends ca-certificates curl bsdutils \\\n && rm -rf /var/lib/apt/lists/*\nRUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \\\n && apt-get install -y --no-install-recommends nodejs \\\n && node -v \\\n && npm -v \\\n && rm -rf /var/lib/apt/lists/*\nRUN npm install -g @anthropic-ai/claude-code@latest\nENTRYPOINT [\"claude\"]\n`\n\nconst resolveClaudeAccountPath = (path: Path.Path, rootPath: string, label: string | null): {\n readonly accountLabel: string\n readonly accountPath: string\n} => {\n const accountLabel = normalizeAccountLabel(label, \"default\")\n const accountPath = path.join(rootPath, accountLabel)\n return { accountLabel, accountPath }\n}\n\nconst withClaudeAuth = <A, E>(\n command: AuthClaudeLoginCommand | AuthClaudeLogoutCommand | AuthClaudeStatusCommand,\n run: (\n context: ClaudeAccountContext\n ) => Effect.Effect<A, E, CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError | CommandFailedError, ClaudeRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureClaudeOrchLayout(cwd))\n const rootPath = resolvePathFromCwd(path, cwd, command.claudeAuthPath)\n const { accountLabel, accountPath } = resolveClaudeAccountPath(path, rootPath, command.label)\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n yield* _(\n ensureDockerImage(fs, path, cwd, {\n imageName: claudeImageName,\n imageDir: claudeImageDir,\n dockerfile: renderClaudeDockerfile(),\n buildLabel: \"claude auth\"\n })\n )\n return yield* _(run({ accountLabel, accountPath, cwd, fs }))\n })\n )\n\nconst runClaudeAuthCommand = (\n cwd: string,\n accountPath: string,\n args: ReadonlyArray<string>,\n commandLabel: string,\n interactive: boolean\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: claudeImageName,\n hostPath: accountPath,\n containerPath: claudeConfigDir,\n env: [`CLAUDE_CONFIG_DIR=${claudeConfigDir}`, \"BROWSER=echo\"],\n args,\n interactive\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: commandLabel, exitCode })\n )\n\nconst runClaudeLogout = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runClaudeAuthCommand(cwd, accountPath, [\"auth\", \"logout\"], \"claude auth logout\", false)\n\nconst runClaudeStatusJson = (\n cwd: string,\n accountPath: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthCapture(\n buildDockerAuthSpec({\n cwd,\n image: claudeImageName,\n hostPath: accountPath,\n containerPath: claudeConfigDir,\n env: `CLAUDE_CONFIG_DIR=${claudeConfigDir}`,\n args: [\"auth\", \"status\", \"--json\"],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: \"claude auth status --json\", exitCode })\n )\n\ntype ClaudeAuthStatus = {\n readonly loggedIn: boolean\n readonly authMethod?: string | undefined\n readonly apiProvider?: string | undefined\n}\n\nconst ClaudeAuthStatusSchema = Schema.Struct({\n loggedIn: Schema.Boolean,\n authMethod: Schema.optional(Schema.String),\n apiProvider: Schema.optional(Schema.String)\n})\n\nconst ClaudeAuthStatusJsonSchema = Schema.parseJson(ClaudeAuthStatusSchema)\n\nconst decodeClaudeAuthStatus = (raw: string): Effect.Effect<ClaudeAuthStatus, CommandFailedError> =>\n Either.match(ParseResult.decodeUnknownEither(ClaudeAuthStatusJsonSchema)(raw), {\n onLeft: () => Effect.fail(new CommandFailedError({ command: \"claude auth status --json\", exitCode: 1 })),\n onRight: (value) => Effect.succeed(value)\n })\n\n// CHANGE: login to Claude Code CLI using a dedicated auth container (OAuth web flow)\n// WHY: mirror the isolated OAuth flow used for Codex/GitHub (no API key entry in TUI)\n// QUOTE(ТЗ): \"ДЕЛАЙ OAuth по тому же принципу что и Codex\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: login(l) -> claude_auth_cache_exists(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, AuthError | CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: CLAUDE_CONFIG_DIR is pinned to the mounted auth directory\n// COMPLEXITY: O(command)\nexport const authClaudeLogin = (\n command: AuthClaudeLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, ClaudeRuntime> => {\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n return withClaudeAuth(command, ({ accountPath, cwd, fs }) =>\n runClaudeOauthLoginWithPrompt(cwd, accountPath, {\n image: claudeImageName,\n containerPath: claudeConfigDir\n }).pipe(\n Effect.flatMap((token) => fs.writeFileString(claudeOauthTokenPath(accountPath), `${token}\\n`))\n )).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth claude ${accountLabel}`))\n )\n}\n\n// CHANGE: show Claude Code auth status for a given label\n// WHY: allow verifying OAuth cache presence without exposing credentials\n// QUOTE(ТЗ): \"где теперь можно изучить эти сессии?\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: status(l) -> connected(l) | disconnected(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never logs tokens/credentials\n// COMPLEXITY: O(command)\nexport const authClaudeStatus = (\n command: AuthClaudeStatusCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, ClaudeRuntime> =>\n withClaudeAuth(command, ({ accountLabel, accountPath, cwd, fs }) =>\n Effect.gen(function*(_) {\n const tokenPath = claudeOauthTokenPath(accountPath)\n const hasToken = yield* _(fs.exists(tokenPath))\n if (hasToken) {\n const tokenText = yield* _(fs.readFileString(tokenPath), Effect.orElseSucceed(() => \"\"))\n if (tokenText.trim().length > 0) {\n yield* _(Effect.log(`Claude connected (${accountLabel}, oauth-token).`))\n return\n }\n }\n\n const raw = yield* _(runClaudeStatusJson(cwd, accountPath))\n const status = yield* _(decodeClaudeAuthStatus(raw))\n yield* (status.loggedIn\n ? _(Effect.log(`Claude connected (${accountLabel}).`))\n : _(Effect.log(`Claude not connected (${accountLabel}).`)))\n }))\n\n// CHANGE: logout Claude Code by clearing credentials for a label\n// WHY: allow revoking Claude Code access deterministically\n// QUOTE(ТЗ): \"Надо сделать что бы ... можно создавать множество данных\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: logout(l) -> credentials_cleared(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: CLAUDE_CONFIG_DIR stays within the mounted account directory\n// COMPLEXITY: O(command)\nexport const authClaudeLogout = (\n command: AuthClaudeLogoutCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, ClaudeRuntime> =>\n Effect.gen(function*(_) {\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n yield* _(\n withClaudeAuth(command, ({ accountPath, cwd, fs }) =>\n Effect.gen(function*(_) {\n const tokenPath = claudeOauthTokenPath(accountPath)\n const hasToken = yield* _(fs.exists(tokenPath))\n if (hasToken) {\n yield* _(fs.remove(tokenPath, { force: true }))\n }\n yield* _(runClaudeLogout(cwd, accountPath))\n }))\n )\n yield* _(autoSyncState(`chore(state): auth claude logout ${accountLabel}`))\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { AuthCodexLoginCommand, AuthCodexLogoutCommand, AuthCodexStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { runDockerAuth, runDockerAuthExitCode } from \"../shell/docker-auth.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { ensureCodexConfigFile, migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\n// NOTE: keep local helpers grouped to avoid duplicated import blocks.\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype CodexRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype CodexAccountContext = {\n readonly accountPath: string\n readonly cwd: string\n}\n\nconst codexImageName = \"docker-git-auth-codex:latest\"\nconst codexImageDir = \".docker-git/.orch/auth/codex/.image\"\nconst codexHome = \"/root/.codex\"\n\nconst ensureCodexOrchLayout = (\n cwd: string,\n codexAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(\n cwd,\n defaultTemplateConfig.envGlobalPath,\n defaultTemplateConfig.envProjectPath,\n codexAuthPath,\n \".docker-git/.orch/auth/gh\"\n )\n\nconst renderCodexDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends curl ca-certificates unzip bsdutils nodejs \\\n && rm -rf /var/lib/apt/lists/*\nENV BUN_INSTALL=/usr/local/bun\nENV PATH=\"/usr/local/bun/bin:$PATH\"\nRUN set -eu; \\\n for attempt in 1 2 3 4 5; do \\\n if curl -fsSL --retry 5 --retry-all-errors --retry-delay 2 https://bun.sh/install -o /tmp/bun-install.sh \\\n && BUN_INSTALL=/usr/local/bun bash /tmp/bun-install.sh; then \\\n rm -f /tmp/bun-install.sh; \\\n exit 0; \\\n fi; \\\n echo \"bun install attempt \\${attempt} failed; retrying...\" >&2; \\\n rm -f /tmp/bun-install.sh; \\\n sleep $((attempt * 2)); \\\n done; \\\n echo \"bun install failed after retries\" >&2; \\\n exit 1\nRUN ln -sf /usr/local/bun/bin/bun /usr/local/bin/bun\nRUN script -q -e -c \"bun add -g @openai/codex@latest\" /dev/null\nRUN ln -sf /usr/local/bun/bin/codex /usr/local/bin/codex\n`\n\nconst resolveCodexAccountPath = (rootPath: string, label: string | null): string => {\n const resolvedLabel = normalizeAccountLabel(label, \"default\")\n return resolvedLabel === \"default\" ? rootPath : `${rootPath}/${resolvedLabel}`\n}\n\nconst withCodexAccount = <A, E>(\n codexAuthPath: string,\n label: string | null,\n run: (\n context: CodexAccountContext\n ) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureCodexOrchLayout(cwd, codexAuthPath))\n const rootPath = resolvePathFromCwd(path, cwd, codexAuthPath)\n const accountPath = resolveCodexAccountPath(rootPath, label)\n yield* _(ensureCodexConfigFile(cwd, accountPath))\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n return yield* _(run({ accountPath, cwd }))\n })\n )\n\nconst withCodexAuth = <A, E>(\n command: AuthCodexLoginCommand | AuthCodexLogoutCommand | AuthCodexStatusCommand,\n run: (\n context: CodexAccountContext\n ) => Effect.Effect<A, E, CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError | CommandFailedError, CodexRuntime> =>\n withCodexAccount(command.codexAuthPath, command.label, ({ accountPath, cwd }) =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n yield* _(\n ensureDockerImage(fs, path, cwd, {\n imageName: codexImageName,\n imageDir: codexImageDir,\n dockerfile: renderCodexDockerfile(),\n buildLabel: \"codex auth\"\n })\n )\n return yield* _(run({ accountPath, cwd }))\n }))\n\nconst runCodexAuthCommand = (\n cwd: string,\n accountPath: string,\n args: ReadonlyArray<string>,\n commandLabel: string,\n interactive: boolean\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: codexImageName,\n hostPath: accountPath,\n containerPath: codexHome,\n env: `CODEX_HOME=${codexHome}`,\n args,\n interactive\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: commandLabel, exitCode })\n )\n\nconst runCodexLogin = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCodexAuthCommand(cwd, accountPath, [\"codex\", \"login\", \"--device-auth\"], \"codex login --device-auth\", false)\n\nconst runCodexStatus = (\n cwd: string,\n accountPath: string\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthExitCode(\n buildDockerAuthSpec({\n cwd,\n image: codexImageName,\n hostPath: accountPath,\n containerPath: codexHome,\n env: `CODEX_HOME=${codexHome}`,\n args: [\"codex\", \"login\", \"status\"],\n interactive: false\n })\n )\n\nconst runCodexLogout = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCodexAuthCommand(cwd, accountPath, [\"codex\", \"logout\"], \"codex logout\", false)\n\n// CHANGE: login to Codex CLI using a dedicated auth container\n// WHY: keep auth isolated from the host toolchain\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: login(p) -> codex_auth(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: CODEX_HOME is set to the resolved auth directory\n// COMPLEXITY: O(command)\nexport const authCodexLogin = (\n command: AuthCodexLoginCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) => runCodexLogin(cwd, accountPath)).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth codex ${normalizeAccountLabel(command.label, \"default\")}`))\n )\n\n// CHANGE: show Codex auth status for a given label\n// WHY: make it obvious whether Codex is connected\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: status(p) -> connected(p) | disconnected(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never logs credentials\n// COMPLEXITY: O(command)\nexport const authCodexStatus = (\n command: AuthCodexStatusCommand\n): Effect.Effect<void, PlatformError | CommandFailedError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) =>\n Effect.gen(function*(_) {\n const exitCode = yield* _(runCodexStatus(cwd, accountPath))\n if (exitCode === 0) {\n yield* _(Effect.log(`Codex connected (${accountPath}).`))\n return\n }\n if (exitCode === 1) {\n yield* _(Effect.log(`Codex not connected (${accountPath}).`))\n return\n }\n return yield* _(Effect.fail(new CommandFailedError({ command: \"codex login status\", exitCode })))\n }))\n\n// CHANGE: logout Codex by clearing credentials for a label\n// WHY: allow revoking Codex access deterministically\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: logout(p) -> credentials_cleared(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: codex auth state reflects CODEX_HOME after logout\n// COMPLEXITY: O(command)\nexport const authCodexLogout = (\n command: AuthCodexLogoutCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) => runCodexLogout(cwd, accountPath)).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth codex logout ${normalizeAccountLabel(command.label, \"default\")}`))\n )\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\n// NOTE: keep platform type imports grouped for auth flows.\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Duration, Effect, Schedule } from \"effect\"\n\nimport type { AuthGithubLoginCommand, AuthGithubLogoutCommand, AuthGithubStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { trimLeftChar, trimRightChar } from \"../core/strings.js\"\nimport { runDockerAuth, runDockerAuthCapture } from \"../shell/docker-auth.js\"\nimport type { AuthError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureEnvFile, parseEnvEntries, readEnvText, removeEnvKey, upsertEnvKey } from \"./env-file.js\"\nimport { ensureGhAuthImage, ghAuthDir, ghAuthRoot, ghImageName } from \"./github-auth-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype GithubTokenEntry = {\n readonly key: string\n readonly label: string\n readonly token: string\n}\n\ntype GithubFsRuntime = FileSystem.FileSystem | Path.Path\ntype GithubRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype EnvContext = {\n readonly fs: FileSystem.FileSystem\n readonly envPath: string\n readonly current: string\n}\n\nconst ensureGithubOrchLayout = (\n cwd: string,\n envGlobalPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(\n cwd,\n envGlobalPath,\n defaultTemplateConfig.envProjectPath,\n defaultTemplateConfig.codexAuthPath,\n ghAuthRoot\n )\n\nconst normalizeGithubLabel = (value: string | null): string => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return \"\"\n }\n const normalized = trimmed.toUpperCase().replaceAll(/[^A-Z0-9]+/g, \"_\")\n const withoutLeading = trimLeftChar(normalized, \"_\")\n const cleaned = trimRightChar(withoutLeading, \"_\")\n return cleaned.length > 0 ? cleaned : \"\"\n}\n\nconst tokenKey = \"GITHUB_TOKEN\"\nconst tokenPrefix = \"GITHUB_TOKEN__\"\n\nconst buildGithubTokenKey = (label: string | null): string => {\n const normalized = normalizeGithubLabel(label)\n if (normalized === \"DEFAULT\" || normalized.length === 0) {\n return tokenKey\n }\n return `${tokenPrefix}${normalized}`\n}\n\nconst labelFromKey = (key: string): string => key.startsWith(tokenPrefix) ? key.slice(tokenPrefix.length) : \"default\"\n\nconst listGithubTokens = (envText: string): ReadonlyArray<GithubTokenEntry> =>\n parseEnvEntries(envText)\n .filter((entry) => entry.key === tokenKey || entry.key.startsWith(tokenPrefix))\n .map((entry) => ({\n key: entry.key,\n label: labelFromKey(entry.key),\n token: entry.value\n }))\n .filter((entry) => entry.token.trim().length > 0)\n\nconst defaultGithubScopes = \"repo,workflow,read:org\"\n\n// CHANGE: normalize GitHub scopes for gh auth login\n// WHY: ensure required scopes are requested without delete_repo\n// QUOTE(ТЗ): \"Передай все нужные скопы\"\n// REF: user-request-2026-02-05-gh-scopes\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: normalize(s) -> scopes(s) ⊆ required\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: empty input yields default scopes\n// COMPLEXITY: O(n) where n = |scopes|\nconst normalizeGithubScopes = (value: string | null | undefined): ReadonlyArray<string> => {\n const raw = value?.trim() ?? \"\"\n const input = raw.length === 0 ? defaultGithubScopes : raw\n const scopes = input\n .split(/[,\\s]+/g)\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0 && scope !== \"delete_repo\")\n return scopes.length === 0 ? defaultGithubScopes.split(\",\") : scopes\n}\n\nconst withEnvContext = <A, E, R>(\n envGlobalPath: string,\n run: (context: EnvContext) => Effect.Effect<A, E, FileSystem.FileSystem | R>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | Path.Path | R> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureGithubOrchLayout(cwd, envGlobalPath))\n const envPath = resolvePathFromCwd(path, cwd, envGlobalPath)\n const current = yield* _(readEnvText(fs, envPath))\n return yield* _(run({ fs, envPath, current }))\n })\n )\n\nconst resolveGithubTokenFromGh = (\n cwd: string,\n accountPath: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthCapture(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath: accountPath,\n containerPath: ghAuthDir,\n args: [\"auth\", \"token\"],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: \"gh auth token\", exitCode })\n ).pipe(\n Effect.map((raw) => raw.trim()),\n Effect.filterOrFail(\n (value) => value.length > 0,\n () => new CommandFailedError({ command: \"gh auth token\", exitCode: 1 })\n )\n )\n\nconst runGithubLogin = (\n cwd: string,\n accountPath: string,\n scopes: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath: accountPath,\n containerPath: ghAuthDir,\n env: \"BROWSER=echo\",\n args: [\n \"auth\",\n \"login\",\n \"--web\",\n \"-h\",\n \"github.com\",\n \"-p\",\n \"https\",\n ...(scopes.length > 0 ? [\"--scopes\", scopes.join(\",\")] : [])\n ],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: \"gh auth login --web\", exitCode })\n )\n\nconst retryGithubLogin = (\n effect: Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n effect.pipe(\n Effect.tapError(() => Effect.logWarning(\"GH auth login failed; retrying...\")),\n Effect.retry(\n Schedule.addDelay(\n Schedule.recurs(2),\n () => Duration.seconds(2)\n )\n )\n )\n\nconst persistGithubToken = (\n fs: FileSystem.FileSystem,\n envPath: string,\n key: string,\n token: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const current = yield* _(readEnvText(fs, envPath))\n const nextText = upsertEnvKey(current, key, token)\n yield* _(fs.writeFileString(envPath, nextText))\n const label = labelFromKey(key)\n yield* _(Effect.log(`GitHub token stored (${label}) in ${envPath}`))\n })\n\nconst runGithubInteractiveLogin = (\n cwd: string,\n fs: FileSystem.FileSystem,\n path: Path.Path,\n envPath: string,\n command: AuthGithubLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, GithubRuntime> =>\n Effect.gen(function*(_) {\n const rootPath = resolvePathFromCwd(path, cwd, ghAuthRoot)\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n const accountPath = path.join(rootPath, accountLabel)\n const scopes = normalizeGithubScopes(command.scopes)\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n yield* _(ensureGhAuthImage(fs, path, cwd, \"gh auth\"))\n yield* _(Effect.log(`Starting GH auth login in container (scopes: ${scopes.join(\", \")})...`))\n yield* _(retryGithubLogin(runGithubLogin(cwd, accountPath, scopes)))\n const resolved = yield* _(resolveGithubTokenFromGh(cwd, accountPath))\n yield* _(ensureEnvFile(fs, path, envPath))\n const key = buildGithubTokenKey(command.label)\n yield* _(persistGithubToken(fs, envPath, key, resolved))\n })\n\n// CHANGE: login to GitHub by persisting a token in the shared env file\n// WHY: make GH_TOKEN available to all docker-git projects\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: login(t) -> env(GITHUB_TOKEN)=t\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: token is never logged\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubLogin = (\n command: AuthGithubLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, GithubRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureGithubOrchLayout(cwd, command.envGlobalPath))\n const envPath = resolvePathFromCwd(path, cwd, command.envGlobalPath)\n const token = command.token?.trim() ?? \"\"\n const key = buildGithubTokenKey(command.label)\n const label = labelFromKey(key)\n if (token.length > 0) {\n yield* _(ensureEnvFile(fs, path, envPath))\n yield* _(persistGithubToken(fs, envPath, key, token))\n yield* _(autoSyncState(`chore(state): auth gh ${label}`))\n return\n }\n yield* _(runGithubInteractiveLogin(cwd, fs, path, envPath, command))\n yield* _(autoSyncState(`chore(state): auth gh ${label}`))\n })\n )\n\n// CHANGE: show GitHub auth status from the shared env file\n// WHY: surface current account labels without leaking tokens\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: status(env) -> labels(env)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: tokens are never logged\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubStatus = (\n command: AuthGithubStatusCommand\n): Effect.Effect<void, PlatformError, GithubFsRuntime> =>\n withEnvContext(command.envGlobalPath, ({ current, envPath }) =>\n Effect.gen(function*(_) {\n const tokens = listGithubTokens(current)\n if (tokens.length === 0) {\n yield* _(Effect.log(`GitHub not connected (no tokens in ${envPath}).`))\n return\n }\n const sample = tokens.slice(0, 20).map((entry) => entry.label).join(\", \")\n const remaining = tokens.length - Math.min(tokens.length, 20)\n const suffix = remaining > 0 ? ` ... (+${remaining} more)` : \"\"\n yield* _(Effect.log(`GitHub tokens (${tokens.length}): ${sample}${suffix}`))\n }))\n\n// CHANGE: remove GitHub auth token from the shared env file\n// WHY: allow revoking tokens without editing files manually\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: logout(env) -> !hasToken(env)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: only the selected token key is removed\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubLogout = (\n command: AuthGithubLogoutCommand\n): Effect.Effect<void, PlatformError, GithubRuntime> =>\n withEnvContext(command.envGlobalPath, ({ current, envPath, fs }) =>\n Effect.gen(function*(_) {\n const key = buildGithubTokenKey(command.label)\n const nextText = removeEnvKey(current, key)\n yield* _(fs.writeFileString(envPath, nextText))\n const label = labelFromKey(key)\n yield* _(Effect.log(`GitHub token removed (${label}) from ${envPath}`))\n yield* _(autoSyncState(`chore(state): auth gh logout ${label}`))\n }))\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { McpPlaywrightUpCommand, TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\n\ntype McpPlaywrightFilesError = ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError\ntype McpPlaywrightFilesEnv = FileSystem | Path\n\nconst enableInTemplate = (template: TemplateConfig): TemplateConfig => ({\n ...template,\n enableMcpPlaywright: true\n})\n\n// CHANGE: enable Playwright MCP in an existing docker-git project directory (files only)\n// WHY: allow adding the browser sidecar + MCP server config without wiping env or volumes\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: enable(p) -> template(p).enableMcpPlaywright = true\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: does not rewrite .orch/env/project.env (only managed templates + docker-git.json)\n// COMPLEXITY: O(n) where n = |managed_files|\nexport const enableMcpPlaywrightProjectFiles = (\n projectDir: string\n): Effect.Effect<TemplateConfig, McpPlaywrightFilesError, McpPlaywrightFilesEnv> =>\n Effect.gen(function*(_) {\n const config = yield* _(readProjectConfig(projectDir))\n const alreadyEnabled = config.template.enableMcpPlaywright\n const updated = alreadyEnabled ? config.template : enableInTemplate(config.template)\n\n yield* _(\n alreadyEnabled\n ? Effect.log(\"Playwright MCP is already enabled for this project.\")\n : Effect.log(\"Enabling Playwright MCP for this project (templates only)...\")\n )\n\n yield* _(writeProjectFiles(projectDir, updated, true))\n yield* _(ensureCodexConfigFile(projectDir, updated.codexAuthPath))\n\n return updated\n })\n\nexport type McpPlaywrightUpError =\n | McpPlaywrightFilesError\n | DockerAccessError\n | DockerCommandError\n | PortProbeError\n\ntype McpPlaywrightUpEnv = McpPlaywrightFilesEnv | CommandExecutor\n\n// CHANGE: enable Playwright MCP in an existing project dir and bring docker compose up\n// WHY: upgrade already created containers to support browser automation without forcing full recreation flows\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: up(p) -> running(p-browser) OR docker_error\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, McpPlaywrightUpError, FileSystem | Path | CommandExecutor>\n// INVARIANT: volumes are preserved (no docker compose down -v)\n// COMPLEXITY: O(command)\nexport const mcpPlaywrightUp = (\n command: McpPlaywrightUpCommand\n): Effect.Effect<TemplateConfig, McpPlaywrightUpError, McpPlaywrightUpEnv> =>\n Effect.gen(function*(_) {\n const updated = yield* _(enableMcpPlaywrightProjectFiles(command.projectDir))\n\n if (!command.runUp) {\n return updated\n }\n\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n return yield* _(runDockerComposeUpWithPortCheck(command.projectDir))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ScrapArchiveInvalidError } from \"../shell/errors.js\"\nimport { ScrapArchiveInvalidError as ScrapArchiveInvalidErrorClass } from \"../shell/errors.js\"\n\nexport const maxGitBlobBytes = 99 * 1000 * 1000\nexport const chunkManifestSuffix = \".chunks.json\"\n\nexport type ChunkManifest = {\n readonly original: string\n readonly originalSize: number\n readonly parts: ReadonlyArray<string>\n readonly splitAt: number\n readonly partsCount: number\n readonly createdAt: string\n}\n\nconst ChunkManifestSchema = Schema.Struct({\n original: Schema.String,\n originalSize: Schema.Number,\n parts: Schema.Array(Schema.String),\n splitAt: Schema.Number,\n partsCount: Schema.Number,\n createdAt: Schema.String\n})\n\nconst ChunkManifestJsonSchema = Schema.parseJson(ChunkManifestSchema)\n\nexport const decodeChunkManifest = (\n manifestPath: string,\n input: string\n): Effect.Effect<ChunkManifest, ScrapArchiveInvalidError> =>\n Either.match(ParseResult.decodeUnknownEither(ChunkManifestJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ScrapArchiveInvalidErrorClass({\n path: manifestPath,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n\nexport const removeChunkArtifacts = (\n fs: Fs,\n path: PathService,\n fileAbs: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const dir = path.dirname(fileAbs)\n const base = path.basename(fileAbs)\n const entries = yield* _(fs.readDirectory(dir))\n for (const entry of entries) {\n if (!entry.startsWith(`${base}.part`)) {\n continue\n }\n yield* _(fs.remove(path.join(dir, entry), { force: true }))\n }\n yield* _(fs.remove(`${fileAbs}${chunkManifestSuffix}`, { force: true }))\n }).pipe(Effect.asVoid)\n\nexport const listChunkParts = (\n fs: Fs,\n path: PathService,\n fileAbs: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const dir = path.dirname(fileAbs)\n const base = path.basename(fileAbs)\n const entries = yield* _(fs.readDirectory(dir))\n const parts = entries\n .filter((entry) => entry.startsWith(`${base}.part`))\n .toSorted((a, b) => a.localeCompare(b))\n return parts.map((entry) => path.join(dir, entry))\n })\n\nexport const sumFileSizes = (\n fs: Fs,\n filesAbs: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError> =>\n Effect.gen(function*(_) {\n let total = 0\n for (const fileAbs of filesAbs) {\n const stat = yield* _(fs.stat(fileAbs))\n if (stat.type === \"File\") {\n total += Number(stat.size)\n }\n }\n return total\n })\n\nexport const writeChunkManifest = (\n fs: Fs,\n path: PathService,\n fileAbs: string,\n originalSize: number,\n partsAbs: ReadonlyArray<string>\n): Effect.Effect<string, PlatformError> =>\n Effect.gen(function*(_) {\n const base = path.basename(fileAbs)\n const manifest: ChunkManifest = {\n original: base,\n originalSize,\n parts: partsAbs.map((part) => path.basename(part)),\n splitAt: maxGitBlobBytes,\n partsCount: partsAbs.length,\n createdAt: new Date().toISOString()\n }\n const manifestPath = `${fileAbs}${chunkManifestSuffix}`\n yield* _(fs.writeFileString(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`))\n return manifestPath\n })\n","import { Either } from \"effect\"\n\nimport { ScrapTargetDirUnsupportedError } from \"../shell/errors.js\"\n\nconst normalizeContainerPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\").trim()\n\nexport const expandContainerHome = (sshUser: string, value: string): string => {\n if (value === \"~\") {\n return `/home/${sshUser}`\n }\n if (value.startsWith(\"~/\")) {\n return `/home/${sshUser}${value.slice(1)}`\n }\n return value\n}\n\nconst trimTrailingPosixSlashes = (value: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === \"/\") {\n end -= 1\n }\n return value.slice(0, end)\n}\n\nconst hasParentTraversalSegment = (value: string): boolean => value.split(\"/\").includes(\"..\")\n\nconst unsupportedTargetDir = (\n sshUser: string,\n targetDir: string,\n reason: string\n): ScrapTargetDirUnsupportedError => new ScrapTargetDirUnsupportedError({ sshUser, targetDir, reason })\n\nexport const deriveScrapWorkspaceRelativePath = (\n sshUser: string,\n targetDir: string\n): Either.Either<string, ScrapTargetDirUnsupportedError> => {\n const normalizedTarget = trimTrailingPosixSlashes(\n normalizeContainerPath(expandContainerHome(sshUser, targetDir))\n )\n const normalizedHome = trimTrailingPosixSlashes(`/home/${sshUser}`)\n\n if (hasParentTraversalSegment(normalizedTarget)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, \"targetDir must not contain '..' path segments\"))\n }\n\n if (normalizedTarget === normalizedHome) {\n return Either.right(\"\")\n }\n\n const prefix = `${normalizedHome}/`\n if (!normalizedTarget.startsWith(prefix)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, `targetDir must be under ${normalizedHome}`))\n }\n\n const relative = normalizedTarget\n .slice(prefix.length)\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\")\n .join(\"/\")\n\n if (relative.length === 0) {\n return Either.right(\"\")\n }\n\n if (hasParentTraversalSegment(relative)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, \"targetDir must not contain '..' path segments\"))\n }\n\n return Either.right(relative)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ProjectConfig } from \"../core/domain.js\"\nimport { runCommandCapture, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport type { CommandFailedError, ScrapWipeRefusedError } from \"../shell/errors.js\"\nimport {\n CommandFailedError as CommandFailedErrorClass,\n ScrapWipeRefusedError as ScrapWipeRefusedErrorClass\n} from \"../shell/errors.js\"\nimport { expandContainerHome } from \"./scrap-path.js\"\n\nconst dockerOk = [0]\n\nexport type ScrapTemplate = {\n readonly sshUser: string\n readonly containerName: string\n readonly targetDir: string\n readonly volumeName: string\n readonly codexHome: string\n}\n\nexport const buildScrapTemplate = (config: ProjectConfig): ScrapTemplate => ({\n sshUser: config.template.sshUser,\n containerName: config.template.containerName,\n targetDir: expandContainerHome(config.template.sshUser, config.template.targetDir),\n volumeName: config.template.volumeName,\n codexHome: config.template.codexHome\n})\n\nexport const eitherToEffect = <A, E>(either: Either.Either<A, E>): Effect.Effect<A, E> =>\n Either.match(either, {\n onLeft: (error) => Effect.fail(error),\n onRight: (value) => Effect.succeed(value)\n })\n\nexport const shellEscape = (value: string): string => {\n if (value.length === 0) {\n return \"''\"\n }\n if (!/[^\\w@%+=:,./-]/.test(value)) {\n return value\n }\n const escaped = value.replaceAll(\"'\", \"'\\\"'\\\"'\")\n return `'${escaped}'`\n}\n\nexport const runShell = (\n cwd: string,\n label: string,\n script: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n // NOTE: avoid `sh -l` on the host; some distros ship /etc/profile that is bash-only and breaks dash/posix sh.\n { cwd, command: \"sh\", args: [\"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `sh (${label})`, exitCode })\n )\n\nexport const runDockerExecCapture = (\n cwd: string,\n label: string,\n containerName: string,\n script: string,\n user?: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n // NOTE: avoid `sh -l` inside containers; it can source /etc/profile which may be bash-only and break dash/posix sh.\n { cwd, command: \"docker\", args: [\"exec\", ...(user ? [\"-u\", user] : []), containerName, \"sh\", \"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `docker exec (${label})`, exitCode })\n )\n\nexport const runDockerExec = (\n cwd: string,\n label: string,\n containerName: string,\n script: string,\n user?: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n // NOTE: avoid `sh -l` inside containers; it can source /etc/profile which may be bash-only and break dash/posix sh.\n { cwd, command: \"docker\", args: [\"exec\", ...(user ? [\"-u\", user] : []), containerName, \"sh\", \"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `docker exec (${label})`, exitCode })\n )\n\nexport const ensureSafeScrapImportWipe = (\n wipe: boolean,\n template: ScrapTemplate,\n relative: string\n): Effect.Effect<void, ScrapWipeRefusedError> =>\n wipe && relative.length === 0\n ? Effect.fail(\n new ScrapWipeRefusedErrorClass({\n sshUser: template.sshUser,\n targetDir: template.targetDir,\n reason: `wipe would target /home/${template.sshUser}`\n })\n )\n : Effect.void\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { ProjectConfig, ScrapExportCommand } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport {\n listChunkParts,\n maxGitBlobBytes,\n removeChunkArtifacts,\n sumFileSizes,\n writeChunkManifest\n} from \"./scrap-chunks.js\"\nimport type { ScrapTemplate } from \"./scrap-common.js\"\nimport { buildScrapTemplate, runDockerExecCapture, runShell, shellEscape } from \"./scrap-common.js\"\nimport type { SessionManifest } from \"./scrap-session-manifest.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\ntype SessionRepoInfo = SessionManifest[\"repo\"]\n\ntype SessionExportContext = {\n readonly fs: Fs\n readonly path: PathService\n readonly resolved: string\n readonly config: ProjectConfig\n readonly template: ScrapTemplate\n readonly snapshotId: string\n readonly snapshotDir: string\n}\n\ntype HostEnvArtifacts = {\n readonly envGlobalFile: string | null\n readonly envProjectFile: string | null\n}\n\ntype SessionManifestInput = {\n readonly repo: SessionRepoInfo\n readonly patchChunksPath: string\n readonly codexChunksPath: string\n readonly codexSharedChunksPath: string\n readonly hostEnv: HostEnvArtifacts\n readonly rebuildCommands: ReadonlyArray<string>\n}\n\nconst formatSnapshotId = (now: Date): string => {\n const year = String(now.getUTCFullYear()).padStart(4, \"0\")\n const month = String(now.getUTCMonth() + 1).padStart(2, \"0\")\n const day = String(now.getUTCDate()).padStart(2, \"0\")\n const hour = String(now.getUTCHours()).padStart(2, \"0\")\n const min = String(now.getUTCMinutes()).padStart(2, \"0\")\n const sec = String(now.getUTCSeconds()).padStart(2, \"0\")\n return `${year}${month}${day}T${hour}${min}${sec}Z`\n}\n\nconst loadSessionExportContext = (\n command: ScrapExportCommand\n): Effect.Effect<SessionExportContext, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const template = buildScrapTemplate(config)\n\n const archiveRootAbs = resolvePathFromCwd(path, resolved, command.archivePath)\n const snapshotId = formatSnapshotId(new Date())\n const snapshotDir = path.join(archiveRootAbs, snapshotId)\n yield* _(fs.makeDirectory(snapshotDir, { recursive: true }))\n\n return { fs, path, resolved, config, template, snapshotId, snapshotDir }\n })\n\nconst captureRepoInfo = (\n ctx: SessionExportContext\n): Effect.Effect<SessionRepoInfo, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const base = `set -e; cd ${targetDir};`\n const capture = (label: string, cmd: string) =>\n runDockerExecCapture(ctx.resolved, label, ctx.template.containerName, `${base} ${cmd}`, ctx.template.sshUser)\n .pipe(\n Effect.map((value) => value.trim())\n )\n\n const safe = targetDir\n const head = yield* _(capture(\"scrap session rev-parse\", `git -c safe.directory=${safe} rev-parse HEAD`))\n const branch = yield* _(\n capture(\"scrap session branch\", `git -c safe.directory=${safe} rev-parse --abbrev-ref HEAD`)\n )\n const originUrl = yield* _(capture(\"scrap session origin\", `git -c safe.directory=${safe} remote get-url origin`))\n return { originUrl, head, branch }\n })\n\nconst exportHostEnvFiles = (\n ctx: SessionExportContext\n): Effect.Effect<HostEnvArtifacts, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const copyIfExists = (srcAbs: string, dstName: string) =>\n Effect.gen(function*(__) {\n const exists = yield* __(ctx.fs.exists(srcAbs))\n if (!exists) {\n return null\n }\n const contents = yield* __(ctx.fs.readFileString(srcAbs))\n const dstAbs = ctx.path.join(ctx.snapshotDir, dstName)\n yield* __(ctx.fs.writeFileString(dstAbs, contents))\n return dstName\n })\n\n const envGlobalAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envGlobalPath)\n const envProjectAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envProjectPath)\n\n const envGlobalFile = yield* _(copyIfExists(envGlobalAbs, \"env-global.env\"))\n const envProjectFile = yield* _(copyIfExists(envProjectAbs, \"env-project.env\"))\n\n return { envGlobalFile, envProjectFile }\n })\n\nconst detectRebuildCommands = (\n ctx: SessionExportContext\n): Effect.Effect<ReadonlyArray<string>, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const script = [\n \"set -e\",\n `cd ${targetDir}`,\n // Priority: pnpm > npm > yarn. Keep commands deterministic and rebuildable.\n \"if [ -f pnpm-lock.yaml ]; then echo 'pnpm install --frozen-lockfile'; exit 0; fi\",\n \"if [ -f package-lock.json ]; then echo 'npm ci'; exit 0; fi\",\n \"if [ -f yarn.lock ]; then echo 'yarn install --frozen-lockfile'; exit 0; fi\",\n \"exit 0\"\n ].join(\"; \")\n\n const output = yield* _(\n runDockerExecCapture(\n ctx.resolved,\n \"scrap session detect rebuild\",\n ctx.template.containerName,\n script,\n ctx.template.sshUser\n )\n )\n\n const command = output.trim()\n return command.length > 0 ? [command] : []\n })\n\nconst exportWorktreePatchChunks = (\n ctx: SessionExportContext\n): Effect.Effect<string, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const patchAbs = ctx.path.join(ctx.snapshotDir, \"worktree.patch.gz\")\n const patchPartsPrefix = `${patchAbs}.part`\n yield* _(removeChunkArtifacts(ctx.fs, ctx.path, patchAbs))\n\n const patchInner = [\n \"set -e\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"TMP_INDEX=$(mktemp)\",\n \"trap 'rm -f \\\"$TMP_INDEX\\\"' EXIT\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" read-tree HEAD\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" add -A\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" diff --cached --binary --no-color\"\n ].join(\"; \")\n\n const patchPipeline = [\n `docker exec -u ${shellEscape(ctx.template.sshUser)} ${shellEscape(ctx.template.containerName)} sh -c ${\n shellEscape(patchInner)\n }`,\n \"gzip -c\",\n `split -b ${maxGitBlobBytes} -d -a 5 - ${shellEscape(patchPartsPrefix)}`\n ].join(\" | \")\n const patchScript = `set -e; bash -o pipefail -c ${shellEscape(patchPipeline)}`\n yield* _(runShell(ctx.resolved, \"scrap export session patch\", patchScript))\n\n const partsAbs = yield* _(listChunkParts(ctx.fs, ctx.path, patchAbs))\n const totalSize = yield* _(sumFileSizes(ctx.fs, partsAbs))\n return yield* _(writeChunkManifest(ctx.fs, ctx.path, patchAbs, totalSize, partsAbs))\n })\n\nconst exportContainerDirChunks = (\n ctx: SessionExportContext,\n srcDir: string,\n archiveName: string,\n label: string\n): Effect.Effect<string, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const archiveAbs = ctx.path.join(ctx.snapshotDir, archiveName)\n const partsPrefix = `${archiveAbs}.part`\n yield* _(removeChunkArtifacts(ctx.fs, ctx.path, archiveAbs))\n\n const inner = [\n \"set -e\",\n `SRC=${shellEscape(srcDir)}`,\n \"mkdir -p \\\"$SRC\\\"\",\n \"tar czf - -C \\\"$SRC\\\" .\"\n ].join(\"; \")\n\n const archivePipeline = [\n `docker exec -u ${shellEscape(ctx.template.sshUser)} ${shellEscape(ctx.template.containerName)} sh -c ${\n shellEscape(inner)\n }`,\n `split -b ${maxGitBlobBytes} -d -a 5 - ${shellEscape(partsPrefix)}`\n ].join(\" | \")\n const script = `set -e; bash -o pipefail -c ${shellEscape(archivePipeline)}`\n yield* _(runShell(ctx.resolved, label, script))\n\n const partsAbs = yield* _(listChunkParts(ctx.fs, ctx.path, archiveAbs))\n const totalSize = yield* _(sumFileSizes(ctx.fs, partsAbs))\n return yield* _(writeChunkManifest(ctx.fs, ctx.path, archiveAbs, totalSize, partsAbs))\n })\n\nconst writeSessionManifest = (\n ctx: SessionExportContext,\n input: SessionManifestInput\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const manifest: SessionManifest = {\n schemaVersion: 1,\n mode: \"session\",\n snapshotId: ctx.snapshotId,\n createdAtUtc: new Date().toISOString(),\n repo: input.repo,\n artifacts: {\n worktreePatchChunks: ctx.path.basename(input.patchChunksPath),\n codexChunks: ctx.path.basename(input.codexChunksPath),\n codexSharedChunks: ctx.path.basename(input.codexSharedChunksPath),\n envGlobalFile: input.hostEnv.envGlobalFile,\n envProjectFile: input.hostEnv.envProjectFile\n },\n rebuild: {\n commands: [...input.rebuildCommands]\n }\n }\n const manifestPath = ctx.path.join(ctx.snapshotDir, \"manifest.json\")\n yield* _(ctx.fs.writeFileString(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`))\n }).pipe(Effect.asVoid)\n\nexport const exportScrapSession = (\n command: ScrapExportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const ctx = yield* _(loadSessionExportContext(command))\n yield* _(\n Effect.log(\n [\n `Project: ${ctx.resolved}`,\n \"Mode: session\",\n `Container: ${ctx.template.containerName}`,\n `Workspace: ${ctx.template.targetDir}`,\n `Output: ${ctx.snapshotDir}`\n ].join(\"\\n\")\n )\n )\n\n const repo = yield* _(captureRepoInfo(ctx))\n const hostEnv = yield* _(exportHostEnvFiles(ctx))\n const rebuildCommands = yield* _(detectRebuildCommands(ctx))\n\n const patchChunksPath = yield* _(exportWorktreePatchChunks(ctx))\n const codexChunksPath = yield* _(\n exportContainerDirChunks(ctx, ctx.template.codexHome, \"codex.tar.gz\", \"scrap export session codex\")\n )\n\n const codexSharedHome = `${ctx.template.codexHome}-shared`\n const codexSharedChunksPath = yield* _(\n exportContainerDirChunks(ctx, codexSharedHome, \"codex-shared.tar.gz\", \"scrap export session codex-shared\")\n )\n\n yield* _(\n writeSessionManifest(ctx, {\n repo,\n patchChunksPath,\n codexChunksPath,\n codexSharedChunksPath,\n hostEnv,\n rebuildCommands\n })\n )\n yield* _(Effect.log(\"Scrap session export complete.\"))\n }).pipe(Effect.asVoid)\n","import * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ScrapArchiveInvalidError } from \"../shell/errors.js\"\nimport { ScrapArchiveInvalidError as ScrapArchiveInvalidErrorClass } from \"../shell/errors.js\"\n\nexport type SessionManifest = {\n readonly schemaVersion: 1\n readonly mode: \"session\"\n readonly snapshotId: string\n readonly createdAtUtc: string\n readonly repo: {\n readonly originUrl: string\n readonly head: string\n readonly branch: string\n }\n readonly artifacts: {\n readonly worktreePatchChunks: string\n readonly codexChunks: string\n readonly codexSharedChunks: string\n readonly envGlobalFile: string | null\n readonly envProjectFile: string | null\n }\n readonly rebuild: {\n readonly commands: ReadonlyArray<string>\n }\n}\n\nconst SessionManifestSchema = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n mode: Schema.Literal(\"session\"),\n snapshotId: Schema.String,\n createdAtUtc: Schema.String,\n repo: Schema.Struct({\n originUrl: Schema.String,\n head: Schema.String,\n branch: Schema.String\n }),\n artifacts: Schema.Struct({\n worktreePatchChunks: Schema.String,\n codexChunks: Schema.String,\n codexSharedChunks: Schema.String,\n envGlobalFile: Schema.optionalWith(Schema.Union(Schema.String, Schema.Null), { default: () => null }),\n envProjectFile: Schema.optionalWith(Schema.Union(Schema.String, Schema.Null), { default: () => null })\n }),\n rebuild: Schema.optionalWith(\n Schema.Struct({\n commands: Schema.Array(Schema.String)\n }),\n { default: () => ({ commands: [] }) }\n )\n})\n\nconst SessionManifestJsonSchema = Schema.parseJson(SessionManifestSchema)\n\nexport const decodeSessionManifest = (\n manifestPath: string,\n input: string\n): Effect.Effect<SessionManifest, ScrapArchiveInvalidError> =>\n Either.match(ParseResult.decodeUnknownEither(SessionManifestJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ScrapArchiveInvalidErrorClass({\n path: manifestPath,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { ProjectConfig, ScrapImportCommand } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ScrapArchiveNotFoundError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { decodeChunkManifest } from \"./scrap-chunks.js\"\nimport {\n buildScrapTemplate,\n eitherToEffect,\n ensureSafeScrapImportWipe,\n runDockerExec,\n runShell,\n shellEscape\n} from \"./scrap-common.js\"\nimport { deriveScrapWorkspaceRelativePath } from \"./scrap-path.js\"\nimport { decodeSessionManifest, type SessionManifest } from \"./scrap-session-manifest.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\ntype SessionImportContext = {\n readonly fs: Fs\n readonly path: PathService\n readonly resolved: string\n readonly config: ProjectConfig\n readonly template: ReturnType<typeof buildScrapTemplate>\n readonly snapshotDir: string\n readonly manifest: SessionManifest\n}\n\nconst resolveSessionSnapshotDir = (\n fs: Fs,\n path: PathService,\n projectDir: string,\n archivePath: string\n): Effect.Effect<string, ScrapArchiveNotFoundError | PlatformError> =>\n Effect.gen(function*(_) {\n const baseAbs = resolvePathFromCwd(path, projectDir, archivePath)\n const exists = yield* _(fs.exists(baseAbs))\n if (!exists) {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n }\n\n const baseStat = yield* _(fs.stat(baseAbs))\n if (baseStat.type !== \"Directory\") {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n }\n\n const direct = yield* _(fs.exists(path.join(baseAbs, \"manifest.json\")))\n if (direct) {\n return baseAbs\n }\n\n const entries = yield* _(fs.readDirectory(baseAbs))\n const sorted = entries.toSorted((a, b) => b.localeCompare(a))\n for (const entry of sorted) {\n const dirAbs = path.join(baseAbs, entry)\n const stat = yield* _(fs.stat(dirAbs))\n if (stat.type !== \"Directory\") {\n continue\n }\n const hasManifest = yield* _(fs.exists(path.join(dirAbs, \"manifest.json\")))\n if (hasManifest) {\n return dirAbs\n }\n }\n\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n })\n\nconst loadSessionImportContext = (\n command: ScrapImportCommand\n): Effect.Effect<SessionImportContext, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const template = buildScrapTemplate(config)\n\n const relative = yield* _(eitherToEffect(deriveScrapWorkspaceRelativePath(template.sshUser, template.targetDir)))\n yield* _(ensureSafeScrapImportWipe(command.wipe, template, relative))\n\n const snapshotDir = yield* _(resolveSessionSnapshotDir(fs, path, resolved, command.archivePath))\n const manifestPath = path.join(snapshotDir, \"manifest.json\")\n const manifestText = yield* _(fs.readFileString(manifestPath))\n const manifest = yield* _(decodeSessionManifest(manifestPath, manifestText))\n\n return { fs, path, resolved, config, template, snapshotDir, manifest }\n })\n\nconst resolveSnapshotPartsAbs = (\n ctx: SessionImportContext,\n chunksFile: string\n): Effect.Effect<ReadonlyArray<string>, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const chunksAbs = ctx.path.join(ctx.snapshotDir, chunksFile)\n const chunksText = yield* _(ctx.fs.readFileString(chunksAbs))\n const chunks = yield* _(decodeChunkManifest(chunksAbs, chunksText))\n const partsAbs = chunks.parts.map((part) => ctx.path.join(ctx.snapshotDir, part))\n for (const partAbs of partsAbs) {\n const partExists = yield* _(ctx.fs.exists(partAbs))\n if (!partExists) {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: partAbs })))\n }\n }\n return partsAbs\n })\n\nconst restoreHostEnvFiles = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const restore = (snapshotFileName: string | null | undefined, dstAbs: string, label: string) =>\n Effect.gen(function*(__) {\n const name = snapshotFileName?.trim() ?? \"\"\n if (name.length === 0 || name === \"null\") {\n return\n }\n\n const srcAbs = ctx.path.join(ctx.snapshotDir, name)\n const exists = yield* __(ctx.fs.exists(srcAbs))\n if (!exists) {\n return\n }\n\n const contents = yield* __(ctx.fs.readFileString(srcAbs))\n yield* __(ctx.fs.makeDirectory(ctx.path.dirname(dstAbs), { recursive: true }))\n yield* __(ctx.fs.writeFileString(dstAbs, contents))\n yield* __(Effect.log(`Restored ${label}: ${dstAbs}`))\n })\n\n const envGlobalAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envGlobalPath)\n const envProjectAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envProjectPath)\n\n yield* _(restore(ctx.manifest.artifacts.envGlobalFile, envGlobalAbs, \"env-global\"))\n yield* _(restore(ctx.manifest.artifacts.envProjectFile, envProjectAbs, \"env-project\"))\n }).pipe(Effect.asVoid)\n\nconst prepareRepoForImport = (\n ctx: SessionImportContext,\n wipe: boolean\n): Effect.Effect<void, ScrapError, ScrapRequirements> => {\n const targetDir = shellEscape(ctx.template.targetDir)\n const wipeLine = wipe ? `rm -rf ${targetDir}` : \":\"\n const gitDir = `${ctx.template.targetDir}/.git`\n const prepScript = [\n \"set -e\",\n wipeLine,\n `mkdir -p ${targetDir}`,\n `if [ ! -d ${shellEscape(gitDir)} ]; then`,\n ` PARENT=$(dirname ${targetDir})`,\n \" mkdir -p \\\"$PARENT\\\"\",\n ` git clone ${shellEscape(ctx.manifest.repo.originUrl)} ${targetDir}`,\n \"fi\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"git -c safe.directory=\\\"$SAFE\\\" fetch --all --prune\",\n `git -c safe.directory=\"$SAFE\" checkout --detach ${shellEscape(ctx.manifest.repo.head)}`,\n `git -c safe.directory=\"$SAFE\" reset --hard ${shellEscape(ctx.manifest.repo.head)}`,\n \"git -c safe.directory=\\\"$SAFE\\\" clean -fd\",\n // Remove common heavy caches that are easy to rebuild with internet access.\n \"find . -name node_modules -type d -prune -exec rm -rf '{}' + 2>/dev/null || true\"\n ].join(\"\\n\")\n\n return runDockerExec(\n ctx.resolved,\n \"scrap session prepare repo\",\n ctx.template.containerName,\n prepScript,\n ctx.template.sshUser\n )\n}\n\nconst applyWorktreePatch = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const patchPartsAbs = yield* _(resolveSnapshotPartsAbs(ctx, ctx.manifest.artifacts.worktreePatchChunks))\n const patchCatArgs = patchPartsAbs.map((p) => shellEscape(p)).join(\" \")\n const targetDir = shellEscape(ctx.template.targetDir)\n const applyInner = [\n \"set -e\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"git -c safe.directory=\\\"$SAFE\\\" apply --allow-empty --binary --whitespace=nowarn -\"\n ].join(\"; \")\n const applyScript = [\n \"set -e\",\n `cat ${patchCatArgs} | gzip -dc | docker exec -i -u ${shellEscape(ctx.template.sshUser)} ${\n shellEscape(\n ctx.template.containerName\n )\n } sh -c ${\n shellEscape(\n applyInner\n )\n }`\n ].join(\"; \")\n yield* _(runShell(ctx.resolved, \"scrap session apply patch\", applyScript))\n }).pipe(Effect.asVoid)\n\nconst restoreTarChunksIntoContainerDir = (\n ctx: SessionImportContext,\n dst: string,\n chunksFile: string,\n label: string\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const partsAbs = yield* _(resolveSnapshotPartsAbs(ctx, chunksFile))\n const catArgs = partsAbs.map((partAbs) => shellEscape(partAbs)).join(\" \")\n const inner = [\n \"set -e\",\n `DST=${shellEscape(dst)}`,\n \"mkdir -p \\\"$DST\\\"\",\n // Clearing contents instead of removing the directory keeps mount points (like shared auth volumes) intact.\n \"find \\\"$DST\\\" -mindepth 1 -maxdepth 1 -exec rm -rf '{}' + 2>/dev/null || true\",\n \"tar xzf - -C \\\"$DST\\\"\"\n ].join(\"; \")\n const script = [\n \"set -e\",\n `cat ${catArgs} | docker exec -i -u ${shellEscape(ctx.template.sshUser)} ${\n shellEscape(\n ctx.template.containerName\n )\n } sh -c ${shellEscape(inner)}`\n ].join(\"; \")\n yield* _(runShell(ctx.resolved, label, script))\n }).pipe(Effect.asVoid)\n\nconst runRebuildCommands = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const commands = ctx.manifest.rebuild.commands\n if (commands.length === 0) {\n return\n }\n\n for (const command of commands) {\n const trimmed = command.trim()\n if (trimmed.length === 0) {\n continue\n }\n yield* _(Effect.log(`Rebuilding: ${trimmed}`))\n const script = `set -e; cd ${targetDir}; ${trimmed}`\n yield* _(\n runDockerExec(ctx.resolved, \"scrap session rebuild\", ctx.template.containerName, script, ctx.template.sshUser)\n )\n }\n }).pipe(Effect.asVoid)\n\nexport const importScrapSession = (\n command: ScrapImportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const ctx = yield* _(loadSessionImportContext(command))\n yield* _(\n Effect.log(\n [\n `Project: ${ctx.resolved}`,\n \"Mode: session\",\n `Snapshot: ${ctx.snapshotDir}`,\n `Container: ${ctx.template.containerName}`,\n `Workspace: ${ctx.template.targetDir}`,\n `Repo: ${ctx.manifest.repo.originUrl} @ ${ctx.manifest.repo.head}`\n ].join(\"\\n\")\n )\n )\n\n yield* _(restoreHostEnvFiles(ctx))\n yield* _(prepareRepoForImport(ctx, command.wipe))\n yield* _(applyWorktreePatch(ctx))\n\n yield* _(\n restoreTarChunksIntoContainerDir(\n ctx,\n ctx.template.codexHome,\n ctx.manifest.artifacts.codexChunks,\n \"scrap session restore codex\"\n )\n )\n\n const codexSharedHome = `${ctx.template.codexHome}-shared`\n yield* _(\n restoreTarChunksIntoContainerDir(\n ctx,\n codexSharedHome,\n ctx.manifest.artifacts.codexSharedChunks,\n \"scrap session restore codex-shared\"\n )\n )\n\n yield* _(runRebuildCommands(ctx))\n yield* _(Effect.log(\"Scrap session import complete.\"))\n }).pipe(Effect.asVoid)\n","import { Effect } from \"effect\"\n\nimport type { ScrapExportCommand, ScrapImportCommand } from \"../core/domain.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport { exportScrapSession, importScrapSession } from \"./scrap-session.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\nexport { deriveScrapWorkspaceRelativePath } from \"./scrap-path.js\"\nexport type { ScrapError } from \"./scrap-types.js\"\n\nexport const exportScrap = (\n command: ScrapExportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n yield* _(exportScrapSession(command))\n }).pipe(Effect.asVoid)\n\nexport const importScrap = (\n command: ScrapImportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n yield* _(importScrapSession(command))\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { SessionsKillCommand, SessionsListCommand, SessionsLogsCommand } from \"../core/domain.js\"\nimport { runCommandCapture, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport type { ConfigDecodeError, ConfigNotFoundError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\n\ntype SessionsError = CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError\ntype SessionsRequirements = Fs | PathService | CommandExecutor.CommandExecutor\n\nconst dockerOk = [0]\nconst baselineFile = \"/run/docker-git/terminal-baseline.pids\"\n\nconst buildFilteredPs = (mode: \"tty\" | \"bg\"): string =>\n `ps -eo pid,tty,etime,cmd --sort=etime | awk -v base=\"$BASELINE_FILE\" -v mode=\"${mode}\" 'BEGIN { while ((getline < base) > 0) baseline[$1]=1 } NR==1 {print; next} { pid=$1; tty=$2; cmd=$4; for (i=5;i<=NF;i++) cmd=cmd \" \" $i; if (baseline[pid]) next; if (cmd ~ /^sshd/ || cmd ~ /^-?bash/ || cmd ~ /^bash/ || cmd ~ /^sh/ || cmd ~ /^zsh/ || cmd ~ /^fish/ || cmd ~ /^ps / || cmd ~ /^awk / || cmd ~ /^grep / || cmd ~ /^tail / || cmd ~ /^who /) next; if (mode==\"tty\" && tty==\"?\") next; if (mode==\"bg\" && tty!=\"?\") next; print; found=1 } END { if (!found) print \"(none)\" }'`\n\nconst makeDockerExecSpec = (containerName: string, args: ReadonlyArray<string>) => ({\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"exec\", containerName, ...args]\n})\n\nconst runDockerExecCapture = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n makeDockerExecSpec(containerName, args),\n dockerOk,\n (exitCode) => new CommandFailedError({ command: \"docker exec\", exitCode })\n )\n\nconst runDockerExec = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n makeDockerExecSpec(containerName, args),\n dockerOk,\n (exitCode) => new CommandFailedError({ command: \"docker exec\", exitCode })\n )\n\nconst loadProjectContainer = (\n projectDir: string\n): Effect.Effect<\n { readonly projectDir: string; readonly containerName: string },\n ConfigNotFoundError | ConfigDecodeError | PlatformError,\n Fs | PathService\n> =>\n Effect.gen(function*(_) {\n const { resolved } = yield* _(resolveBaseDir(projectDir))\n const config = yield* _(readProjectConfig(resolved))\n return { projectDir: resolved, containerName: config.template.containerName }\n })\n\nconst loadAndLogContainer = (\n projectDir: string\n): Effect.Effect<\n { readonly projectDir: string; readonly containerName: string },\n SessionsError,\n Fs | PathService\n> =>\n Effect.gen(function*(_) {\n const info = yield* _(loadProjectContainer(projectDir))\n yield* _(Effect.log(`Project: ${info.projectDir}`))\n yield* _(Effect.log(`Container: ${info.containerName}`))\n return info\n })\n\nconst logCommandOutput = (output: string): Effect.Effect<void> =>\n output.trim().length === 0 ? Effect.log(\"(no output)\") : Effect.log(output.trimEnd())\n\nconst runDockerExecCaptureLogged = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, SessionsError, CommandExecutor.CommandExecutor> =>\n Effect.flatMap(runDockerExecCapture(containerName, args), logCommandOutput)\n\nconst runSessionScript = (\n projectDir: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n Effect.gen(function*(_) {\n const { containerName } = yield* _(loadAndLogContainer(projectDir))\n yield* _(runDockerExecCaptureLogged(containerName, [\"bash\", \"-lc\", ...args]))\n })\n\n// CHANGE: run terminal session scripts under bash\n// WHY: Ubuntu /bin/sh (dash) fails on /etc/profile.d/zz-prompt.sh when run as a login shell\n// QUOTE(ТЗ): \"docker exec failed with exit code 2\"\n// REF: user-request-2026-02-05-sessions-bash\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cmd: shell(cmd)=bash → compatible(cmd, /etc/profile.d/zz-prompt.sh)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, CommandExecutor>\n// INVARIANT: shell for scripts is deterministic (bash)\n// COMPLEXITY: O(1)\nconst listSessionsScriptAll = [\n \"echo \\\"TTY sessions (who -u)\\\"\",\n \"who -u 2>/dev/null || true\",\n \"echo \\\"\\\"\",\n \"echo \\\"TTY processes\\\"\",\n \"ps -eo pid,tty,etime,cmd --sort=etime | awk 'NR==1 {print; next} $2 != \\\"?\\\" {print; found=1} END { if (!found) print \\\"(none)\\\" }'\",\n \"echo \\\"\\\"\",\n \"echo \\\"Background processes (no TTY)\\\"\",\n \"ps -eo pid,tty,etime,cmd --sort=etime | awk 'NR==1 {print; next} $2 == \\\"?\\\" {print; found=1} END { if (!found) print \\\"(none)\\\" }'\"\n].join(\"; \")\n\n// CHANGE: hide default/system processes from sessions list by default\n// WHY: reduce noise from sshd/login shells and baseline tasks\n// QUOTE(ТЗ): \"Можно ли запомнить какие процессы изначально запущены и просто их не отображать как терминалы?\"\n// REF: user-request-2026-02-05-sessions-baseline\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: default(p) ∧ ¬includeDefault → hidden(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, CommandExecutor>\n// INVARIANT: includeDefault=true preserves full list\n// COMPLEXITY: O(n) where n = number of processes\nconst buildListSessionsScript = (includeDefault: boolean): string => {\n if (includeDefault) {\n return listSessionsScriptAll\n }\n\n return [\n `BASELINE_FILE=\"${baselineFile}\"`,\n \"if [ ! -f \\\"$BASELINE_FILE\\\" ]; then BASELINE_FILE=\\\"/dev/null\\\"; fi\",\n \"echo \\\"TTY sessions (who -u)\\\"\",\n \"who -u 2>/dev/null || true\",\n \"echo \\\"\\\"\",\n \"echo \\\"TTY processes (user only)\\\"\",\n buildFilteredPs(\"tty\"),\n \"echo \\\"\\\"\",\n \"echo \\\"Background processes (user only)\\\"\",\n buildFilteredPs(\"bg\")\n ].join(\"; \")\n}\n\nconst logsScript = [\n \"pid=\\\"$1\\\"\",\n \"lines=\\\"$2\\\"\",\n \"if [ -z \\\"$pid\\\" ]; then echo \\\"Missing pid\\\"; exit 2; fi\",\n \"if [ -z \\\"$lines\\\" ]; then lines=200; fi\",\n \"if [ ! -d \\\"/proc/$pid\\\" ]; then echo \\\"PID $pid not found\\\"; exit 3; fi\",\n \"resolve_log() {\",\n \" for fd in 1 2; do\",\n \" target=$(readlink -f \\\"/proc/$pid/fd/$fd\\\" 2>/dev/null || true)\",\n \" if [ -n \\\"$target\\\" ] && [ -f \\\"$target\\\" ]; then\",\n \" echo \\\"$target\\\"\",\n \" return 0\",\n \" fi\",\n \" done\",\n \" return 1\",\n \"}\",\n \"logfile=$(resolve_log || true)\",\n \"if [ -z \\\"$logfile\\\" ]; then\",\n \" echo \\\"No file-backed stdout/stderr for PID $pid\\\"\",\n \" exit 4\",\n \"fi\",\n \"echo \\\"Log file: $logfile\\\"\",\n \"tail -n \\\"$lines\\\" \\\"$logfile\\\" 2>&1\"\n].join(\"; \")\n\n// CHANGE: list active terminal sessions inside a docker-git container\n// WHY: expose container TTY/background processes from CLI\n// QUOTE(ТЗ): \"CLI команду которая из докера вернёт запущенные терминал сессии\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: sessions(p) -> output(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: project config resolves container name deterministically\n// COMPLEXITY: O(n) where n = number of processes\nexport const listTerminalSessions = (\n command: SessionsListCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n runSessionScript(command.projectDir, [buildListSessionsScript(command.includeDefault)])\n\n// CHANGE: stop a background process inside a docker-git container\n// WHY: allow shutting down long-running terminal jobs from CLI\n// QUOTE(ТЗ): \"иметь возможность его отключать\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall pid: kill(pid) -> stopped(pid)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: kill targets a single PID\n// COMPLEXITY: O(1)\nexport const killTerminalProcess = (\n command: SessionsKillCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n Effect.gen(function*(_) {\n const { containerName } = yield* _(loadAndLogContainer(command.projectDir))\n yield* _(runDockerExec(containerName, [\"kill\", \"-TERM\", String(command.pid)]))\n yield* _(Effect.log(`Sent SIGTERM to PID ${command.pid}`))\n })\n\n// CHANGE: tail stdout/stderr logs for a container process\n// WHY: expose background job logs without manual docker exec\n// QUOTE(ТЗ): \"иметь возможность его просматривать Что пишет он в терминал лог\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall pid: logs(pid) -> output(pid)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: uses file-backed stdout/stderr when present\n// COMPLEXITY: O(n) where n = log lines\nexport const tailTerminalLogs = (\n command: SessionsLogsCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n runSessionScript(command.projectDir, [\n logsScript,\n \"--\",\n String(command.pid),\n String(command.lines)\n ])\n","import { Either } from \"effect\"\n\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport type { ParseError } from \"@effect-template/lib/core/domain\"\n\ninterface ValueOptionSpec {\n readonly flag: string\n readonly key:\n | \"repoUrl\"\n | \"repoRef\"\n | \"targetDir\"\n | \"sshPort\"\n | \"sshUser\"\n | \"containerName\"\n | \"serviceName\"\n | \"volumeName\"\n | \"secretsRoot\"\n | \"authorizedKeysPath\"\n | \"envGlobalPath\"\n | \"envProjectPath\"\n | \"codexAuthPath\"\n | \"codexHome\"\n | \"dockerNetworkMode\"\n | \"dockerSharedNetworkName\"\n | \"archivePath\"\n | \"scrapMode\"\n | \"label\"\n | \"gitTokenLabel\"\n | \"codexTokenLabel\"\n | \"claudeTokenLabel\"\n | \"token\"\n | \"scopes\"\n | \"message\"\n | \"outDir\"\n | \"projectDir\"\n | \"lines\"\n}\n\nconst valueOptionSpecs: ReadonlyArray<ValueOptionSpec> = [\n { flag: \"--repo-url\", key: \"repoUrl\" },\n { flag: \"--repo-ref\", key: \"repoRef\" },\n { flag: \"--branch\", key: \"repoRef\" },\n { flag: \"-b\", key: \"repoRef\" },\n { flag: \"--target-dir\", key: \"targetDir\" },\n { flag: \"--ssh-port\", key: \"sshPort\" },\n { flag: \"--ssh-user\", key: \"sshUser\" },\n { flag: \"--container-name\", key: \"containerName\" },\n { flag: \"--service-name\", key: \"serviceName\" },\n { flag: \"--volume-name\", key: \"volumeName\" },\n { flag: \"--secrets-root\", key: \"secretsRoot\" },\n { flag: \"--authorized-keys\", key: \"authorizedKeysPath\" },\n { flag: \"--env-global\", key: \"envGlobalPath\" },\n { flag: \"--env-project\", key: \"envProjectPath\" },\n { flag: \"--codex-auth\", key: \"codexAuthPath\" },\n { flag: \"--codex-home\", key: \"codexHome\" },\n { flag: \"--network-mode\", key: \"dockerNetworkMode\" },\n { flag: \"--shared-network\", key: \"dockerSharedNetworkName\" },\n { flag: \"--archive\", key: \"archivePath\" },\n { flag: \"--mode\", key: \"scrapMode\" },\n { flag: \"--label\", key: \"label\" },\n { flag: \"--git-token\", key: \"gitTokenLabel\" },\n { flag: \"--codex-token\", key: \"codexTokenLabel\" },\n { flag: \"--claude-token\", key: \"claudeTokenLabel\" },\n { flag: \"--token\", key: \"token\" },\n { flag: \"--scopes\", key: \"scopes\" },\n { flag: \"--message\", key: \"message\" },\n { flag: \"-m\", key: \"message\" },\n { flag: \"--out-dir\", key: \"outDir\" },\n { flag: \"--project-dir\", key: \"projectDir\" },\n { flag: \"--lines\", key: \"lines\" }\n]\n\nconst valueOptionSpecByFlag: ReadonlyMap<string, ValueOptionSpec> = new Map(\n valueOptionSpecs.map((spec) => [spec.flag, spec])\n)\n\ntype ValueKey = ValueOptionSpec[\"key\"]\n\nconst booleanFlagUpdaters: Readonly<Record<string, (raw: RawOptions) => RawOptions>> = {\n \"--up\": (raw) => ({ ...raw, up: true }),\n \"--no-up\": (raw) => ({ ...raw, up: false }),\n \"--ssh\": (raw) => ({ ...raw, openSsh: true }),\n \"--no-ssh\": (raw) => ({ ...raw, openSsh: false }),\n \"--force\": (raw) => ({ ...raw, force: true }),\n \"--force-env\": (raw) => ({ ...raw, forceEnv: true }),\n \"--mcp-playwright\": (raw) => ({ ...raw, enableMcpPlaywright: true }),\n \"--no-mcp-playwright\": (raw) => ({ ...raw, enableMcpPlaywright: false }),\n \"--wipe\": (raw) => ({ ...raw, wipe: true }),\n \"--no-wipe\": (raw) => ({ ...raw, wipe: false }),\n \"--web\": (raw) => ({ ...raw, authWeb: true }),\n \"--include-default\": (raw) => ({ ...raw, includeDefault: true })\n}\n\nconst valueFlagUpdaters: { readonly [K in ValueKey]: (raw: RawOptions, value: string) => RawOptions } = {\n repoUrl: (raw, value) => ({ ...raw, repoUrl: value }),\n repoRef: (raw, value) => ({ ...raw, repoRef: value }),\n targetDir: (raw, value) => ({ ...raw, targetDir: value }),\n sshPort: (raw, value) => ({ ...raw, sshPort: value }),\n sshUser: (raw, value) => ({ ...raw, sshUser: value }),\n containerName: (raw, value) => ({ ...raw, containerName: value }),\n serviceName: (raw, value) => ({ ...raw, serviceName: value }),\n volumeName: (raw, value) => ({ ...raw, volumeName: value }),\n secretsRoot: (raw, value) => ({ ...raw, secretsRoot: value }),\n authorizedKeysPath: (raw, value) => ({ ...raw, authorizedKeysPath: value }),\n envGlobalPath: (raw, value) => ({ ...raw, envGlobalPath: value }),\n envProjectPath: (raw, value) => ({ ...raw, envProjectPath: value }),\n codexAuthPath: (raw, value) => ({ ...raw, codexAuthPath: value }),\n codexHome: (raw, value) => ({ ...raw, codexHome: value }),\n dockerNetworkMode: (raw, value) => ({ ...raw, dockerNetworkMode: value }),\n dockerSharedNetworkName: (raw, value) => ({ ...raw, dockerSharedNetworkName: value }),\n archivePath: (raw, value) => ({ ...raw, archivePath: value }),\n scrapMode: (raw, value) => ({ ...raw, scrapMode: value }),\n label: (raw, value) => ({ ...raw, label: value }),\n gitTokenLabel: (raw, value) => ({ ...raw, gitTokenLabel: value }),\n codexTokenLabel: (raw, value) => ({ ...raw, codexTokenLabel: value }),\n claudeTokenLabel: (raw, value) => ({ ...raw, claudeTokenLabel: value }),\n token: (raw, value) => ({ ...raw, token: value }),\n scopes: (raw, value) => ({ ...raw, scopes: value }),\n message: (raw, value) => ({ ...raw, message: value }),\n outDir: (raw, value) => ({ ...raw, outDir: value }),\n projectDir: (raw, value) => ({ ...raw, projectDir: value }),\n lines: (raw, value) => ({ ...raw, lines: value })\n}\n\nexport const applyCommandBooleanFlag = (raw: RawOptions, token: string): RawOptions | null => {\n const updater = booleanFlagUpdaters[token]\n return updater ? updater(raw) : null\n}\n\nexport const applyCommandValueFlag = (\n raw: RawOptions,\n token: string,\n value: string\n): Either.Either<RawOptions, ParseError> => {\n const valueSpec = valueOptionSpecByFlag.get(token)\n if (valueSpec === undefined) {\n return Either.left({ _tag: \"UnknownOption\", option: token })\n }\n\n const update = valueFlagUpdaters[valueSpec.key]\n return Either.right(update(raw, value))\n}\n\ntype ParseRawOptionsStep =\n | { readonly _tag: \"ok\"; readonly raw: RawOptions; readonly nextIndex: number }\n | { readonly _tag: \"error\"; readonly error: ParseError }\n\nconst parseInlineValueToken = (\n raw: RawOptions,\n token: string\n): Either.Either<RawOptions, ParseError> | null => {\n const equalIndex = token.indexOf(\"=\")\n if (equalIndex <= 0 || !token.startsWith(\"-\")) {\n return null\n }\n\n const flag = token.slice(0, equalIndex)\n const inlineValue = token.slice(equalIndex + 1)\n return applyCommandValueFlag(raw, flag, inlineValue)\n}\n\nconst parseRawOptionsStep = (\n args: ReadonlyArray<string>,\n index: number,\n raw: RawOptions\n): ParseRawOptionsStep => {\n const token = args[index] ?? \"\"\n const inlineApplied = parseInlineValueToken(raw, token)\n if (inlineApplied !== null) {\n return Either.isLeft(inlineApplied)\n ? { _tag: \"error\", error: inlineApplied.left }\n : { _tag: \"ok\", raw: inlineApplied.right, nextIndex: index + 1 }\n }\n\n const booleanApplied = applyCommandBooleanFlag(raw, token)\n if (booleanApplied !== null) {\n return { _tag: \"ok\", raw: booleanApplied, nextIndex: index + 1 }\n }\n\n if (!token.startsWith(\"-\")) {\n return { _tag: \"error\", error: { _tag: \"UnexpectedArgument\", value: token } }\n }\n\n const value = args[index + 1]\n if (value === undefined) {\n return { _tag: \"error\", error: { _tag: \"MissingOptionValue\", option: token } }\n }\n\n const nextRaw = applyCommandValueFlag(raw, token, value)\n return Either.isLeft(nextRaw)\n ? { _tag: \"error\", error: nextRaw.left }\n : { _tag: \"ok\", raw: nextRaw.right, nextIndex: index + 2 }\n}\n\nexport const parseRawOptions = (args: ReadonlyArray<string>): Either.Either<RawOptions, ParseError> => {\n let index = 0\n let raw: RawOptions = {}\n\n while (index < args.length) {\n const step = parseRawOptionsStep(args, index, raw)\n if (step._tag === \"error\") {\n return Either.left(step.error)\n }\n raw = step.raw\n index = step.nextIndex\n }\n\n return Either.right(raw)\n}\n\nexport { type RawOptions } from \"@effect-template/lib/core/command-options\"\n","import { Either } from \"effect\"\n\nimport { deriveRepoPathParts, type ParseError, resolveRepoInput } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions, type RawOptions } from \"./parser-options.js\"\n\ntype PositionalRepo = {\n readonly positionalRepoUrl: string | undefined\n readonly restArgs: ReadonlyArray<string>\n}\n\nexport const resolveWorkspaceRepoPath = (\n resolvedRepo: ReturnType<typeof resolveRepoInput>\n): string => {\n const baseParts = deriveRepoPathParts(resolvedRepo.repoUrl).pathParts\n const projectParts = resolvedRepo.workspaceSuffix ? [...baseParts, resolvedRepo.workspaceSuffix] : baseParts\n return projectParts.join(\"/\")\n}\n\nexport const splitPositionalRepo = (args: ReadonlyArray<string>): PositionalRepo => {\n const first = args[0]\n const positionalRepoUrl = first !== undefined && !first.startsWith(\"-\") ? first : undefined\n const restArgs = positionalRepoUrl ? args.slice(1) : args\n return { positionalRepoUrl, restArgs }\n}\n\nexport const parseProjectDirWithOptions = (\n args: ReadonlyArray<string>,\n defaultProjectDir: string = \".\"\n): Either.Either<{ readonly projectDir: string; readonly raw: RawOptions }, ParseError> =>\n Either.gen(function*(_) {\n const { positionalRepoUrl, restArgs } = splitPositionalRepo(args)\n const raw = yield* _(parseRawOptions(restArgs))\n const rawRepoUrl = raw.repoUrl ?? positionalRepoUrl\n const repoPath = rawRepoUrl ? resolveWorkspaceRepoPath(resolveRepoInput(rawRepoUrl)) : null\n const projectDir = raw.projectDir ??\n (repoPath\n ? `.docker-git/${repoPath}`\n : defaultProjectDir)\n\n return { projectDir, raw }\n })\n\nexport const parseProjectDirArgs = (\n args: ReadonlyArray<string>,\n defaultProjectDir: string = \".\"\n): Either.Either<{ readonly projectDir: string }, ParseError> =>\n Either.map(\n parseProjectDirWithOptions(args, defaultProjectDir),\n ({ projectDir }) => ({ projectDir })\n )\n","import { Either } from \"effect\"\n\nimport { type ApplyCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\n// CHANGE: parse \"apply\" command for existing docker-git projects\n// WHY: update managed docker-git config on the current project/container without creating a new project\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseApply(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<ApplyCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseApply = (\n args: ReadonlyArray<string>\n): Either.Either<ApplyCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"Apply\",\n projectDir,\n runUp: raw.up ?? true,\n gitTokenLabel: raw.gitTokenLabel,\n codexTokenLabel: raw.codexTokenLabel,\n claudeTokenLabel: raw.claudeTokenLabel,\n enableMcpPlaywright: raw.enableMcpPlaywright\n }))\n","import { Either } from \"effect\"\n\nimport { type AttachCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirArgs } from \"./parser-shared.js\"\n\n// CHANGE: parse attach command into a project selection\n// WHY: allow \"docker-git attach\" to open a tmux workspace\n// QUOTE(ТЗ): \"окей Давай подключим tmux\"\n// REF: user-request-2026-02-02-tmux\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseAttach(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<AttachCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseAttach = (args: ReadonlyArray<string>): Either.Either<AttachCommand, ParseError> => {\n return Either.map(parseProjectDirArgs(args), ({ projectDir }) => ({\n _tag: \"Attach\",\n projectDir\n }))\n}\n","import { Either, Match } from \"effect\"\n\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport { type AuthCommand, type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\n\ntype AuthOptions = {\n readonly envGlobalPath: string\n readonly codexAuthPath: string\n readonly claudeAuthPath: string\n readonly label: string | null\n readonly token: string | null\n readonly scopes: string | null\n readonly authWeb: boolean\n}\n\nconst missingArgument = (name: string): ParseError => ({\n _tag: \"MissingRequiredOption\",\n option: name\n})\n\nconst invalidArgument = (name: string, reason: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: name,\n reason\n})\n\nconst normalizeLabel = (value: string | undefined): string | null => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length === 0 ? null : trimmed\n}\n\nconst defaultEnvGlobalPath = \".docker-git/.orch/env/global.env\"\nconst defaultCodexAuthPath = \".docker-git/.orch/auth/codex\"\nconst defaultClaudeAuthPath = \".docker-git/.orch/auth/claude\"\n\nconst resolveAuthOptions = (raw: RawOptions): AuthOptions => ({\n envGlobalPath: raw.envGlobalPath ?? defaultEnvGlobalPath,\n codexAuthPath: raw.codexAuthPath ?? defaultCodexAuthPath,\n claudeAuthPath: defaultClaudeAuthPath,\n label: normalizeLabel(raw.label),\n token: normalizeLabel(raw.token),\n scopes: normalizeLabel(raw.scopes),\n authWeb: raw.authWeb === true\n})\n\nconst buildGithubCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n options.authWeb && options.token !== null\n ? Either.left(invalidArgument(\"--token\", \"cannot be combined with --web\"))\n : Either.right<AuthCommand>({\n _tag: \"AuthGithubLogin\",\n label: options.label,\n token: options.authWeb ? null : options.token,\n scopes: options.scopes,\n envGlobalPath: options.envGlobalPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthGithubStatus\",\n envGlobalPath: options.envGlobalPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthGithubLogout\",\n label: options.label,\n envGlobalPath: options.envGlobalPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildCodexCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexLogin\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexStatus\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexLogout\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildClaudeCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeLogin\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeStatus\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeLogout\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildAuthCommand = (\n provider: string,\n action: string,\n options: AuthOptions\n): Either.Either<AuthCommand, ParseError> =>\n Match.value(provider).pipe(\n Match.when(\"github\", () => buildGithubCommand(action, options)),\n Match.when(\"gh\", () => buildGithubCommand(action, options)),\n Match.when(\"codex\", () => buildCodexCommand(action, options)),\n Match.when(\"claude\", () => buildClaudeCommand(action, options)),\n Match.when(\"cc\", () => buildClaudeCommand(action, options)),\n Match.orElse(() => Either.left(invalidArgument(\"auth provider\", `unknown provider '${provider}'`)))\n )\n\n// CHANGE: parse docker-git auth subcommands\n// WHY: keep auth flows in the same typed CLI parser\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseAuth(argv) = cmd | error\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: no IO or side effects\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseAuth = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n if (args.length < 2) {\n return Either.left(missingArgument(args.length === 0 ? \"auth provider\" : \"auth action\"))\n }\n\n const provider = args[0] ?? \"\"\n const action = args[1] ?? \"\"\n const rest = args.slice(2)\n\n return Either.flatMap(parseRawOptions(rest), (raw) => buildAuthCommand(provider, action, resolveAuthOptions(raw)))\n}\n","import { Either } from \"effect\"\n\nimport { expandContainerHome } from \"../usecases/scrap-path.js\"\nimport { type RawOptions } from \"./command-options.js\"\nimport {\n type CreateCommand,\n defaultTemplateConfig,\n deriveRepoPathParts,\n deriveRepoSlug,\n isDockerNetworkMode,\n type ParseError,\n resolveRepoInput\n} from \"./domain.js\"\nimport { trimRightChar } from \"./strings.js\"\nimport { normalizeAuthLabel, normalizeGitTokenLabel } from \"./token-labels.js\"\n\nconst parsePort = (value: string): Either.Either<number, ParseError> => {\n const parsed = Number(value)\n if (!Number.isInteger(parsed)) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--ssh-port\",\n reason: `expected integer, got: ${value}`\n })\n }\n if (parsed < 1 || parsed > 65_535) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--ssh-port\",\n reason: \"must be between 1 and 65535\"\n })\n }\n return Either.right(parsed)\n}\n\nconst parseDockerNetworkMode = (\n value: string | undefined\n): Either.Either<CreateCommand[\"config\"][\"dockerNetworkMode\"], ParseError> => {\n const candidate = value?.trim() ?? defaultTemplateConfig.dockerNetworkMode\n if (isDockerNetworkMode(candidate)) {\n return Either.right(candidate)\n }\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--network-mode\",\n reason: \"expected one of: shared, project\"\n })\n}\n\nexport const nonEmpty = (\n option: string,\n value: string | undefined,\n fallback?: string\n): Either.Either<string, ParseError> => {\n const candidate = value?.trim() ?? fallback\n if (candidate === undefined || candidate.length === 0) {\n return Either.left({\n _tag: \"MissingRequiredOption\",\n option\n })\n }\n return Either.right(candidate)\n}\n\nconst normalizeSecretsRoot = (value: string): string => trimRightChar(value, \"/\")\n\ntype RepoBasics = {\n readonly repoUrl: string\n readonly repoSlug: string\n readonly projectSlug: string\n readonly repoPath: string\n readonly repoRef: string\n readonly targetDir: string\n readonly sshUser: string\n readonly sshPort: number\n}\n\nconst resolveRepoBasics = (raw: RawOptions): Either.Either<RepoBasics, ParseError> =>\n Either.gen(function*(_) {\n const rawRepoUrl = raw.repoUrl?.trim() ?? \"\"\n const resolvedRepo = resolveRepoInput(rawRepoUrl)\n const repoUrl = resolvedRepo.repoUrl\n const repoSlug = deriveRepoSlug(repoUrl)\n const repoPathParts = deriveRepoPathParts(repoUrl).pathParts\n const workspaceSuffix = resolvedRepo.workspaceSuffix\n const projectSlug = workspaceSuffix ? `${repoSlug}-${workspaceSuffix}` : repoSlug\n const repoPath = workspaceSuffix ? [...repoPathParts, workspaceSuffix].join(\"/\") : repoPathParts.join(\"/\")\n const repoRef = yield* _(\n nonEmpty(\"--repo-ref\", raw.repoRef ?? resolvedRepo.repoRef, defaultTemplateConfig.repoRef)\n )\n const sshUser = yield* _(nonEmpty(\"--ssh-user\", raw.sshUser, defaultTemplateConfig.sshUser))\n const rawTargetDir = yield* _(\n nonEmpty(\"--target-dir\", raw.targetDir, defaultTemplateConfig.targetDir)\n )\n const targetDir = expandContainerHome(sshUser, rawTargetDir)\n const sshPort = yield* _(parsePort(raw.sshPort ?? String(defaultTemplateConfig.sshPort)))\n\n return { repoUrl, repoSlug, projectSlug, repoPath, repoRef, targetDir, sshUser, sshPort }\n })\n\ntype NameConfig = {\n readonly containerName: string\n readonly serviceName: string\n readonly volumeName: string\n}\n\nconst resolveNames = (\n raw: RawOptions,\n projectSlug: string\n): Either.Either<NameConfig, ParseError> =>\n Either.gen(function*(_) {\n const derivedContainerName = `dg-${projectSlug}`\n const derivedServiceName = `dg-${projectSlug}`\n const derivedVolumeName = `dg-${projectSlug}-home`\n const containerName = yield* _(\n nonEmpty(\"--container-name\", raw.containerName, derivedContainerName)\n )\n const serviceName = yield* _(nonEmpty(\"--service-name\", raw.serviceName, derivedServiceName))\n const volumeName = yield* _(nonEmpty(\"--volume-name\", raw.volumeName, derivedVolumeName))\n\n return { containerName, serviceName, volumeName }\n })\n\ntype PathConfig = {\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexSharedAuthPath: string\n readonly codexHome: string\n readonly outDir: string\n}\n\ntype DefaultPathConfig = {\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n}\n\nconst resolveNormalizedSecretsRoot = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length === 0 ? undefined : normalizeSecretsRoot(trimmed)\n}\n\nconst buildDefaultPathConfig = (\n normalizedSecretsRoot: string | undefined\n): DefaultPathConfig =>\n normalizedSecretsRoot === undefined\n ? {\n dockerGitPath: defaultTemplateConfig.dockerGitPath,\n authorizedKeysPath: defaultTemplateConfig.authorizedKeysPath,\n envGlobalPath: defaultTemplateConfig.envGlobalPath,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: defaultTemplateConfig.codexAuthPath\n }\n : {\n // NOTE: Keep docker-git root mount stable (projects root) so caches like\n // `.cache/git-mirrors` remain outside the secrets dir.\n dockerGitPath: defaultTemplateConfig.dockerGitPath,\n authorizedKeysPath: defaultTemplateConfig.authorizedKeysPath,\n envGlobalPath: `${normalizedSecretsRoot}/global.env`,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: `${normalizedSecretsRoot}/codex`\n }\n\nconst resolvePaths = (\n raw: RawOptions,\n repoPath: string\n): Either.Either<PathConfig, ParseError> =>\n Either.gen(function*(_) {\n const normalizedSecretsRoot = resolveNormalizedSecretsRoot(raw.secretsRoot)\n const defaults = buildDefaultPathConfig(normalizedSecretsRoot)\n const dockerGitPath = defaults.dockerGitPath\n const authorizedKeysPath = yield* _(\n nonEmpty(\"--authorized-keys\", raw.authorizedKeysPath, defaults.authorizedKeysPath)\n )\n const envGlobalPath = yield* _(nonEmpty(\"--env-global\", raw.envGlobalPath, defaults.envGlobalPath))\n const envProjectPath = yield* _(\n nonEmpty(\"--env-project\", raw.envProjectPath, defaults.envProjectPath)\n )\n const codexAuthPath = yield* _(\n nonEmpty(\"--codex-auth\", raw.codexAuthPath, defaults.codexAuthPath)\n )\n const codexSharedAuthPath = codexAuthPath\n const codexHome = yield* _(nonEmpty(\"--codex-home\", raw.codexHome, defaultTemplateConfig.codexHome))\n const outDir = yield* _(nonEmpty(\"--out-dir\", raw.outDir, `.docker-git/${repoPath}`))\n\n return {\n dockerGitPath,\n authorizedKeysPath,\n envGlobalPath,\n envProjectPath,\n codexAuthPath,\n codexSharedAuthPath,\n codexHome,\n outDir\n }\n })\n\ntype CreateBehavior = {\n readonly runUp: boolean\n readonly openSsh: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n readonly enableMcpPlaywright: boolean\n}\n\nconst resolveCreateBehavior = (raw: RawOptions): CreateBehavior => ({\n runUp: raw.up ?? true,\n openSsh: raw.openSsh ?? false,\n force: raw.force ?? false,\n forceEnv: raw.forceEnv ?? false,\n enableMcpPlaywright: raw.enableMcpPlaywright ?? false\n})\n\ntype BuildTemplateConfigInput = {\n readonly repo: RepoBasics\n readonly names: NameConfig\n readonly paths: PathConfig\n readonly dockerNetworkMode: CreateCommand[\"config\"][\"dockerNetworkMode\"]\n readonly dockerSharedNetworkName: string\n readonly gitTokenLabel: string | undefined\n readonly codexAuthLabel: string | undefined\n readonly claudeAuthLabel: string | undefined\n readonly enableMcpPlaywright: boolean\n}\n\nconst buildTemplateConfig = ({\n claudeAuthLabel,\n codexAuthLabel,\n dockerNetworkMode,\n dockerSharedNetworkName,\n enableMcpPlaywright,\n gitTokenLabel,\n names,\n paths,\n repo\n}: BuildTemplateConfigInput): CreateCommand[\"config\"] => ({\n containerName: names.containerName,\n serviceName: names.serviceName,\n sshUser: repo.sshUser,\n sshPort: repo.sshPort,\n repoUrl: repo.repoUrl,\n repoRef: repo.repoRef,\n gitTokenLabel,\n codexAuthLabel,\n claudeAuthLabel,\n targetDir: repo.targetDir,\n volumeName: names.volumeName,\n dockerGitPath: paths.dockerGitPath,\n authorizedKeysPath: paths.authorizedKeysPath,\n envGlobalPath: paths.envGlobalPath,\n envProjectPath: paths.envProjectPath,\n codexAuthPath: paths.codexAuthPath,\n codexSharedAuthPath: paths.codexSharedAuthPath,\n codexHome: paths.codexHome,\n dockerNetworkMode,\n dockerSharedNetworkName,\n enableMcpPlaywright,\n pnpmVersion: defaultTemplateConfig.pnpmVersion\n})\n\n// CHANGE: build a typed create command from raw options (CLI or API)\n// WHY: share deterministic command construction across CLI and server\n// QUOTE(ТЗ): \"В lib ты оставляешь бизнес логику, а все CLI морду хранишь в app\"\n// REF: user-request-2026-02-02-cli-split\n// SOURCE: n/a\n// FORMAT THEOREM: forall raw: build(raw) -> deterministic(command)\n// PURITY: CORE\n// EFFECT: Effect<CreateCommand, ParseError, never>\n// INVARIANT: uses defaults for unset fields\n// COMPLEXITY: O(1)\nexport const buildCreateCommand = (\n raw: RawOptions\n): Either.Either<CreateCommand, ParseError> =>\n Either.gen(function*(_) {\n const repo = yield* _(resolveRepoBasics(raw))\n const names = yield* _(resolveNames(raw, repo.projectSlug))\n const paths = yield* _(resolvePaths(raw, repo.repoPath))\n const behavior = resolveCreateBehavior(raw)\n const gitTokenLabel = normalizeGitTokenLabel(raw.gitTokenLabel)\n const codexAuthLabel = normalizeAuthLabel(raw.codexTokenLabel)\n const claudeAuthLabel = normalizeAuthLabel(raw.claudeTokenLabel)\n const dockerNetworkMode = yield* _(parseDockerNetworkMode(raw.dockerNetworkMode))\n const dockerSharedNetworkName = yield* _(\n nonEmpty(\"--shared-network\", raw.dockerSharedNetworkName, defaultTemplateConfig.dockerSharedNetworkName)\n )\n\n return {\n _tag: \"Create\",\n outDir: paths.outDir,\n runUp: behavior.runUp,\n openSsh: behavior.openSsh,\n force: behavior.force,\n forceEnv: behavior.forceEnv,\n waitForClone: false,\n config: buildTemplateConfig({\n repo,\n names,\n paths,\n dockerNetworkMode,\n dockerSharedNetworkName,\n gitTokenLabel,\n codexAuthLabel,\n claudeAuthLabel,\n enableMcpPlaywright: behavior.enableMcpPlaywright\n })\n }\n })\n","import { Either } from \"effect\"\n\nimport { buildCreateCommand, nonEmpty } from \"@effect-template/lib/core/command-builders\"\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport { type Command, type ParseError, resolveRepoInput } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\nimport { resolveWorkspaceRepoPath, splitPositionalRepo } from \"./parser-shared.js\"\n\nconst applyCloneDefaults = (\n raw: RawOptions,\n rawRepoUrl: string,\n resolvedRepo: ReturnType<typeof resolveRepoInput>\n): RawOptions => {\n const repoPath = resolveWorkspaceRepoPath(resolvedRepo)\n const targetHome = \"~\"\n return {\n ...raw,\n repoUrl: rawRepoUrl,\n outDir: raw.outDir ?? `.docker-git/${repoPath}`,\n targetDir: raw.targetDir ?? `${targetHome}/workspaces/${repoPath}`\n }\n}\n\n// CHANGE: parse clone command with positional repo url\n// WHY: allow \"docker-git clone <url>\" to build + run a container\n// QUOTE(ТЗ): \"docker-git clone url\"\n// REF: user-request-2026-01-27\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseClone(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: first positional arg is treated as repo url\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseClone = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const { positionalRepoUrl, restArgs } = splitPositionalRepo(args)\n\n return Either.gen(function*(_) {\n const raw = yield* _(parseRawOptions(restArgs))\n const rawRepoUrl = yield* _(nonEmpty(\"--repo-url\", raw.repoUrl ?? positionalRepoUrl))\n const resolvedRepo = resolveRepoInput(rawRepoUrl)\n const withDefaults = applyCloneDefaults(raw, rawRepoUrl, resolvedRepo)\n const withRef = resolvedRepo.repoRef !== undefined && raw.repoRef === undefined\n ? { ...withDefaults, repoRef: resolvedRepo.repoRef }\n : withDefaults\n const openSsh = raw.openSsh ?? true\n const create = yield* _(buildCreateCommand(withRef))\n return { ...create, waitForClone: true, openSsh }\n })\n}\n","import { Either } from \"effect\"\n\nimport { type McpPlaywrightUpCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\n// CHANGE: parse \"mcp-playwright\" command for existing docker-git projects\n// WHY: allow enabling Playwright MCP in an already created container/project dir\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseMcpPlaywright(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<McpPlaywrightUpCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseMcpPlaywright = (\n args: ReadonlyArray<string>\n): Either.Either<McpPlaywrightUpCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"McpPlaywrightUp\",\n projectDir,\n runUp: raw.up ?? true\n }))\n","import { Either } from \"effect\"\n\nimport { type PanesCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirArgs } from \"./parser-shared.js\"\n\n// CHANGE: parse panes command into a project selection\n// WHY: allow listing tmux panes without attaching\n// QUOTE(ТЗ): \"покажи команду ... отобразит терминалы\"\n// REF: user-request-2026-02-02-panes\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parsePanes(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<PanesCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parsePanes = (args: ReadonlyArray<string>): Either.Either<PanesCommand, ParseError> => {\n return Either.map(parseProjectDirArgs(args), ({ projectDir }) => ({\n _tag: \"Panes\",\n projectDir\n }))\n}\n","import { Either, Match } from \"effect\"\n\nimport type { Command, ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\nconst missingRequired = (option: string): ParseError => ({\n _tag: \"MissingRequiredOption\",\n option\n})\n\nconst invalidScrapAction = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"scrap\",\n reason: `unknown action: ${value}`\n})\n\nconst defaultSessionArchiveDir = \".orch/scrap/session\"\n\nconst invalidScrapMode = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"--mode\",\n reason: `unknown value: ${value} (expected session)`\n})\n\nconst parseScrapMode = (raw: string | undefined): Either.Either<\"session\", ParseError> => {\n const value = raw?.trim()\n if (!value || value.length === 0) {\n return Either.right(\"session\")\n }\n if (value === \"session\") {\n return Either.right(\"session\")\n }\n if (value === \"recipe\") {\n // Backwards/semantic alias: \"recipe\" behaves like \"session\" (git state + rebuildable deps).\n return Either.right(\"session\")\n }\n return Either.left(invalidScrapMode(value))\n}\n\nconst makeScrapExportCommand = (projectDir: string, archivePath: string, mode: \"session\"): Command => ({\n _tag: \"ScrapExport\",\n projectDir,\n archivePath,\n mode\n})\n\nconst makeScrapImportCommand = (\n projectDir: string,\n archivePath: string,\n wipe: boolean,\n mode: \"session\"\n): Command => ({\n _tag: \"ScrapImport\",\n projectDir,\n archivePath,\n wipe,\n mode\n})\n\n// CHANGE: parse scrap session export/import commands\n// WHY: store a small reproducible snapshot (git state + secrets) instead of large caches like node_modules\n// QUOTE(ТЗ): \"не должно быть старого режима где он качает весь шлак типо node_modules\"\n// REF: user-request-2026-02-15\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseScrap(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: export/import always resolves a projectDir\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseScrap = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const action = args[0]?.trim()\n if (!action || action.length === 0) {\n return Either.left(missingRequired(\"scrap <action>\"))\n }\n\n const rest = args.slice(1)\n\n return Match.value(action).pipe(\n Match.when(\n \"export\",\n () =>\n Either.flatMap(\n parseProjectDirWithOptions(rest),\n ({ projectDir, raw }) =>\n Either.map(parseScrapMode(raw.scrapMode), (mode) => {\n const archivePathRaw = raw.archivePath?.trim()\n if (archivePathRaw && archivePathRaw.length > 0) {\n return makeScrapExportCommand(projectDir, archivePathRaw, mode)\n }\n return makeScrapExportCommand(projectDir, defaultSessionArchiveDir, mode)\n })\n )\n ),\n Match.when(\"import\", () =>\n Either.flatMap(parseProjectDirWithOptions(rest), ({ projectDir, raw }) => {\n const archivePath = raw.archivePath?.trim()\n if (!archivePath || archivePath.length === 0) {\n return Either.left(missingRequired(\"--archive\"))\n }\n return Either.map(parseScrapMode(raw.scrapMode), (mode) =>\n makeScrapImportCommand(projectDir, archivePath, raw.wipe ?? true, mode))\n })),\n Match.orElse(() => Either.left(invalidScrapAction(action)))\n )\n}\n","import { Either, Match } from \"effect\"\n\nimport { type ParseError, type SessionsCommand } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\nconst defaultLines = 200\n\nconst parsePositiveInt = (\n option: string,\n raw: string\n): Either.Either<number, ParseError> => {\n const value = Number.parseInt(raw, 10)\n if (!Number.isFinite(value) || value <= 0) {\n const error: ParseError = {\n _tag: \"InvalidOption\",\n option,\n reason: \"expected positive integer\"\n }\n return Either.left(error)\n }\n return Either.right(value)\n}\n\nconst parseList = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"SessionsList\",\n projectDir,\n includeDefault: raw.includeDefault === true\n }))\n\nconst parsePidContext = (\n args: ReadonlyArray<string>\n): Either.Either<\n { readonly pid: number; readonly projectDir: string; readonly raw: { readonly lines?: string } },\n ParseError\n> =>\n Either.gen(function*(_) {\n const pidRaw = args[0]\n if (!pidRaw) {\n const error: ParseError = { _tag: \"MissingRequiredOption\", option: \"pid\" }\n return yield* _(Either.left(error))\n }\n const pid = yield* _(parsePositiveInt(\"pid\", pidRaw))\n const { projectDir, raw } = yield* _(parseProjectDirWithOptions(args.slice(1)))\n return { pid, projectDir, raw }\n })\n\nconst parseKill = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.map(parsePidContext(args), ({ pid, projectDir }) => ({\n _tag: \"SessionsKill\",\n projectDir,\n pid\n }))\n\nconst parseLogs = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.gen(function*(_) {\n const { pid, projectDir, raw } = yield* _(parsePidContext(args))\n const lines = raw.lines ? yield* _(parsePositiveInt(\"--lines\", raw.lines)) : defaultLines\n return { _tag: \"SessionsLogs\", projectDir, pid, lines }\n })\n\n// CHANGE: parse sessions command into list/kill/logs actions\n// WHY: surface container terminal sessions and background processes from CLI\n// QUOTE(ТЗ): \"CLI команду которая из докера вернёт запущенные терминал сессии\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseSessions(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<SessionsCommand, ParseError, never>\n// INVARIANT: pid/lines must be positive integers\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseSessions = (\n args: ReadonlyArray<string>\n): Either.Either<SessionsCommand, ParseError> => {\n if (args.length === 0) {\n return parseList(args)\n }\n\n const first = args[0] ?? \"\"\n if (first.startsWith(\"-\")) {\n return parseList(args)\n }\n\n const rest = args.slice(1)\n return Match.value(first).pipe(\n Match.when(\"list\", () => parseList(rest)),\n Match.when(\"kill\", () => parseKill(rest)),\n Match.when(\"stop\", () => parseKill(rest)),\n Match.when(\"logs\", () => parseLogs(rest)),\n Match.when(\"log\", () => parseLogs(rest)),\n Match.orElse(() => {\n const error: ParseError = {\n _tag: \"InvalidOption\",\n option: \"sessions\",\n reason: `unknown action ${first}`\n }\n return Either.left(error)\n })\n )\n}\n","import { Either, Match } from \"effect\"\n\nimport type { Command, ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\n\nconst invalidStateAction = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"state\",\n reason: `unknown action: ${value}`\n})\n\nconst unexpectedArgs = (value: string): Either.Either<Command, ParseError> =>\n Either.left({ _tag: \"UnexpectedArgument\", value })\n\nconst parseStateInit = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => {\n const repoUrl = raw.repoUrl?.trim()\n if (!repoUrl || repoUrl.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"--repo-url\" })\n }\n return Either.right({\n _tag: \"StateInit\",\n repoUrl,\n repoRef: raw.repoRef?.trim() && raw.repoRef.trim().length > 0 ? raw.repoRef.trim() : \"main\"\n })\n })\n\nconst parseStateCommit = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => {\n const message = raw.message?.trim()\n if (!message || message.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"--message\" })\n }\n return Either.right({ _tag: \"StateCommit\", message })\n })\n\nconst parseStateSync = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.map(parseRawOptions(args), (raw) => {\n const message = raw.message?.trim()\n return { _tag: \"StateSync\", message: message && message.length > 0 ? message : null }\n })\n\nexport const parseState = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const action = args[0]?.trim()\n if (!action || action.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"state <action>\" })\n }\n\n const rest = args.slice(1)\n\n return Match.value(action).pipe(\n Match.when(\"path\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePath\" }\n return Either.right(command)\n }),\n Match.when(\"init\", () => parseStateInit(rest)),\n Match.when(\"pull\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePull\" }\n return Either.right(command)\n }),\n Match.when(\"push\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePush\" }\n return Either.right(command)\n }),\n Match.when(\"status\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StateStatus\" }\n return Either.right(command)\n }),\n Match.when(\"commit\", () => parseStateCommit(rest)),\n Match.when(\"sync\", () => parseStateSync(rest)),\n Match.orElse(() => Either.left(invalidStateAction(action)))\n )\n}\n","import { Match } from \"effect\"\n\nimport type { ParseError } from \"@effect-template/lib/core/domain\"\n\nexport const usageText = `docker-git menu\ndocker-git create [--repo-url <url>] [options]\ndocker-git clone <url> [options]\ndocker-git open [<url>] [options]\ndocker-git apply [<url>] [options]\ndocker-git mcp-playwright [<url>] [options]\ndocker-git attach [<url>] [options]\ndocker-git panes [<url>] [options]\ndocker-git scrap <action> [<url>] [options]\ndocker-git sessions [list] [<url>] [options]\ndocker-git sessions kill <pid> [<url>] [options]\ndocker-git sessions logs <pid> [<url>] [options]\ndocker-git ps\ndocker-git down-all\ndocker-git auth <provider> <action> [options]\ndocker-git state <action> [options]\n\nCommands:\n menu Interactive menu (default when no args)\n create, init Generate docker development environment (repo URL optional)\n clone Create + run container and clone repo\n open Open existing docker-git project workspace\n apply Apply docker-git config to an existing project/container (current dir by default)\n mcp-playwright Enable Playwright MCP + Chromium sidecar for an existing project dir\n attach, tmux Alias for open\n panes, terms List tmux panes for a docker-git project\n scrap Export/import project scrap (session snapshot + rebuildable deps)\n sessions List/kill/log container terminal processes\n ps, status Show docker compose status for all docker-git projects\n down-all Stop all docker-git containers (docker compose down)\n auth Manage GitHub/Codex/Claude Code auth for docker-git\n state Manage docker-git state directory via git (sync across machines)\n\nOptions:\n --repo-url <url> Repository URL (create: optional; clone: required via positional arg or flag)\n --repo-ref <ref> Git ref/branch (default: main)\n --branch, -b <ref> Alias for --repo-ref\n --target-dir <path> Target dir inside container (create default: /home/dev/app, clone default: ~/workspaces/<org>/<repo>[/issue-<id>|/pr-<id>])\n --ssh-port <port> Local SSH port (default: 2222)\n --ssh-user <user> SSH user inside container (default: dev)\n --container-name <name> Docker container name (default: dg-<repo>)\n --service-name <name> Compose service name (default: dg-<repo>)\n --volume-name <name> Docker volume name (default: dg-<repo>-home)\n --authorized-keys <path> Host path to authorized_keys (default: <projectsRoot>/authorized_keys)\n --env-global <path> Host path to shared env file (default: <projectsRoot>/.orch/env/global.env)\n --env-project <path> Host path to project env file (default: ./.orch/env/project.env)\n --codex-auth <path> Host path for Codex auth cache (default: <projectsRoot>/.orch/auth/codex)\n --codex-home <path> Container path for Codex auth (default: /home/dev/.codex)\n --network-mode <mode> Compose network mode: shared|project (default: shared)\n --shared-network <name> Shared Docker network name when network-mode=shared (default: docker-git-shared)\n --out-dir <path> Output directory (default: <projectsRoot>/<org>/<repo>[/issue-<id>|/pr-<id>])\n --project-dir <path> Project directory for open/attach (default: .)\n --archive <path> Scrap snapshot directory (default: .orch/scrap/session)\n --mode <session> Scrap mode (default: session)\n --git-token <label> Token label for clone/create (maps to GITHUB_TOKEN__<LABEL>, example: agiens)\n --codex-token <label> Codex auth label for clone/create (maps to CODEX_AUTH_LABEL, example: agien)\n --claude-token <label> Claude auth label for clone/create (maps to CLAUDE_AUTH_LABEL, example: agien)\n --wipe | --no-wipe Wipe workspace before scrap import (default: --wipe)\n --lines <n> Tail last N lines for sessions logs (default: 200)\n --include-default Show default/system processes in sessions list\n --up | --no-up Run docker compose up after init (default: --up)\n --ssh | --no-ssh Auto-open SSH after create/clone (default: clone=--ssh, create=--no-ssh)\n --mcp-playwright | --no-mcp-playwright Enable Playwright MCP + Chromium sidecar (default: --no-mcp-playwright)\n --force Overwrite existing files and wipe compose volumes (docker compose down -v)\n --force-env Reset project env defaults only (keep workspace volume/data)\n -h, --help Show this help\n\nContainer runtime env (set via .orch/env/project.env):\n CODEX_SHARE_AUTH=1|0 Share Codex auth.json across projects (default: 1)\n CODEX_AUTO_UPDATE=1|0 Auto-update Codex CLI on container start (default: 1)\n DOCKER_GIT_ZSH_AUTOSUGGEST=1|0 Enable zsh-autosuggestions (default: 1)\n DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=... zsh-autosuggestions highlight style (default: fg=8,italic)\n DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=... Suggestion sources (default: history completion)\n MCP_PLAYWRIGHT_ISOLATED=1|0 Isolated browser contexts (recommended for many Codex; default: 1)\n MCP_PLAYWRIGHT_CDP_ENDPOINT=http://... Override CDP endpoint (default: http://dg-<repo>-browser:9223)\n\nAuth providers:\n github, gh GitHub CLI auth (tokens saved to env file)\n codex Codex CLI auth (stored under .orch/auth/codex)\n claude, cc Claude Code CLI auth (OAuth cache stored under .orch/auth/claude)\n\nAuth actions:\n login Run login flow and store credentials\n status Show current auth status\n logout Remove stored credentials\n\nAuth options:\n --label <label> Account label (default: default)\n --token <token> GitHub token override (login only; useful for non-interactive/CI)\n --web Force OAuth web flow (login only; ignores --token)\n --scopes <scopes> GitHub scopes (login only, default: repo,workflow,read:org)\n --env-global <path> Env file path for GitHub tokens (default: <projectsRoot>/.orch/env/global.env)\n --codex-auth <path> Codex auth root path (default: <projectsRoot>/.orch/auth/codex)\n\nState actions:\n state path Print current projects root (default: ~/.docker-git; override via DOCKER_GIT_PROJECTS_ROOT)\n state init --repo-url <url> [-b] Init / bind state dir to a git remote (use a private repo)\n state status Show git status for the state dir\n state pull git pull (state dir)\n state commit -m <message> Commit all changes in the state dir\n state sync [-m <message>] Commit (if needed) + fetch/rebase + push (state dir); on conflict pushes a PR branch\n state push git push (state dir)\n\nState options:\n --message, -m <message> Commit message for state commit\n`\n\n// CHANGE: normalize parse errors into user-facing messages\n// WHY: keep formatting deterministic and centralized\n// QUOTE(ТЗ): \"Надо написать CLI команду\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: format(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each ParseError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const formatParseError = (error: ParseError): string =>\n Match.value(error).pipe(\n Match.when({ _tag: \"UnknownCommand\" }, ({ command }) => `Unknown command: ${command}`),\n Match.when({ _tag: \"UnknownOption\" }, ({ option }) => `Unknown option: ${option}`),\n Match.when({ _tag: \"MissingOptionValue\" }, ({ option }) => `Missing value for option: ${option}`),\n Match.when({ _tag: \"MissingRequiredOption\" }, ({ option }) => `Missing required option: ${option}`),\n Match.when({ _tag: \"InvalidOption\" }, ({ option, reason }) => `Invalid option ${option}: ${reason}`),\n Match.when({ _tag: \"UnexpectedArgument\" }, ({ value }) => `Unexpected argument: ${value}`),\n Match.exhaustive\n )\n","import { Either, Match } from \"effect\"\n\nimport { type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseApply } from \"./parser-apply.js\"\nimport { parseAttach } from \"./parser-attach.js\"\nimport { parseAuth } from \"./parser-auth.js\"\nimport { parseClone } from \"./parser-clone.js\"\nimport { buildCreateCommand } from \"./parser-create.js\"\nimport { parseMcpPlaywright } from \"./parser-mcp-playwright.js\"\nimport { parseRawOptions } from \"./parser-options.js\"\nimport { parsePanes } from \"./parser-panes.js\"\nimport { parseScrap } from \"./parser-scrap.js\"\nimport { parseSessions } from \"./parser-sessions.js\"\nimport { parseState } from \"./parser-state.js\"\nimport { usageText } from \"./usage.js\"\n\nconst isHelpFlag = (token: string): boolean => token === \"--help\" || token === \"-h\"\n\nconst helpCommand: Command = { _tag: \"Help\", message: usageText }\nconst menuCommand: Command = { _tag: \"Menu\" }\nconst statusCommand: Command = { _tag: \"Status\" }\nconst downAllCommand: Command = { _tag: \"DownAll\" }\n\nconst parseCreate = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => buildCreateCommand(raw))\n\n// CHANGE: parse CLI arguments into a typed command\n// WHY: enforce deterministic, pure parsing before any effects run\n// QUOTE(ТЗ): \"Надо написать CLI команду с помощью которой мы будем создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parse(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: parse does not perform IO and returns the same result for same argv\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseArgs = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n if (args.length === 0) {\n return Either.right(menuCommand)\n }\n\n if (args.some((arg) => isHelpFlag(arg))) {\n return Either.right(helpCommand)\n }\n\n const command = args[0]\n const rest = args.slice(1)\n const unknownCommandError: ParseError = {\n _tag: \"UnknownCommand\",\n command: command ?? \"\"\n }\n\n return Match.value(command)\n .pipe(\n Match.when(\"create\", () => parseCreate(rest)),\n Match.when(\"init\", () => parseCreate(rest)),\n Match.when(\"clone\", () => parseClone(rest)),\n Match.when(\"attach\", () => parseAttach(rest)),\n Match.when(\"tmux\", () => parseAttach(rest)),\n Match.when(\"panes\", () => parsePanes(rest)),\n Match.when(\"terms\", () => parsePanes(rest)),\n Match.when(\"terminals\", () => parsePanes(rest)),\n Match.when(\"sessions\", () => parseSessions(rest)),\n Match.when(\"scrap\", () => parseScrap(rest)),\n Match.when(\"mcp-playwright\", () => parseMcpPlaywright(rest)),\n Match.when(\"help\", () => Either.right(helpCommand)),\n Match.when(\"ps\", () => Either.right(statusCommand)),\n Match.when(\"status\", () => Either.right(statusCommand)),\n Match.when(\"down-all\", () => Either.right(downAllCommand)),\n Match.when(\"stop-all\", () => Either.right(downAllCommand)),\n Match.when(\"kill-all\", () => Either.right(downAllCommand)),\n Match.when(\"menu\", () => Either.right(menuCommand)),\n Match.when(\"ui\", () => Either.right(menuCommand)),\n Match.when(\"auth\", () => parseAuth(rest))\n )\n .pipe(\n Match.when(\"open\", () => parseAttach(rest)),\n Match.when(\"apply\", () => parseApply(rest)),\n Match.when(\"state\", () => parseState(rest)),\n Match.orElse(() => Either.left(unknownCommandError))\n )\n}\n","import { Effect, Either, pipe } from \"effect\"\n\nimport { type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseArgs } from \"./parser.js\"\n\n// CHANGE: read and parse CLI arguments from process.argv\n// WHY: keep IO at the boundary and delegate parsing to CORE\n// QUOTE(ТЗ): \"Надо написать CLI команду\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: read(argv) -> parse(argv)\n// PURITY: SHELL\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: errors are typed as ParseError\n// COMPLEXITY: O(n) where n = |argv|\nexport const readCommand: Effect.Effect<Command, ParseError> = pipe(\n Effect.sync(() => process.argv.slice(2)),\n Effect.map((args) => parseArgs(args)),\n Effect.flatMap((result) =>\n Either.match(result, {\n onLeft: (error) => Effect.fail(error),\n onRight: (command) => Effect.succeed(command)\n })\n )\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { AttachCommand, PanesCommand } from \"@effect-template/lib/core/domain\"\nimport { deriveRepoPathParts, deriveRepoSlug } from \"@effect-template/lib/core/domain\"\nimport {\n runCommandCapture,\n runCommandExitCode,\n runCommandWithExitCodes\n} from \"@effect-template/lib/shell/command-runner\"\nimport { readProjectConfig } from \"@effect-template/lib/shell/config\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"@effect-template/lib/shell/errors\"\nimport { CommandFailedError } from \"@effect-template/lib/shell/errors\"\nimport { resolveBaseDir } from \"@effect-template/lib/shell/paths\"\nimport { findSshPrivateKey } from \"@effect-template/lib/usecases/path-helpers\"\nimport { buildSshCommand } from \"@effect-template/lib/usecases/projects\"\nimport { runDockerComposeUpWithPortCheck } from \"@effect-template/lib/usecases/projects-up\"\n\nconst tmuxOk = [0]\nconst layoutVersion = \"v14\"\n\nconst makeTmuxSpec = (args: ReadonlyArray<string>) => ({\n cwd: process.cwd(),\n command: \"tmux\",\n args\n})\n\nconst runTmux = (\n args: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n makeTmuxSpec(args),\n tmuxOk,\n (exitCode) => new CommandFailedError({ command: \"tmux\", exitCode })\n )\n\nconst runTmuxExitCode = (\n args: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> => runCommandExitCode(makeTmuxSpec(args))\n\nconst runTmuxCapture = (\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n makeTmuxSpec(args),\n tmuxOk,\n (exitCode) => new CommandFailedError({ command: \"tmux\", exitCode })\n )\n\nconst sendKeys = (\n session: string,\n pane: string,\n text: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runTmux([\"send-keys\", \"-t\", `${session}:0.${pane}`, \"-l\", text]),\n Effect.zipRight(runTmux([\"send-keys\", \"-t\", `${session}:0.${pane}`, \"C-m\"]))\n )\n\nconst shellEscape = (value: string): string => {\n if (value.length === 0) {\n return \"''\"\n }\n if (!/[^\\w@%+=:,./-]/.test(value)) {\n return value\n }\n const escaped = value.replaceAll(\"'\", \"'\\\"'\\\"'\")\n return `'${escaped}'`\n}\n\nconst wrapBash = (command: string): string => `bash -lc ${shellEscape(command)}`\n\nconst buildJobsCommand = (containerName: string): string =>\n [\n \"while true; do\",\n \"clear\",\n \"echo \\\"LIVE TERMINALS / JOBS (container, refresh 1s)\\\"\",\n \"echo \\\"\\\"\",\n `docker exec ${containerName} ps -eo pid,tty,cmd,etime --sort=start_time 2>/dev/null | awk 'NR==1 {print; next} $2 != \"?\" && $3 !~ /(sshd|^-?bash$|^bash$|^sh$|^zsh$|^fish$)/ {print; found=1} END { if (!found) print \"(no interactive jobs)\" }'`,\n \"|| echo \\\"container not running\\\"\",\n \"sleep 1\",\n \"done\"\n ].join(\"; \")\n\nconst readLayoutVersion = (\n session: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runTmuxCapture([\"show-options\", \"-t\", session, \"-v\", \"@docker-git-layout\"]).pipe(\n Effect.map((value) => value.trim()),\n Effect.catchTag(\"CommandFailedError\", () => Effect.succeed(null))\n )\n\nconst buildBottomBarCommand = (): string =>\n [\n \"clear\",\n \"echo \\\"[Focus: Alt+1/2/3] [Select: Alt+s] [Detach: Alt+d]\\\"\",\n \"echo \\\"Tip: Mouse click = focus pane, Ctrl+a z = zoom\\\"\",\n \"while true; do sleep 3600; done\"\n ].join(\"; \")\n\nconst formatRepoRefLabel = (repoRef: string): string => {\n const match = /refs\\/pull\\/(\\d+)\\/head/.exec(repoRef)\n const pr = match?.[1]\n return pr ? `PR#${pr}` : repoRef\n}\n\nconst formatRepoDisplayName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl)\n return parts.pathParts.length > 0 ? parts.pathParts.join(\"/\") : repoUrl\n}\n\ntype PaneRow = {\n readonly id: string\n readonly window: string\n readonly title: string\n readonly command: string\n}\n\nconst normalizePaneCell = (value: string | undefined): string => value?.trim() ?? \"-\"\n\nconst parsePaneRow = (line: string): PaneRow => {\n const [id, window, title, command] = line.split(\"\\t\")\n return {\n id: normalizePaneCell(id),\n window: normalizePaneCell(window),\n title: normalizePaneCell(title),\n command: normalizePaneCell(command)\n }\n}\n\nconst renderPaneRow = (row: PaneRow): string =>\n `- ${row.id} ${row.window} ${row.title === \"-\" ? row.command : row.title} ${row.command}`\n\nconst configureSession = (\n session: string,\n repoDisplayName: string,\n statusRight: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(runTmux([\"set-option\", \"-t\", session, \"@docker-git-layout\", layoutVersion]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"window-size\", \"largest\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"aggressive-resize\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"mouse\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"focus-events\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"prefix\", \"C-a\"]))\n yield* _(runTmux([\"unbind-key\", \"C-b\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-position\", \"top\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-left\", ` docker-git :: ${repoDisplayName} `]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-right\", ` ${statusRight} `]))\n })\n\nconst createLayout = (\n session: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(runTmux([\"new-session\", \"-d\", \"-s\", session, \"-n\", \"main\"]))\n yield* _(runTmux([\"split-window\", \"-v\", \"-p\", \"12\", \"-t\", `${session}:0`]))\n yield* _(runTmux([\"split-window\", \"-h\", \"-p\", \"35\", \"-t\", `${session}:0.0`]))\n })\n\nconst setupPanes = (\n session: string,\n sshCommand: string,\n containerName: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const leftPane = \"0\"\n const bottomPane = \"1\"\n const rightPane = \"2\"\n yield* _(sendKeys(session, leftPane, sshCommand))\n yield* _(sendKeys(session, rightPane, wrapBash(buildJobsCommand(containerName))))\n yield* _(sendKeys(session, bottomPane, wrapBash(buildBottomBarCommand())))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-1\", \"select-pane\", \"-t\", `${session}:0.${leftPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-2\", \"select-pane\", \"-t\", `${session}:0.${rightPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-3\", \"select-pane\", \"-t\", `${session}:0.${bottomPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-d\", \"detach-client\"]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-s\", \"choose-tree\", \"-Z\"]))\n yield* _(runTmux([\"select-pane\", \"-t\", `${session}:0.${leftPane}`]))\n })\n\n// CHANGE: list tmux panes for a docker-git project\n// WHY: allow non-interactive inspection of terminal panes (CI/automation friendly)\n// QUOTE(ТЗ): \"сделай команду ... которая отобразит терминалы в докере\"\n// REF: user-request-2026-02-02-panes\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: panes(p) -> deterministic output\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: session name is deterministic from repo url\n// COMPLEXITY: O(n) where n = number of panes\nexport const listTmuxPanes = (\n command: PanesCommand\n): Effect.Effect<\n void,\n CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError,\n CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const session = `dg-${deriveRepoSlug(config.template.repoUrl)}`\n const hasSessionCode = yield* _(runTmuxExitCode([\"has-session\", \"-t\", session]))\n if (hasSessionCode !== 0) {\n yield* _(Effect.logWarning(`tmux session ${session} not found. Run 'docker-git attach' first.`))\n return\n }\n const raw = yield* _(\n runTmuxCapture([\n \"list-panes\",\n \"-s\",\n \"-t\",\n session,\n \"-F\",\n \"#{pane_id}\\t#{window_name}\\t#{pane_title}\\t#{pane_current_command}\"\n ])\n )\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0)\n const rows = lines.map((line) => parsePaneRow(line))\n yield* _(Effect.log(`Project: ${resolved}`))\n yield* _(Effect.log(`Session: ${session}`))\n if (rows.length === 0) {\n yield* _(Effect.log(\"No panes found.\"))\n return\n }\n for (const row of rows) {\n yield* _(Effect.log(renderPaneRow(row)))\n }\n })\n\n// CHANGE: attach a tmux workspace for a docker-git project\n// WHY: provide multi-pane terminal layout for sandbox work\n// QUOTE(ТЗ): \"окей Давай подключим tmux\"\n// REF: user-request-2026-02-02-tmux\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: attach(p) -> tmux(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | DockerCommandError | ConfigNotFoundError | ConfigDecodeError | FileExistsError | PortProbeError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: tmux session name is deterministic from repo url\n// COMPLEXITY: O(1)\nexport const attachTmux = (\n command: AttachCommand\n): Effect.Effect<\n void,\n | CommandFailedError\n | DockerCommandError\n | ConfigNotFoundError\n | ConfigDecodeError\n | FileExistsError\n | PortProbeError\n | PlatformError,\n CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const template = yield* _(runDockerComposeUpWithPortCheck(resolved))\n const sshCommand = buildSshCommand(template, sshKey)\n const repoDisplayName = formatRepoDisplayName(template.repoUrl)\n const refLabel = formatRepoRefLabel(template.repoRef)\n const statusRight =\n `SSH: ${template.sshUser}@localhost:${template.sshPort} | Repo: ${repoDisplayName} | Ref: ${refLabel} | Status: Running`\n const session = `dg-${deriveRepoSlug(template.repoUrl)}`\n const hasSessionCode = yield* _(runTmuxExitCode([\"has-session\", \"-t\", session]))\n\n if (hasSessionCode === 0) {\n const existingLayout = yield* _(readLayoutVersion(session))\n if (existingLayout === layoutVersion) {\n yield* _(runTmux([\"attach\", \"-t\", session]))\n return\n }\n yield* _(Effect.logWarning(`tmux session ${session} uses an old layout; recreating.`))\n yield* _(runTmux([\"kill-session\", \"-t\", session]))\n }\n\n yield* _(createLayout(session))\n yield* _(configureSession(session, repoDisplayName, statusRight))\n yield* _(setupPanes(session, sshCommand, template.containerName))\n yield* _(runTmux([\"attach\", \"-t\", session]))\n })\n","export type BufferInputKey = {\n readonly backspace?: boolean\n readonly delete?: boolean\n}\n\nexport const nextBufferValue = (\n input: string,\n key: BufferInputKey,\n buffer: string\n): string | null => {\n if (key.backspace || key.delete) {\n return buffer.slice(0, -1)\n }\n if (input.length > 0) {\n return buffer + input\n }\n return null\n}\n","import type { MenuViewContext, ViewState } from \"./menu-types.js\"\n\nimport { Effect, pipe } from \"effect\"\n\n// CHANGE: share menu escape handling across flows\n// WHY: avoid duplicated logic in TUI handlers\n// QUOTE(ТЗ): \"А ты можешь сделать удобный выбор проектов?\"\n// REF: user-request-2026-02-02-select-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: escape(s) -> menu(s)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: always resets message on escape\n// COMPLEXITY: O(1)\n\ntype MenuResetContext = Pick<MenuViewContext, \"setView\" | \"setMessage\">\n\ntype OutputWrite = typeof process.stdout.write\n\nlet stdoutPatched = false\nlet stdoutMuted = false\nlet baseStdoutWrite: OutputWrite | null = null\nlet baseStderrWrite: OutputWrite | null = null\n\nconst wrapWrite = (baseWrite: OutputWrite): OutputWrite =>\n(\n chunk: string | Uint8Array,\n encoding?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void\n) => {\n if (stdoutMuted) {\n const callback = typeof encoding === \"function\" ? encoding : cb\n if (typeof callback === \"function\") {\n callback()\n }\n return true\n }\n if (typeof encoding === \"function\") {\n return baseWrite(chunk, encoding)\n }\n return baseWrite(chunk, encoding, cb)\n}\n\nconst disableMouseModes = (): void => {\n // Disable xterm/urxvt mouse tracking and \"alternate scroll\" mode (wheel -> arrow keys).\n process.stdout.write(\n \"\\u001B[?1000l\\u001B[?1002l\\u001B[?1003l\\u001B[?1005l\\u001B[?1006l\\u001B[?1015l\\u001B[?1007l\"\n )\n}\n\n// CHANGE: mute Ink stdout writes while SSH is active\n// WHY: prevent Ink resize re-renders from corrupting the SSH terminal buffer\n// QUOTE(ТЗ): \"при изменении разершения он всё ломает?\"\n// REF: user-request-2026-02-05-ssh-resize\n// SOURCE: n/a\n// FORMAT THEOREM: ∀w: muted(w) → ¬writes(ink, stdout)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: wrapper preserves original stdout write when not muted\n// COMPLEXITY: O(1)\nconst ensureStdoutPatched = (): void => {\n if (stdoutPatched) {\n return\n }\n baseStdoutWrite = process.stdout.write.bind(process.stdout)\n baseStderrWrite = process.stderr.write.bind(process.stderr)\n\n process.stdout.write = wrapWrite(baseStdoutWrite)\n process.stderr.write = wrapWrite(baseStderrWrite)\n stdoutPatched = true\n}\n\n// CHANGE: allow writing to the terminal even while stdout is muted\n// WHY: we mute Ink renders during interactive commands, but still need to show prompts/errors\n// REF: user-request-2026-02-18-tui-output-hidden\n// SOURCE: n/a\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: bypasses the mute wrapper safely\nexport const writeToTerminal = (text: string): void => {\n ensureStdoutPatched()\n const write = baseStdoutWrite ?? process.stdout.write.bind(process.stdout)\n write(text)\n}\n\n// CHANGE: keep the user on the primary screen until they acknowledge\n// WHY: otherwise output from failed docker/gh commands gets hidden again when TUI resumes\n// REF: user-request-2026-02-18-tui-output-hidden\n// SOURCE: n/a\n// PURITY: SHELL\n// EFFECT: Effect<void, never, never>\n// INVARIANT: no-op when stdin/stdout aren't TTY (CI/e2e)\nexport const pauseForEnter = (\n prompt = \"Press Enter to return to docker-git...\"\n): Effect.Effect<void> => {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return Effect.void\n }\n\n return Effect.async((resume) => {\n // Ensure the prompt isn't glued to the last command line.\n writeToTerminal(`\\n${prompt}\\n`)\n process.stdin.resume()\n\n const cleanup = () => {\n process.stdin.off(\"data\", onData)\n }\n\n const onData = () => {\n cleanup()\n resume(Effect.void)\n }\n\n process.stdin.on(\"data\", onData)\n\n return Effect.sync(() => {\n cleanup()\n })\n }).pipe(Effect.asVoid)\n}\n\nexport const writeErrorAndPause = (renderedError: string): Effect.Effect<void> =>\n pipe(\n Effect.sync(() => {\n writeToTerminal(`\\n[docker-git] ${renderedError}\\n`)\n }),\n Effect.zipRight(pauseForEnter()),\n Effect.asVoid\n )\n\nexport const withSuspendedTui = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n options?: {\n readonly onError?: (error: E) => Effect.Effect<void>\n readonly onResume?: () => void\n }\n): Effect.Effect<A, E, R> => {\n const withError = options?.onError\n ? pipe(effect, Effect.tapError((error) => Effect.ignore(options.onError?.(error) ?? Effect.void)))\n : effect\n\n return pipe(\n Effect.sync(suspendTui),\n Effect.zipRight(withError),\n Effect.ensuring(\n Effect.sync(() => {\n resumeTui()\n options?.onResume?.()\n })\n )\n )\n}\n\nexport type SkipInputsContext = {\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\nexport type SshActiveContext = {\n readonly setSshActive: (active: boolean) => void\n}\n\nexport const resumeWithSkipInputs = (context: SkipInputsContext, extra?: () => void) => () => {\n extra?.()\n context.setSkipInputs(() => 2)\n}\n\nexport const resumeSshWithSkipInputs = (context: SkipInputsContext & SshActiveContext) =>\n resumeWithSkipInputs(context, () => {\n context.setSshActive(false)\n })\n\nexport const pauseOnError = <E>(render: (error: E) => string) => (error: E): Effect.Effect<void> =>\n writeErrorAndPause(render(error))\n\n// CHANGE: toggle stdout write muting for Ink rendering\n// WHY: allow SSH sessions to own the terminal without TUI redraws\n// QUOTE(ТЗ): \"при изменении разершения он всё ломает?\"\n// REF: user-request-2026-02-05-ssh-resize\n// SOURCE: n/a\n// FORMAT THEOREM: ∀m ∈ {true,false}: muted = m\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: stdout wrapper is installed at most once\n// COMPLEXITY: O(1)\nconst setStdoutMuted = (muted: boolean): void => {\n ensureStdoutPatched()\n stdoutMuted = muted\n}\n\n// CHANGE: temporarily suspend TUI rendering when running interactive commands\n// WHY: avoid mixed output from docker/ssh and the Ink UI\n// QUOTE(ТЗ): \"Почему так кривокосо всё отображается?\"\n// REF: user-request-2026-02-02-tui-output\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: suspend -> cleanOutput(cmd)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: only toggles when TTY is available\n// COMPLEXITY: O(1)\nexport const suspendTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n disableMouseModes()\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(false)\n }\n // Switch back to the primary screen so interactive commands (ssh/gh/codex)\n // can render normally. Do not clear it: users may need scrollback (OAuth codes/URLs).\n process.stdout.write(\"\\u001B[?1049l\")\n setStdoutMuted(true)\n}\n\n// CHANGE: restore TUI rendering after interactive commands\n// WHY: return to Ink UI without broken terminal state\n// QUOTE(ТЗ): \"Почему так кривокосо всё отображается?\"\n// REF: user-request-2026-02-02-tui-output\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: resume -> tuiVisible(cmd)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: only toggles when TTY is available\n// COMPLEXITY: O(1)\nexport const resumeTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n setStdoutMuted(false)\n disableMouseModes()\n // Return to the alternate screen for Ink rendering.\n process.stdout.write(\"\\u001B[?1049h\\u001B[2J\\u001B[H\")\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(true)\n }\n disableMouseModes()\n}\n\nexport const leaveTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n // Ensure we don't leave the terminal in a broken \"mouse reporting\" mode.\n setStdoutMuted(false)\n disableMouseModes()\n // Restore the primary screen on exit without clearing it (keeps useful scrollback).\n process.stdout.write(\"\\u001B[?1049l\")\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(false)\n }\n}\n\nexport const resetToMenu = (context: MenuResetContext): void => {\n const view: ViewState = { _tag: \"Menu\" }\n context.setView(view)\n context.setMessage(null)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport type * as Effect from \"effect/Effect\"\n\nimport type { MenuAction } from \"@effect-template/lib/core/domain\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\n// CHANGE: isolate TUI types/constants into a shared module\n// WHY: keep menu rendering and input handling small and focused\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: state(s) -> wellTyped(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: createSteps is ordered and total over CreateStep\n// COMPLEXITY: O(1)\n\nexport type MenuState = {\n readonly cwd: string\n readonly activeDir: string | null\n}\n\nexport type MenuEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nexport type MenuRunner = {\n readonly runEffect: (effect: Effect.Effect<void, AppError, MenuEnv>) => void\n}\n\nexport type MenuViewContext = {\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly setActiveDir: (dir: string | null) => void\n}\n\nexport type MenuKeyInput = {\n readonly upArrow?: boolean\n readonly downArrow?: boolean\n readonly return?: boolean\n readonly escape?: boolean\n readonly backspace?: boolean\n readonly delete?: boolean\n}\n\nexport type CreateInputs = {\n readonly repoUrl: string\n readonly repoRef: string\n readonly outDir: string\n readonly runUp: boolean\n readonly enableMcpPlaywright: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nexport type CreateStep =\n | \"repoUrl\"\n | \"repoRef\"\n | \"outDir\"\n | \"runUp\"\n | \"mcpPlaywright\"\n | \"force\"\n\nexport const createSteps: ReadonlyArray<CreateStep> = [\n \"repoUrl\",\n \"repoRef\",\n \"outDir\",\n \"runUp\",\n \"mcpPlaywright\",\n \"force\"\n]\n\nexport type AuthFlow =\n | \"GithubOauth\"\n | \"GithubRemove\"\n | \"GitSet\"\n | \"GitRemove\"\n | \"ClaudeOauth\"\n | \"ClaudeLogout\"\n\nexport interface AuthSnapshot {\n readonly globalEnvPath: string\n readonly claudeAuthPath: string\n readonly totalEntries: number\n readonly githubTokenEntries: number\n readonly gitTokenEntries: number\n readonly gitUserEntries: number\n readonly claudeAuthEntries: number\n}\n\nexport type ProjectAuthFlow =\n | \"ProjectGithubConnect\"\n | \"ProjectGithubDisconnect\"\n | \"ProjectGitConnect\"\n | \"ProjectGitDisconnect\"\n | \"ProjectClaudeConnect\"\n | \"ProjectClaudeDisconnect\"\n\nexport interface ProjectAuthSnapshot {\n readonly projectDir: string\n readonly projectName: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly claudeAuthPath: string\n readonly githubTokenEntries: number\n readonly gitTokenEntries: number\n readonly claudeAuthEntries: number\n readonly activeGithubLabel: string | null\n readonly activeGitLabel: string | null\n readonly activeClaudeLabel: string | null\n}\n\nexport type ViewState =\n | { readonly _tag: \"Menu\" }\n | { readonly _tag: \"Create\"; readonly step: number; readonly buffer: string; readonly values: Partial<CreateInputs> }\n | { readonly _tag: \"AuthMenu\"; readonly selected: number; readonly snapshot: AuthSnapshot }\n | {\n readonly _tag: \"AuthPrompt\"\n readonly flow: AuthFlow\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n readonly snapshot: AuthSnapshot\n }\n | {\n readonly _tag: \"ProjectAuthMenu\"\n readonly selected: number\n readonly project: ProjectItem\n readonly snapshot: ProjectAuthSnapshot\n }\n | {\n readonly _tag: \"ProjectAuthPrompt\"\n readonly flow: ProjectAuthFlow\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n readonly project: ProjectItem\n readonly snapshot: ProjectAuthSnapshot\n }\n | {\n readonly _tag: \"SelectProject\"\n readonly purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\"\n readonly items: ReadonlyArray<ProjectItem>\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly selected: number\n readonly confirmDelete: boolean\n readonly connectEnableMcpPlaywright: boolean\n }\n\nexport type SelectProjectRuntime = {\n readonly running: boolean\n readonly sshSessions: number\n readonly startedAtIso: string | null\n readonly startedAtEpochMs: number | null\n}\n\nexport const menuItems: ReadonlyArray<{ readonly id: MenuAction; readonly label: string }> = [\n { id: { _tag: \"Create\" }, label: \"Create project\" },\n { id: { _tag: \"Select\" }, label: \"Select project\" },\n { id: { _tag: \"Auth\" }, label: \"Auth profiles (keys)\" },\n { id: { _tag: \"ProjectAuth\" }, label: \"Project auth (bind labels)\" },\n { id: { _tag: \"Info\" }, label: \"Show connection info\" },\n { id: { _tag: \"Status\" }, label: \"docker compose ps\" },\n { id: { _tag: \"Logs\" }, label: \"docker compose logs --tail=200\" },\n { id: { _tag: \"Down\" }, label: \"docker compose down\" },\n { id: { _tag: \"DownAll\" }, label: \"docker compose down (ALL projects)\" },\n { id: { _tag: \"Delete\" }, label: \"Delete project (folder + container)\" },\n { id: { _tag: \"Quit\" }, label: \"Quit\" }\n]\n","import { type CreateCommand, deriveRepoPathParts, resolveRepoInput } from \"@effect-template/lib/core/domain\"\nimport { createProject } from \"@effect-template/lib/usecases/actions\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Either, Match, pipe } from \"effect\"\nimport { parseArgs } from \"./cli/parser.js\"\nimport { formatParseError, usageText } from \"./cli/usage.js\"\n\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport {\n type CreateInputs,\n type CreateStep,\n createSteps,\n type MenuEnv,\n type MenuState,\n type ViewState\n} from \"./menu-types.js\"\n\n// CHANGE: move create-flow handling into a dedicated module\n// WHY: keep TUI entry slim and satisfy lint constraints\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: step(s) -> step'(s)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: outDir resolves to a stable repo path\n// COMPLEXITY: O(1) per keypress\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype CreateRunner = { readonly runEffect: (effect: Effect.Effect<void, AppError, MenuEnv>) => void }\n\ntype CreateContext = {\n readonly state: MenuState\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly runner: CreateRunner\n readonly setActiveDir: (dir: string | null) => void\n}\n\ntype CreateReturnContext = CreateContext & {\n readonly view: Extract<ViewState, { readonly _tag: \"Create\" }>\n}\n\nexport const buildCreateArgs = (input: CreateInputs): ReadonlyArray<string> => {\n const args: Array<string> = [\"create\"]\n if (input.repoUrl.length > 0) {\n args.push(\"--repo-url\", input.repoUrl)\n }\n if (input.repoRef.length > 0) {\n args.push(\"--repo-ref\", input.repoRef)\n }\n if (input.outDir.length > 0) {\n args.push(\"--out-dir\", input.outDir)\n }\n if (!input.runUp) {\n args.push(\"--no-up\")\n }\n if (input.enableMcpPlaywright) {\n args.push(\"--mcp-playwright\")\n }\n if (input.force) {\n args.push(\"--force\")\n }\n if (input.forceEnv) {\n args.push(\"--force-env\")\n }\n return args\n}\n\nconst trimLeftSlash = (value: string): string => {\n let start = 0\n while (start < value.length && value[start] === \"/\") {\n start += 1\n }\n return value.slice(start)\n}\n\nconst trimRightSlash = (value: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === \"/\") {\n end -= 1\n }\n return value.slice(0, end)\n}\n\nconst joinPath = (...parts: ReadonlyArray<string>): string => {\n const cleaned = parts\n .filter((part) => part.length > 0)\n .map((part, index) => {\n if (index === 0) {\n return trimRightSlash(part)\n }\n return trimRightSlash(trimLeftSlash(part))\n })\n return cleaned.join(\"/\")\n}\n\nconst resolveDefaultOutDir = (cwd: string, repoUrl: string): string => {\n const resolvedRepo = resolveRepoInput(repoUrl)\n const baseParts = deriveRepoPathParts(resolvedRepo.repoUrl).pathParts\n const projectParts = resolvedRepo.workspaceSuffix ? [...baseParts, resolvedRepo.workspaceSuffix] : baseParts\n return joinPath(defaultProjectsRoot(cwd), ...projectParts)\n}\n\nexport const resolveCreateInputs = (\n cwd: string,\n values: Partial<CreateInputs>\n): CreateInputs => {\n const repoUrl = values.repoUrl ?? \"\"\n const resolvedRepoRef = resolveRepoInput(repoUrl).repoRef\n const outDir = values.outDir ?? resolveDefaultOutDir(cwd, repoUrl)\n\n return {\n repoUrl,\n repoRef: values.repoRef ?? resolvedRepoRef ?? \"main\",\n outDir,\n runUp: values.runUp !== false,\n enableMcpPlaywright: values.enableMcpPlaywright === true,\n force: values.force === true,\n forceEnv: values.forceEnv === true\n }\n}\n\nconst parseYesDefault = (input: string, fallback: boolean): boolean => {\n const normalized = input.trim().toLowerCase()\n if (normalized === \"y\" || normalized === \"yes\") {\n return true\n }\n if (normalized === \"n\" || normalized === \"no\") {\n return false\n }\n return fallback\n}\n\nconst applyCreateCommand = (\n state: MenuState,\n create: CreateCommand\n): Effect.Effect<{ readonly _tag: \"Continue\"; readonly state: MenuState }, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const resolvedOutDir = path.resolve(create.outDir)\n yield* _(createProject(create))\n return { _tag: \"Continue\", state: { ...state, activeDir: resolvedOutDir } }\n })\n\nconst isCreateCommand = (command: { readonly _tag: string }): command is CreateCommand => command._tag === \"Create\"\n\nconst buildCreateEffect = (\n command: { readonly _tag: string },\n state: MenuState,\n setActiveDir: (dir: string | null) => void,\n setMessage: (message: string | null) => void\n): Effect.Effect<void, AppError, MenuEnv> => {\n if (isCreateCommand(command)) {\n return pipe(\n applyCreateCommand(state, command),\n Effect.tap((outcome) =>\n Effect.sync(() => {\n setActiveDir(outcome.state.activeDir)\n })\n ),\n Effect.asVoid\n )\n }\n if (command._tag === \"Help\") {\n return Effect.sync(() => {\n setMessage(usageText)\n })\n }\n return Effect.void\n}\n\nconst applyCreateStep = (input: {\n readonly step: CreateStep\n readonly buffer: string\n readonly currentDefaults: CreateInputs\n readonly nextValues: Partial<Mutable<CreateInputs>>\n readonly cwd: string\n readonly setMessage: (message: string | null) => void\n}): boolean =>\n Match.value(input.step).pipe(\n Match.when(\"repoUrl\", () => {\n input.nextValues.repoUrl = input.buffer\n input.nextValues.outDir = resolveDefaultOutDir(input.cwd, input.buffer)\n return true\n }),\n Match.when(\"repoRef\", () => {\n input.nextValues.repoRef = input.buffer.length > 0 ? input.buffer : input.currentDefaults.repoRef\n return true\n }),\n Match.when(\"outDir\", () => {\n input.nextValues.outDir = input.buffer.length > 0 ? input.buffer : input.currentDefaults.outDir\n return true\n }),\n Match.when(\"runUp\", () => {\n input.nextValues.runUp = parseYesDefault(input.buffer, input.currentDefaults.runUp)\n return true\n }),\n Match.when(\"mcpPlaywright\", () => {\n input.nextValues.enableMcpPlaywright = parseYesDefault(\n input.buffer,\n input.currentDefaults.enableMcpPlaywright\n )\n return true\n }),\n Match.when(\"force\", () => {\n input.nextValues.force = parseYesDefault(input.buffer, input.currentDefaults.force)\n return true\n }),\n Match.exhaustive\n )\n\nconst finalizeCreateFlow = (input: {\n readonly state: MenuState\n readonly nextValues: Partial<CreateInputs>\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly runner: CreateRunner\n readonly setActiveDir: (dir: string | null) => void\n}) => {\n const inputs = resolveCreateInputs(input.state.cwd, input.nextValues)\n const parsed = parseArgs(buildCreateArgs(inputs))\n if (Either.isLeft(parsed)) {\n input.setMessage(formatParseError(parsed.left))\n input.setView({ _tag: \"Menu\" })\n return\n }\n\n const effect = buildCreateEffect(parsed.right, input.state, input.setActiveDir, input.setMessage)\n input.runner.runEffect(effect)\n input.setView({ _tag: \"Menu\" })\n input.setMessage(null)\n}\n\nconst handleCreateReturn = (context: CreateReturnContext) => {\n const step = createSteps[context.view.step]\n if (!step) {\n context.setView({ _tag: \"Menu\" })\n return\n }\n\n const buffer = context.view.buffer.trim()\n const currentDefaults = resolveCreateInputs(context.state.cwd, context.view.values)\n const nextValues: Partial<Mutable<CreateInputs>> = { ...context.view.values }\n const updated = applyCreateStep({\n step,\n buffer,\n currentDefaults,\n nextValues,\n cwd: context.state.cwd,\n setMessage: context.setMessage\n })\n if (!updated) {\n return\n }\n\n const nextStep = context.view.step + 1\n if (nextStep < createSteps.length) {\n context.setView({ _tag: \"Create\", step: nextStep, buffer: \"\", values: nextValues })\n context.setMessage(null)\n return\n }\n\n finalizeCreateFlow({\n state: context.state,\n nextValues,\n setView: context.setView,\n setMessage: context.setMessage,\n runner: context.runner,\n setActiveDir: context.setActiveDir\n })\n}\n\nexport const startCreateView = (\n setView: (view: ViewState) => void,\n setMessage: (message: string | null) => void,\n buffer = \"\"\n) => {\n setView({ _tag: \"Create\", step: 0, buffer, values: {} })\n setMessage(null)\n}\n\nexport const handleCreateInput = (\n input: string,\n key: {\n readonly escape?: boolean\n readonly return?: boolean\n readonly backspace?: boolean\n readonly delete?: boolean\n },\n view: Extract<ViewState, { readonly _tag: \"Create\" }>,\n context: CreateContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.return) {\n handleCreateReturn({ ...context, view })\n return\n }\n const nextBuffer = nextBufferValue(input, key, view.buffer)\n if (nextBuffer !== null) {\n context.setView({ ...view, buffer: nextBuffer })\n }\n}\n","import type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\n\nexport const countAuthAccountDirectories = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<number, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(root))\n if (!exists) {\n return 0\n }\n const entries = yield* _(fs.readDirectory(root))\n let count = 0\n for (const entry of entries) {\n if (entry === \".image\") {\n continue\n }\n const fullPath = path.join(root, entry)\n const info = yield* _(fs.stat(fullPath))\n if (info.type === \"Directory\") {\n count += 1\n }\n }\n return count\n })\n","import { parseEnvEntries } from \"@effect-template/lib/usecases/env-file\"\n\nexport const normalizeLabel = (value: string): string => {\n const trimmed = value.trim()\n if (trimmed.length === 0) {\n return \"\"\n }\n const normalized = trimmed\n .toUpperCase()\n .replaceAll(/[^A-Z0-9]+/g, \"_\")\n\n let start = 0\n while (start < normalized.length && normalized[start] === \"_\") {\n start += 1\n }\n let end = normalized.length\n while (end > start && normalized[end - 1] === \"_\") {\n end -= 1\n }\n const cleaned = normalized.slice(start, end)\n return cleaned.length > 0 ? cleaned : \"\"\n}\n\nexport const buildLabeledEnvKey = (baseKey: string, label: string): string => {\n const normalized = normalizeLabel(label)\n if (normalized.length === 0 || normalized === \"DEFAULT\") {\n return baseKey\n }\n return `${baseKey}__${normalized}`\n}\n\nexport const countKeyEntries = (envText: string, baseKey: string): number => {\n const prefix = `${baseKey}__`\n return parseEnvEntries(envText)\n .filter((entry) => entry.value.trim().length > 0 && (entry.key === baseKey || entry.key.startsWith(prefix)))\n .length\n}\n","import * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { ensureEnvFile, parseEnvEntries, readEnvText, upsertEnvKey } from \"@effect-template/lib/usecases/env-file\"\nimport { type AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport { autoSyncState } from \"@effect-template/lib/usecases/state-repo\"\n\nimport { countAuthAccountDirectories } from \"./menu-auth-helpers.js\"\nimport { buildLabeledEnvKey, countKeyEntries, normalizeLabel } from \"./menu-labeled-env.js\"\nimport type { AuthFlow, AuthSnapshot, MenuEnv } from \"./menu-types.js\"\n\nexport type AuthMenuAction = AuthFlow | \"Refresh\" | \"Back\"\n\ntype AuthMenuItem = {\n readonly action: AuthMenuAction\n readonly label: string\n}\n\nexport type AuthEnvFlow = Extract<AuthFlow, \"GithubRemove\" | \"GitSet\" | \"GitRemove\">\n\nexport type AuthPromptStep = {\n readonly key: \"label\" | \"token\" | \"user\"\n readonly label: string\n readonly required: boolean\n readonly secret: boolean\n}\n\nconst authMenuItems: ReadonlyArray<AuthMenuItem> = [\n { action: \"GithubOauth\", label: \"GitHub: login via OAuth (web)\" },\n { action: \"GithubRemove\", label: \"GitHub: remove token\" },\n { action: \"GitSet\", label: \"Git: add/update credentials\" },\n { action: \"GitRemove\", label: \"Git: remove credentials\" },\n { action: \"ClaudeOauth\", label: \"Claude Code: login via OAuth (web)\" },\n { action: \"ClaudeLogout\", label: \"Claude Code: logout (clear cache)\" },\n { action: \"Refresh\", label: \"Refresh snapshot\" },\n { action: \"Back\", label: \"Back to main menu\" }\n]\n\nconst flowSteps: Readonly<Record<AuthFlow, ReadonlyArray<AuthPromptStep>>> = {\n GithubOauth: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n GithubRemove: [\n { key: \"label\", label: \"Label to remove (empty = default)\", required: false, secret: false }\n ],\n GitSet: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false },\n { key: \"token\", label: \"Git auth token\", required: true, secret: true },\n { key: \"user\", label: \"Git auth user (empty = x-access-token)\", required: false, secret: false }\n ],\n GitRemove: [\n { key: \"label\", label: \"Label to remove (empty = default)\", required: false, secret: false }\n ],\n ClaudeOauth: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ClaudeLogout: [\n { key: \"label\", label: \"Label to logout (empty = default)\", required: false, secret: false }\n ]\n}\n\nconst flowTitle = (flow: AuthFlow): string =>\n Match.value(flow).pipe(\n Match.when(\"GithubOauth\", () => \"GitHub OAuth\"),\n Match.when(\"GithubRemove\", () => \"GitHub remove\"),\n Match.when(\"GitSet\", () => \"Git credentials\"),\n Match.when(\"GitRemove\", () => \"Git remove\"),\n Match.when(\"ClaudeOauth\", () => \"Claude Code OAuth\"),\n Match.when(\"ClaudeLogout\", () => \"Claude Code logout\"),\n Match.exhaustive\n )\n\nexport const successMessage = (flow: AuthFlow, label: string): string =>\n Match.value(flow).pipe(\n Match.when(\"GithubOauth\", () => `Saved GitHub token (${label}).`),\n Match.when(\"GithubRemove\", () => `Removed GitHub token (${label}).`),\n Match.when(\"GitSet\", () => `Saved Git credentials (${label}).`),\n Match.when(\"GitRemove\", () => `Removed Git credentials (${label}).`),\n Match.when(\"ClaudeOauth\", () => `Saved Claude Code login (${label}).`),\n Match.when(\"ClaudeLogout\", () => `Logged out Claude Code (${label}).`),\n Match.exhaustive\n )\n\nconst buildGlobalEnvPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/env/global.env`\nconst buildClaudeAuthPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/auth/claude`\n\ntype AuthEnvText = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly globalEnvPath: string\n readonly claudeAuthPath: string\n readonly envText: string\n}\n\nconst loadAuthEnvText = (\n cwd: string\n): Effect.Effect<AuthEnvText, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const globalEnvPath = buildGlobalEnvPath(cwd)\n const claudeAuthPath = buildClaudeAuthPath(cwd)\n yield* _(ensureEnvFile(fs, path, globalEnvPath))\n const envText = yield* _(readEnvText(fs, globalEnvPath))\n return { fs, path, globalEnvPath, claudeAuthPath, envText }\n })\n\nexport const readAuthSnapshot = (\n cwd: string\n): Effect.Effect<AuthSnapshot, AppError, MenuEnv> =>\n pipe(\n loadAuthEnvText(cwd),\n Effect.flatMap(({ claudeAuthPath, envText, fs, globalEnvPath, path }) =>\n pipe(\n countAuthAccountDirectories(fs, path, claudeAuthPath),\n Effect.map((claudeAuthEntries) => ({\n globalEnvPath,\n claudeAuthPath,\n totalEntries: parseEnvEntries(envText).filter((entry) => entry.value.trim().length > 0).length,\n githubTokenEntries: countKeyEntries(envText, \"GITHUB_TOKEN\"),\n gitTokenEntries: countKeyEntries(envText, \"GIT_AUTH_TOKEN\"),\n gitUserEntries: countKeyEntries(envText, \"GIT_AUTH_USER\"),\n claudeAuthEntries\n }))\n )\n )\n )\n\nexport const writeAuthFlow = (\n cwd: string,\n flow: AuthEnvFlow,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n loadAuthEnvText(cwd),\n Effect.flatMap(({ envText, fs, globalEnvPath }) => {\n const label = values[\"label\"] ?? \"\"\n const canonicalLabel = (() => {\n const normalized = normalizeLabel(label)\n return normalized.length === 0 || normalized === \"DEFAULT\" ? \"default\" : normalized\n })()\n const token = (values[\"token\"] ?? \"\").trim()\n const user = (values[\"user\"] ?? \"\").trim()\n const nextText = Match.value(flow).pipe(\n Match.when(\"GithubRemove\", () => upsertEnvKey(envText, buildLabeledEnvKey(\"GITHUB_TOKEN\", label), \"\")),\n Match.when(\"GitSet\", () => {\n const withToken = upsertEnvKey(envText, buildLabeledEnvKey(\"GIT_AUTH_TOKEN\", label), token)\n const resolvedUser = user.length > 0 ? user : \"x-access-token\"\n return upsertEnvKey(withToken, buildLabeledEnvKey(\"GIT_AUTH_USER\", label), resolvedUser)\n }),\n Match.when(\"GitRemove\", () => {\n const withoutToken = upsertEnvKey(envText, buildLabeledEnvKey(\"GIT_AUTH_TOKEN\", label), \"\")\n return upsertEnvKey(withoutToken, buildLabeledEnvKey(\"GIT_AUTH_USER\", label), \"\")\n }),\n Match.exhaustive\n )\n const syncMessage = Match.value(flow).pipe(\n Match.when(\"GithubRemove\", () => `chore(state): auth gh logout ${canonicalLabel}`),\n Match.when(\"GitSet\", () => `chore(state): auth git ${canonicalLabel}`),\n Match.when(\"GitRemove\", () => `chore(state): auth git logout ${canonicalLabel}`),\n Match.exhaustive\n )\n return pipe(\n fs.writeFileString(globalEnvPath, nextText),\n Effect.zipRight(autoSyncState(syncMessage))\n )\n }),\n Effect.asVoid\n )\n\nexport const authViewTitle = (flow: AuthFlow): string => flowTitle(flow)\n\nexport const authViewSteps = (flow: AuthFlow): ReadonlyArray<AuthPromptStep> => flowSteps[flow]\n\nexport const authMenuLabels = (): ReadonlyArray<string> => authMenuItems.map((item) => item.label)\n\nexport const authMenuActionByIndex = (index: number): AuthMenuAction | null => {\n const item = authMenuItems[index]\n return item ? item.action : null\n}\n\nexport const authMenuSize = (): number => authMenuItems.length\n","export const parseMenuIndex = (input: string): number | null => {\n const trimmed = input.trim()\n if (trimmed.length === 0) {\n return null\n }\n const parsed = Number(trimmed)\n if (!Number.isInteger(parsed)) {\n return null\n }\n const index = parsed - 1\n return index >= 0 ? index : null\n}\n\ntype PromptStep = {\n readonly key: string\n readonly label: string\n readonly required: boolean\n}\n\ntype PromptView = {\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n}\n\ntype PromptContext<V extends PromptView> = {\n readonly setView: (view: V) => void\n readonly setMessage: (message: string | null) => void\n}\n\nexport const submitPromptStep = <V extends PromptView>(\n view: V,\n steps: ReadonlyArray<PromptStep>,\n context: PromptContext<V>,\n onCancel: () => void,\n onSubmit: (values: Readonly<Record<string, string>>) => void\n): void => {\n const step = steps[view.step]\n if (!step) {\n onCancel()\n return\n }\n\n const value = view.buffer.trim()\n if (step.required && value.length === 0) {\n context.setMessage(`${step.label} is required.`)\n return\n }\n\n const nextValues: Readonly<Record<string, string>> = { ...view.values, [step.key]: value }\n const nextStep = view.step + 1\n if (nextStep < steps.length) {\n context.setView({ ...view, step: nextStep, buffer: \"\", values: nextValues })\n context.setMessage(null)\n return\n }\n\n onSubmit(nextValues)\n}\n\ntype MenuNumberInputContext = {\n readonly setMessage: (message: string | null) => void\n}\n\nexport const handleMenuNumberInput = <A>(\n input: string,\n context: MenuNumberInputContext,\n actionByIndex: (index: number) => A | null,\n runAction: (action: A) => void\n): void => {\n const index = parseMenuIndex(input)\n if (index === null) {\n if (input.trim().length > 0) {\n context.setMessage(\"Use arrows + Enter, or type a number from the list.\")\n }\n return\n }\n\n const action = actionByIndex(index)\n if (action === null) {\n context.setMessage(`Unknown action: ${input.trim()}`)\n return\n }\n runAction(action)\n}\n","import { Effect, Match, pipe } from \"effect\"\n\nimport { authClaudeLogin, authClaudeLogout, authGithubLogin, claudeAuthRoot } from \"@effect-template/lib/usecases/auth\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\n\nimport {\n type AuthMenuAction,\n authMenuActionByIndex,\n authMenuSize,\n authViewSteps,\n readAuthSnapshot,\n successMessage,\n writeAuthFlow\n} from \"./menu-auth-data.js\"\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { handleMenuNumberInput, submitPromptStep } from \"./menu-input-utils.js\"\nimport { pauseOnError, resetToMenu, resumeSshWithSkipInputs, withSuspendedTui } from \"./menu-shared.js\"\nimport type {\n AuthFlow,\n AuthSnapshot,\n MenuEnv,\n MenuKeyInput,\n MenuRunner,\n MenuState,\n MenuViewContext,\n ViewState\n} from \"./menu-types.js\"\n\ntype AuthContext = MenuViewContext & {\n readonly state: MenuState\n readonly runner: MenuRunner\n}\n\ntype AuthInputContext = AuthContext & {\n readonly setSshActive: (active: boolean) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\ntype AuthPromptView = Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>\n\nconst defaultLabel = (value: string): string => {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : \"default\"\n}\n\nconst startAuthMenuWithSnapshot = (\n snapshot: AuthSnapshot,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({ _tag: \"AuthMenu\", selected: 0, snapshot })\n context.setMessage(null)\n}\n\nconst startAuthPrompt = (\n snapshot: AuthSnapshot,\n flow: AuthFlow,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({\n _tag: \"AuthPrompt\",\n flow,\n step: 0,\n buffer: \"\",\n values: {},\n snapshot\n })\n context.setMessage(null)\n}\n\nconst resolveLabelOption = (values: Readonly<Record<string, string>>): string | null => {\n const labelValue = (values[\"label\"] ?? \"\").trim()\n return labelValue.length > 0 ? labelValue : null\n}\n\nconst resolveAuthPromptEffect = (\n view: AuthPromptView,\n cwd: string,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> => {\n const labelOption = resolveLabelOption(values)\n return Match.value(view.flow).pipe(\n Match.when(\"GithubOauth\", () =>\n authGithubLogin({\n _tag: \"AuthGithubLogin\",\n label: labelOption,\n token: null,\n scopes: null,\n envGlobalPath: view.snapshot.globalEnvPath\n })),\n Match.when(\"ClaudeOauth\", () =>\n authClaudeLogin({\n _tag: \"AuthClaudeLogin\",\n label: labelOption,\n claudeAuthPath: claudeAuthRoot\n })),\n Match.when(\"ClaudeLogout\", () =>\n authClaudeLogout({\n _tag: \"AuthClaudeLogout\",\n label: labelOption,\n claudeAuthPath: claudeAuthRoot\n })),\n Match.when(\"GithubRemove\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.when(\"GitSet\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.when(\"GitRemove\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.exhaustive\n )\n}\n\nconst runAuthPromptEffect = (\n effect: Effect.Effect<void, AppError, MenuEnv>,\n view: AuthPromptView,\n label: string,\n context: AuthInputContext,\n options: { readonly suspendTui: boolean }\n) => {\n const withOptionalSuspension = options.suspendTui\n ? withSuspendedTui(effect, {\n onError: pauseOnError(renderError),\n onResume: resumeSshWithSkipInputs(context)\n })\n : effect\n\n context.setSshActive(options.suspendTui)\n context.runner.runEffect(\n pipe(\n withOptionalSuspension,\n Effect.zipRight(readAuthSnapshot(context.state.cwd)),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startAuthMenuWithSnapshot(snapshot, context)\n context.setMessage(successMessage(view.flow, label))\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst loadAuthMenuView = (\n cwd: string,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n readAuthSnapshot(cwd),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startAuthMenuWithSnapshot(snapshot, context)\n })\n ),\n Effect.asVoid\n )\n\nconst runAuthAction = (\n action: AuthMenuAction,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n if (action === \"Back\") {\n resetToMenu(context)\n return\n }\n if (action === \"Refresh\") {\n context.runner.runEffect(loadAuthMenuView(context.state.cwd, context))\n return\n }\n startAuthPrompt(view.snapshot, action, context)\n}\n\nconst submitAuthPrompt = (\n view: AuthPromptView,\n context: AuthInputContext\n) => {\n const steps = authViewSteps(view.flow)\n submitPromptStep(\n view,\n steps,\n context,\n () => {\n startAuthMenuWithSnapshot(view.snapshot, context)\n },\n (nextValues) => {\n const label = defaultLabel(nextValues[\"label\"] ?? \"\")\n const effect = resolveAuthPromptEffect(view, context.state.cwd, nextValues)\n runAuthPromptEffect(effect, view, label, context, {\n suspendTui: view.flow === \"GithubOauth\" || view.flow === \"ClaudeOauth\" || view.flow === \"ClaudeLogout\"\n })\n }\n )\n}\n\nconst setAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n selected: number,\n context: AuthContext\n) => {\n context.setView({\n ...view,\n selected\n })\n}\n\nconst shiftAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n delta: number,\n context: AuthContext\n) => {\n const menuSize = authMenuSize()\n const selected = (view.selected + delta + menuSize) % menuSize\n setAuthMenuSelection(view, selected, context)\n}\n\nconst runAuthMenuSelection = (\n selected: number,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n const action = authMenuActionByIndex(selected)\n if (action === null) {\n return\n }\n runAuthAction(action, view, context)\n}\n\nconst handleAuthMenuNumberInput = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n handleMenuNumberInput(input, context, authMenuActionByIndex, (action) => {\n runAuthAction(action, view, context)\n })\n}\n\nconst handleAuthMenuInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.upArrow) {\n shiftAuthMenuSelection(view, -1, context)\n return\n }\n if (key.downArrow) {\n shiftAuthMenuSelection(view, 1, context)\n return\n }\n if (key.return) {\n runAuthMenuSelection(view.selected, view, context)\n return\n }\n handleAuthMenuNumberInput(input, view, context)\n}\n\nconst handleAuthPromptInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>,\n context: AuthInputContext\n) => {\n if (key.escape) {\n startAuthMenuWithSnapshot(view.snapshot, context)\n return\n }\n if (key.return) {\n submitAuthPrompt(view, context)\n return\n }\n setAuthPromptBuffer({ input, key, view, context })\n}\n\ntype SetAuthPromptBufferArgs = {\n readonly input: string\n readonly key: MenuKeyInput\n readonly view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>\n readonly context: Pick<MenuViewContext, \"setView\">\n}\n\nconst setAuthPromptBuffer = (\n args: SetAuthPromptBufferArgs\n) => {\n const { context, input, key, view } = args\n const nextBuffer = nextBufferValue(input, key, view.buffer)\n if (nextBuffer === null) {\n return\n }\n context.setView({ ...view, buffer: nextBuffer })\n}\n\nexport const openAuthMenu = (context: AuthContext): void => {\n context.setMessage(\"Loading auth profiles...\")\n context.runner.runEffect(loadAuthMenuView(context.state.cwd, context))\n}\n\nexport const handleAuthInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" | \"AuthPrompt\" }>,\n context: AuthInputContext\n) => {\n if (view._tag === \"AuthMenu\") {\n handleAuthMenuInput(input, key, view, context)\n return\n }\n handleAuthPromptInput(input, key, view, context)\n}\n","import { runCommandCapture } from \"@effect-template/lib/shell/command-runner\"\nimport { runDockerPsNames } from \"@effect-template/lib/shell/docker\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { MenuEnv, SelectProjectRuntime, ViewState } from \"./menu-types.js\"\n\nconst emptyRuntimeByProject = (): Readonly<Record<string, SelectProjectRuntime>> => ({})\n\nconst stoppedRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst countSshSessionsScript = \"who -u 2>/dev/null | wc -l | tr -d '[:space:]'\"\nconst dockerZeroStartedAt = \"0001-01-01T00:00:00Z\"\n\ntype ContainerStartTime = {\n readonly startedAtIso: string\n readonly startedAtEpochMs: number\n}\n\nconst parseSshSessionCount = (raw: string): number => {\n const parsed = Number.parseInt(raw.trim(), 10)\n if (Number.isNaN(parsed) || parsed < 0) {\n return 0\n }\n return parsed\n}\n\nconst parseContainerStartedAt = (raw: string): ContainerStartTime | null => {\n const trimmed = raw.trim()\n if (trimmed.length === 0 || trimmed === dockerZeroStartedAt) {\n return null\n }\n const startedAtEpochMs = Date.parse(trimmed)\n if (Number.isNaN(startedAtEpochMs)) {\n return null\n }\n return {\n startedAtIso: trimmed,\n startedAtEpochMs\n }\n}\n\nconst toRuntimeMap = (\n entries: ReadonlyArray<readonly [string, SelectProjectRuntime]>\n): Readonly<Record<string, SelectProjectRuntime>> => {\n const runtimeByProject: Record<string, SelectProjectRuntime> = {}\n for (const [projectDir, runtime] of entries) {\n runtimeByProject[projectDir] = runtime\n }\n return runtimeByProject\n}\n\nconst countContainerSshSessions = (\n containerName: string\n): Effect.Effect<number, never, MenuEnv> =>\n pipe(\n runCommandCapture(\n {\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"exec\", containerName, \"bash\", \"-lc\", countSshSessionsScript]\n },\n [0],\n (exitCode) => ({ _tag: \"CommandFailedError\", command: \"docker exec who -u\", exitCode })\n ),\n Effect.match({\n onFailure: () => 0,\n onSuccess: (raw) => parseSshSessionCount(raw)\n })\n )\n\nconst inspectContainerStartedAt = (\n containerName: string\n): Effect.Effect<ContainerStartTime | null, never, MenuEnv> =>\n pipe(\n runCommandCapture(\n {\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"inspect\", \"--format\", \"{{.State.StartedAt}}\", containerName]\n },\n [0],\n (exitCode) => ({ _tag: \"CommandFailedError\", command: \"docker inspect .State.StartedAt\", exitCode })\n ),\n Effect.match({\n onFailure: () => null,\n onSuccess: (raw) => parseContainerStartedAt(raw)\n })\n )\n\n// CHANGE: enrich select items with runtime state and SSH session counts\n// WHY: prevent stopping/deleting containers that are currently used via SSH\n// QUOTE(ТЗ): \"писать скок SSH подключений к контейнеру сейчас\"\n// REF: issue-47\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: runtime(p) -> {running(p), ssh_sessions(p), started_at(p)}\n// PURITY: SHELL\n// EFFECT: Effect<Record<string, SelectProjectRuntime>, never, MenuEnv>\n// INVARIANT: projects without a known container start have startedAt = null\n// COMPLEXITY: O(n + docker_ps + docker_exec + docker_inspect)\nexport const loadRuntimeByProject = (\n items: ReadonlyArray<ProjectItem>\n): Effect.Effect<Readonly<Record<string, SelectProjectRuntime>>, never, MenuEnv> =>\n pipe(\n runDockerPsNames(process.cwd()),\n Effect.flatMap((runningNames) =>\n Effect.forEach(\n items,\n (item) => {\n const running = runningNames.includes(item.containerName)\n const sshSessionsEffect = running\n ? countContainerSshSessions(item.containerName)\n : Effect.succeed(0)\n return pipe(\n Effect.all([sshSessionsEffect, inspectContainerStartedAt(item.containerName)]),\n Effect.map(([sshSessions, startedAt]): SelectProjectRuntime => ({\n running,\n sshSessions,\n startedAtIso: startedAt?.startedAtIso ?? null,\n startedAtEpochMs: startedAt?.startedAtEpochMs ?? null\n })),\n Effect.map((runtime): readonly [string, SelectProjectRuntime] => [item.projectDir, runtime])\n )\n },\n { concurrency: 4 }\n )\n ),\n Effect.map((entries) => toRuntimeMap(entries)),\n Effect.match({\n onFailure: () => emptyRuntimeByProject(),\n onSuccess: (runtimeByProject) => runtimeByProject\n })\n )\n\nexport const runtimeForSelection = (\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n selected: ProjectItem\n): SelectProjectRuntime => view.runtimeByProject[selected.projectDir] ?? stoppedRuntime()\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nconst oauthTokenFileName = \".oauth-token\"\nconst legacyConfigFileName = \".config.json\"\n\nconst hasFileAtPath = (\n fs: FileSystem.FileSystem,\n filePath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(filePath))\n if (!exists) {\n return false\n }\n const info = yield* _(fs.stat(filePath))\n return info.type === \"File\"\n })\n\nconst hasNonEmptyOauthToken = (\n fs: FileSystem.FileSystem,\n tokenPath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const hasFile = yield* _(hasFileAtPath(fs, tokenPath))\n if (!hasFile) {\n return false\n }\n const tokenValue = yield* _(fs.readFileString(tokenPath), Effect.orElseSucceed(() => \"\"))\n return tokenValue.trim().length > 0\n })\n\nconst hasLegacyClaudeAuthFile = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const entries = yield* _(fs.readDirectory(accountPath))\n for (const entry of entries) {\n if (!entry.startsWith(\".claude\") || !entry.endsWith(\".json\")) {\n continue\n }\n const isFile = yield* _(hasFileAtPath(fs, `${accountPath}/${entry}`))\n if (isFile) {\n return true\n }\n }\n return false\n })\n\nexport const hasClaudeAccountCredentials = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<boolean, PlatformError> =>\n hasFileAtPath(fs, `${accountPath}/${legacyConfigFileName}`).pipe(\n Effect.flatMap((hasConfig) => {\n if (hasConfig) {\n return Effect.succeed(true)\n }\n return hasNonEmptyOauthToken(fs, `${accountPath}/${oauthTokenFileName}`).pipe(\n Effect.flatMap((hasOauthToken) => {\n if (hasOauthToken) {\n return Effect.succeed(true)\n }\n return hasLegacyClaudeAuthFile(fs, accountPath)\n })\n )\n })\n )\n","import * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { AuthError } from \"@effect-template/lib/shell/errors\"\nimport { normalizeAccountLabel } from \"@effect-template/lib/usecases/auth-helpers\"\nimport { ensureEnvFile, findEnvValue, readEnvText, upsertEnvKey } from \"@effect-template/lib/usecases/env-file\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { autoSyncState } from \"@effect-template/lib/usecases/state-repo\"\n\nimport { countAuthAccountDirectories } from \"./menu-auth-helpers.js\"\nimport { buildLabeledEnvKey, countKeyEntries, normalizeLabel } from \"./menu-labeled-env.js\"\nimport { hasClaudeAccountCredentials } from \"./menu-project-auth-claude.js\"\nimport type { MenuEnv, ProjectAuthFlow, ProjectAuthSnapshot } from \"./menu-types.js\"\n\nexport type ProjectAuthMenuAction = ProjectAuthFlow | \"Refresh\" | \"Back\"\n\ntype ProjectAuthMenuItem = {\n readonly action: ProjectAuthMenuAction\n readonly label: string\n}\n\nexport type ProjectAuthPromptStep = {\n readonly key: \"label\"\n readonly label: string\n readonly required: boolean\n readonly secret: boolean\n}\n\nconst projectAuthMenuItems: ReadonlyArray<ProjectAuthMenuItem> = [\n { action: \"ProjectGithubConnect\", label: \"Project: GitHub connect label\" },\n { action: \"ProjectGithubDisconnect\", label: \"Project: GitHub disconnect\" },\n { action: \"ProjectGitConnect\", label: \"Project: Git connect label\" },\n { action: \"ProjectGitDisconnect\", label: \"Project: Git disconnect\" },\n { action: \"ProjectClaudeConnect\", label: \"Project: Claude connect label\" },\n { action: \"ProjectClaudeDisconnect\", label: \"Project: Claude disconnect\" },\n { action: \"Refresh\", label: \"Refresh snapshot\" },\n { action: \"Back\", label: \"Back to main menu\" }\n]\n\nconst flowSteps: Readonly<Record<ProjectAuthFlow, ReadonlyArray<ProjectAuthPromptStep>>> = {\n ProjectGithubConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectGithubDisconnect: [],\n ProjectGitConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectGitDisconnect: [],\n ProjectClaudeConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectClaudeDisconnect: []\n}\n\nconst resolveCanonicalLabel = (value: string): string => {\n const normalized = normalizeLabel(value)\n return normalized.length === 0 || normalized === \"DEFAULT\" ? \"default\" : normalized\n}\n\nconst githubTokenBaseKey = \"GITHUB_TOKEN\"\nconst gitTokenBaseKey = \"GIT_AUTH_TOKEN\"\nconst gitUserBaseKey = \"GIT_AUTH_USER\"\n\nconst projectGithubLabelKey = \"GITHUB_AUTH_LABEL\"\nconst projectGitLabelKey = \"GIT_AUTH_LABEL\"\nconst projectClaudeLabelKey = \"CLAUDE_AUTH_LABEL\"\n\nconst defaultGitUser = \"x-access-token\"\n\ntype ProjectAuthEnvText = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly globalEnvPath: string\n readonly projectEnvPath: string\n readonly claudeAuthPath: string\n readonly globalEnvText: string\n readonly projectEnvText: string\n}\n\nconst buildGlobalEnvPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/env/global.env`\nconst buildClaudeAuthPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/auth/claude`\n\nconst loadProjectAuthEnvText = (\n project: ProjectItem\n): Effect.Effect<ProjectAuthEnvText, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const globalEnvPath = buildGlobalEnvPath(process.cwd())\n const claudeAuthPath = buildClaudeAuthPath(process.cwd())\n yield* _(ensureEnvFile(fs, path, globalEnvPath))\n yield* _(ensureEnvFile(fs, path, project.envProjectPath))\n const globalEnvText = yield* _(readEnvText(fs, globalEnvPath))\n const projectEnvText = yield* _(readEnvText(fs, project.envProjectPath))\n return {\n fs,\n path,\n globalEnvPath,\n projectEnvPath: project.envProjectPath,\n claudeAuthPath,\n globalEnvText,\n projectEnvText\n }\n })\n\nexport const readProjectAuthSnapshot = (\n project: ProjectItem\n): Effect.Effect<ProjectAuthSnapshot, AppError, MenuEnv> =>\n pipe(\n loadProjectAuthEnvText(project),\n Effect.flatMap(({ claudeAuthPath, fs, globalEnvPath, globalEnvText, path, projectEnvPath, projectEnvText }) =>\n pipe(\n countAuthAccountDirectories(fs, path, claudeAuthPath),\n Effect.map((claudeAuthEntries) => ({\n projectDir: project.projectDir,\n projectName: project.displayName,\n envGlobalPath: globalEnvPath,\n envProjectPath: projectEnvPath,\n claudeAuthPath,\n githubTokenEntries: countKeyEntries(globalEnvText, githubTokenBaseKey),\n gitTokenEntries: countKeyEntries(globalEnvText, gitTokenBaseKey),\n claudeAuthEntries,\n activeGithubLabel: findEnvValue(projectEnvText, projectGithubLabelKey),\n activeGitLabel: findEnvValue(projectEnvText, projectGitLabelKey),\n activeClaudeLabel: findEnvValue(projectEnvText, projectClaudeLabelKey)\n }))\n )\n )\n )\n\nconst missingSecret = (\n provider: string,\n label: string,\n envPath: string\n): AuthError =>\n new AuthError({\n message: `${provider} not connected: label '${label}' not found in ${envPath}`\n })\n\ntype ProjectEnvUpdateSpec = {\n readonly fs: FileSystem.FileSystem\n readonly rawLabel: string\n readonly canonicalLabel: string\n readonly globalEnvPath: string\n readonly globalEnvText: string\n readonly projectEnvText: string\n readonly claudeAuthPath: string\n}\n\nconst updateProjectGithubConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const key = buildLabeledEnvKey(githubTokenBaseKey, spec.rawLabel)\n const token = findEnvValue(spec.globalEnvText, key)\n if (token === null) {\n return Effect.fail(missingSecret(\"GitHub token\", spec.canonicalLabel, spec.globalEnvPath))\n }\n const withGitToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", token)\n const withGhToken = upsertEnvKey(withGitToken, \"GH_TOKEN\", token)\n const withoutGitLabel = upsertEnvKey(withGhToken, projectGitLabelKey, \"\")\n return Effect.succeed(upsertEnvKey(withoutGitLabel, projectGithubLabelKey, spec.canonicalLabel))\n}\n\nconst clearProjectGitLabels = (envText: string): string => {\n const withoutGhToken = upsertEnvKey(envText, \"GH_TOKEN\", \"\")\n const withoutGitLabel = upsertEnvKey(withoutGhToken, projectGitLabelKey, \"\")\n return upsertEnvKey(withoutGitLabel, projectGithubLabelKey, \"\")\n}\n\nconst updateProjectGithubDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n const withoutGitToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", \"\")\n return Effect.succeed(clearProjectGitLabels(withoutGitToken))\n}\n\nconst updateProjectGitConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const tokenKey = buildLabeledEnvKey(gitTokenBaseKey, spec.rawLabel)\n const userKey = buildLabeledEnvKey(gitUserBaseKey, spec.rawLabel)\n const token = findEnvValue(spec.globalEnvText, tokenKey)\n if (token === null) {\n return Effect.fail(missingSecret(\"Git credentials\", spec.canonicalLabel, spec.globalEnvPath))\n }\n const defaultUser = findEnvValue(spec.globalEnvText, gitUserBaseKey) ?? defaultGitUser\n const user = findEnvValue(spec.globalEnvText, userKey) ?? defaultUser\n const withToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", token)\n const withUser = upsertEnvKey(withToken, \"GIT_AUTH_USER\", user)\n const withGhToken = upsertEnvKey(withUser, \"GH_TOKEN\", token)\n const withGitLabel = upsertEnvKey(withGhToken, projectGitLabelKey, spec.canonicalLabel)\n return Effect.succeed(upsertEnvKey(withGitLabel, projectGithubLabelKey, spec.canonicalLabel))\n}\n\nconst updateProjectGitDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n const withoutToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", \"\")\n const withoutUser = upsertEnvKey(withoutToken, \"GIT_AUTH_USER\", \"\")\n return Effect.succeed(clearProjectGitLabels(withoutUser))\n}\n\nconst updateProjectClaudeConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const accountLabel = normalizeAccountLabel(spec.rawLabel, \"default\")\n const accountPath = `${spec.claudeAuthPath}/${accountLabel}`\n return Effect.gen(function*(_) {\n const exists = yield* _(spec.fs.exists(accountPath))\n if (!exists) {\n return yield* _(Effect.fail(missingSecret(\"Claude Code login\", spec.canonicalLabel, spec.claudeAuthPath)))\n }\n\n const hasCredentials = yield* _(\n hasClaudeAccountCredentials(spec.fs, accountPath),\n Effect.orElseSucceed(() => false)\n )\n if (hasCredentials) {\n return upsertEnvKey(spec.projectEnvText, projectClaudeLabelKey, spec.canonicalLabel)\n }\n\n return yield* _(Effect.fail(missingSecret(\"Claude Code login\", spec.canonicalLabel, spec.claudeAuthPath)))\n })\n}\n\nconst updateProjectClaudeDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n return Effect.succeed(upsertEnvKey(spec.projectEnvText, projectClaudeLabelKey, \"\"))\n}\n\nconst resolveProjectEnvUpdate = (\n flow: ProjectAuthFlow,\n spec: ProjectEnvUpdateSpec\n): Effect.Effect<string, AppError> =>\n Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () => updateProjectGithubConnect(spec)),\n Match.when(\"ProjectGithubDisconnect\", () => updateProjectGithubDisconnect(spec)),\n Match.when(\"ProjectGitConnect\", () => updateProjectGitConnect(spec)),\n Match.when(\"ProjectGitDisconnect\", () => updateProjectGitDisconnect(spec)),\n Match.when(\"ProjectClaudeConnect\", () => updateProjectClaudeConnect(spec)),\n Match.when(\"ProjectClaudeDisconnect\", () => updateProjectClaudeDisconnect(spec)),\n Match.exhaustive\n )\n\nexport const writeProjectAuthFlow = (\n project: ProjectItem,\n flow: ProjectAuthFlow,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n loadProjectAuthEnvText(project),\n Effect.flatMap(({ claudeAuthPath, fs, globalEnvPath, globalEnvText, projectEnvPath, projectEnvText }) => {\n const rawLabel = values[\"label\"] ?? \"\"\n const canonicalLabel = resolveCanonicalLabel(rawLabel)\n const spec: ProjectEnvUpdateSpec = {\n fs,\n rawLabel,\n canonicalLabel,\n globalEnvPath,\n globalEnvText,\n projectEnvText,\n claudeAuthPath\n }\n const nextProjectEnv = resolveProjectEnvUpdate(flow, spec)\n const syncMessage = Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () =>\n `chore(state): project auth gh ${canonicalLabel} ${project.displayName}`),\n Match.when(\"ProjectGithubDisconnect\", () =>\n `chore(state): project auth gh logout ${project.displayName}`),\n Match.when(\n \"ProjectGitConnect\",\n () => `chore(state): project auth git ${canonicalLabel} ${project.displayName}`\n ),\n Match.when(\"ProjectGitDisconnect\", () => `chore(state): project auth git logout ${project.displayName}`),\n Match.when(\n \"ProjectClaudeConnect\",\n () => `chore(state): project auth claude ${canonicalLabel} ${project.displayName}`\n ),\n Match.when(\"ProjectClaudeDisconnect\", () => `chore(state): project auth claude logout ${project.displayName}`),\n Match.exhaustive\n )\n return pipe(\n nextProjectEnv,\n Effect.flatMap((nextText) => fs.writeFileString(projectEnvPath, nextText)),\n Effect.zipRight(autoSyncState(syncMessage))\n )\n }),\n Effect.asVoid\n )\n\nexport const projectAuthViewSteps = (flow: ProjectAuthFlow): ReadonlyArray<ProjectAuthPromptStep> => flowSteps[flow]\n\nexport const projectAuthMenuLabels = (): ReadonlyArray<string> => projectAuthMenuItems.map((item) => item.label)\n\nexport const projectAuthMenuActionByIndex = (index: number): ProjectAuthMenuAction | null => {\n const item = projectAuthMenuItems[index]\n return item ? item.action : null\n}\n\nexport const projectAuthMenuSize = (): number => projectAuthMenuItems.length\n","import { Effect, Match, pipe } from \"effect\"\n\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { handleMenuNumberInput, submitPromptStep } from \"./menu-input-utils.js\"\nimport {\n type ProjectAuthMenuAction,\n projectAuthMenuActionByIndex,\n projectAuthMenuSize,\n projectAuthViewSteps,\n readProjectAuthSnapshot,\n writeProjectAuthFlow\n} from \"./menu-project-auth-data.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport type {\n MenuEnv,\n MenuKeyInput,\n MenuRunner,\n MenuViewContext,\n ProjectAuthFlow,\n ProjectAuthSnapshot,\n ViewState\n} from \"./menu-types.js\"\n\ntype ProjectAuthContext = Pick<MenuViewContext, \"setView\" | \"setMessage\" | \"setActiveDir\"> & {\n readonly runner: MenuRunner\n}\n\ntype ProjectAuthContextWithProject = ProjectAuthContext & {\n readonly project: ProjectItem\n}\n\nconst startProjectAuthMenu = (\n project: ProjectItem,\n snapshot: ProjectAuthSnapshot,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({ _tag: \"ProjectAuthMenu\", selected: 0, project, snapshot })\n context.setMessage(null)\n}\n\nconst startProjectAuthPrompt = (\n project: ProjectItem,\n snapshot: ProjectAuthSnapshot,\n flow: ProjectAuthFlow,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({\n _tag: \"ProjectAuthPrompt\",\n flow,\n step: 0,\n buffer: \"\",\n values: {},\n project,\n snapshot\n })\n context.setMessage(null)\n}\n\nconst loadProjectAuthMenuView = (\n project: ProjectItem,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n readProjectAuthSnapshot(project),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startProjectAuthMenu(project, snapshot, context)\n })\n ),\n Effect.asVoid\n )\n\nconst successMessage = (flow: ProjectAuthFlow, label: string): string =>\n Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () => `Connected GitHub label (${label}) to project.`),\n Match.when(\"ProjectGithubDisconnect\", () => \"Disconnected GitHub from project.\"),\n Match.when(\"ProjectGitConnect\", () => `Connected Git label (${label}) to project.`),\n Match.when(\"ProjectGitDisconnect\", () => \"Disconnected Git from project.\"),\n Match.when(\"ProjectClaudeConnect\", () => `Connected Claude label (${label}) to project.`),\n Match.when(\"ProjectClaudeDisconnect\", () => \"Disconnected Claude from project.\"),\n Match.exhaustive\n )\n\nconst runProjectAuthEffect = (\n project: ProjectItem,\n flow: ProjectAuthFlow,\n values: Readonly<Record<string, string>>,\n label: string,\n context: ProjectAuthContext\n) => {\n context.runner.runEffect(\n pipe(\n writeProjectAuthFlow(project, flow, values),\n Effect.zipRight(readProjectAuthSnapshot(project)),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startProjectAuthMenu(project, snapshot, context)\n context.setMessage(successMessage(flow, label))\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst submitProjectAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n const steps = projectAuthViewSteps(view.flow)\n submitPromptStep(\n view,\n steps,\n context,\n () => {\n startProjectAuthMenu(view.project, view.snapshot, context)\n },\n (nextValues) => {\n const rawLabel = (nextValues[\"label\"] ?? \"\").trim()\n const label = rawLabel.length > 0 ? rawLabel : \"default\"\n runProjectAuthEffect(view.project, view.flow, nextValues, label, context)\n }\n )\n}\n\nconst runProjectAuthAction = (\n action: ProjectAuthMenuAction,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n if (action === \"Back\") {\n resetToMenu(context)\n return\n }\n if (action === \"Refresh\") {\n context.runner.runEffect(loadProjectAuthMenuView(view.project, context))\n return\n }\n\n if (\n action === \"ProjectGithubDisconnect\" || action === \"ProjectGitDisconnect\" || action === \"ProjectClaudeDisconnect\"\n ) {\n runProjectAuthEffect(view.project, action, {}, \"default\", context)\n return\n }\n\n startProjectAuthPrompt(view.project, view.snapshot, action, context)\n}\n\nconst setProjectAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n selected: number,\n context: Pick<MenuViewContext, \"setView\">\n) => {\n context.setView({ ...view, selected })\n}\n\nconst shiftProjectAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n delta: number,\n context: Pick<MenuViewContext, \"setView\">\n) => {\n const menuSize = projectAuthMenuSize()\n const selected = (view.selected + delta + menuSize) % menuSize\n setProjectAuthMenuSelection(view, selected, context)\n}\n\nconst runProjectAuthMenuSelection = (\n selected: number,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n const action = projectAuthMenuActionByIndex(selected)\n if (action === null) {\n return\n }\n runProjectAuthAction(action, view, context)\n}\n\nconst handleProjectAuthMenuNumberInput = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n handleMenuNumberInput(\n input,\n context,\n projectAuthMenuActionByIndex,\n (action) => {\n runProjectAuthAction(action, view, context)\n }\n )\n}\n\nconst handleProjectAuthMenuInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.upArrow) {\n shiftProjectAuthMenuSelection(view, -1, context)\n return\n }\n if (key.downArrow) {\n shiftProjectAuthMenuSelection(view, 1, context)\n return\n }\n if (key.return) {\n runProjectAuthMenuSelection(view.selected, view, context)\n return\n }\n handleProjectAuthMenuNumberInput(input, view, context)\n}\n\ntype SetPromptBufferArgs = {\n readonly input: string\n readonly key: MenuKeyInput\n readonly view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>\n readonly context: Pick<MenuViewContext, \"setView\">\n}\n\nconst setProjectAuthPromptBuffer = (args: SetPromptBufferArgs) => {\n const nextBuffer = nextBufferValue(args.input, args.key, args.view.buffer)\n if (nextBuffer === null) {\n return\n }\n args.context.setView({ ...args.view, buffer: nextBuffer })\n}\n\nconst handleProjectAuthPromptInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n if (key.escape) {\n startProjectAuthMenu(view.project, view.snapshot, context)\n return\n }\n if (key.return) {\n submitProjectAuthPrompt(view, context)\n return\n }\n setProjectAuthPromptBuffer({ input, key, view, context })\n}\n\nexport const openProjectAuthMenu = (context: ProjectAuthContextWithProject): void => {\n context.setMessage(`Loading project auth (${context.project.displayName})...`)\n context.runner.runEffect(loadProjectAuthMenuView(context.project, context))\n}\n\nexport const handleProjectAuthInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" | \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n if (view._tag === \"ProjectAuthMenu\") {\n handleProjectAuthMenuInput(input, key, view, context)\n return\n }\n handleProjectAuthPromptInput(input, key, view, context)\n}\n","import { Effect } from \"effect\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\ntype ConnectDeps<E, R> = {\n readonly connectWithUp: (\n item: ProjectItem\n ) => Effect.Effect<void, E, R>\n readonly enableMcpPlaywright: (\n projectDir: string\n ) => Effect.Effect<void, E, R>\n}\n\nconst normalizedInput = (input: string): string => input.trim().toLowerCase()\n\nexport const isConnectMcpToggleInput = (input: string): boolean => normalizedInput(input) === \"p\"\n\nexport const buildConnectEffect = <E, R>(\n selected: ProjectItem,\n enableMcpPlaywright: boolean,\n deps: ConnectDeps<E, R>\n): Effect.Effect<void, E, R> =>\n enableMcpPlaywright\n ? deps.enableMcpPlaywright(selected.projectDir).pipe(\n Effect.zipRight(deps.connectWithUp(selected))\n )\n : deps.connectWithUp(selected)\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport type { SelectProjectRuntime } from \"./menu-types.js\"\n\nconst defaultRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst runtimeForSort = (\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n item: ProjectItem\n): SelectProjectRuntime => runtimeByProject[item.projectDir] ?? defaultRuntime()\n\nconst startedAtEpochForSort = (runtime: SelectProjectRuntime): number =>\n runtime.startedAtEpochMs ?? Number.NEGATIVE_INFINITY\n\nexport const sortItemsByLaunchTime = (\n items: ReadonlyArray<ProjectItem>,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): ReadonlyArray<ProjectItem> =>\n items.toSorted((left, right) => {\n const leftRuntime = runtimeForSort(runtimeByProject, left)\n const rightRuntime = runtimeForSort(runtimeByProject, right)\n const leftStartedAt = startedAtEpochForSort(leftRuntime)\n const rightStartedAt = startedAtEpochForSort(rightRuntime)\n\n if (leftStartedAt !== rightStartedAt) {\n return rightStartedAt - leftStartedAt\n }\n if (leftRuntime.running !== rightRuntime.running) {\n return leftRuntime.running ? -1 : 1\n }\n return left.displayName.localeCompare(right.displayName)\n })\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport { sortItemsByLaunchTime } from \"./menu-select-order.js\"\nimport type { MenuViewContext, SelectProjectRuntime } from \"./menu-types.js\"\n\nconst emptyRuntimeByProject = (): Readonly<Record<string, SelectProjectRuntime>> => ({})\n\nexport const startSelectView = (\n items: ReadonlyArray<ProjectItem>,\n purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\",\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>> = emptyRuntimeByProject()\n) => {\n const sortedItems = sortItemsByLaunchTime(items, runtimeByProject)\n context.setMessage(null)\n context.setView({\n _tag: \"SelectProject\",\n purpose,\n items: sortedItems,\n runtimeByProject,\n selected: 0,\n confirmDelete: false,\n connectEnableMcpPlaywright: false\n })\n}\n","import { runDockerComposeDown } from \"@effect-template/lib/shell/docker\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport { mcpPlaywrightUp } from \"@effect-template/lib/usecases/mcp-playwright\"\nimport {\n connectProjectSshWithUp,\n deleteDockerGitProject,\n listRunningProjectItems,\n type ProjectItem\n} from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport { openProjectAuthMenu } from \"./menu-project-auth.js\"\nimport { buildConnectEffect } from \"./menu-select-connect.js\"\nimport { loadRuntimeByProject } from \"./menu-select-runtime.js\"\nimport { startSelectView } from \"./menu-select-view.js\"\nimport {\n pauseOnError,\n resetToMenu,\n resumeSshWithSkipInputs,\n resumeWithSkipInputs,\n withSuspendedTui\n} from \"./menu-shared.js\"\nimport type { MenuRunner, MenuViewContext } from \"./menu-types.js\"\n\nexport type SelectContext = MenuViewContext & {\n readonly activeDir: string | null\n readonly runner: MenuRunner\n readonly setSshActive: (active: boolean) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\nexport const runConnectSelection = (\n selected: ProjectItem,\n context: SelectContext,\n enableMcpPlaywright: boolean\n) => {\n context.setMessage(\n enableMcpPlaywright\n ? `Enabling Playwright MCP for ${selected.displayName}, then connecting...`\n : `Connecting to ${selected.displayName}...`\n )\n context.setSshActive(true)\n context.runner.runEffect(\n pipe(\n withSuspendedTui(\n buildConnectEffect(selected, enableMcpPlaywright, {\n connectWithUp: (item) =>\n connectProjectSshWithUp(item).pipe(\n Effect.mapError((error): AppError => error)\n ),\n enableMcpPlaywright: (projectDir) =>\n mcpPlaywrightUp({ _tag: \"McpPlaywrightUp\", projectDir, runUp: false }).pipe(\n Effect.asVoid,\n Effect.mapError((error): AppError => error)\n )\n }),\n {\n onError: pauseOnError(renderError),\n onResume: resumeSshWithSkipInputs(context)\n }\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(\"SSH session ended. Press Esc to return to the menu.\")\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nexport const runDownSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Stopping ${selected.displayName}...`)\n context.runner.runEffect(\n withSuspendedTui(\n pipe(\n runDockerComposeDown(selected.projectDir),\n Effect.zipRight(listRunningProjectItems),\n Effect.flatMap((items) =>\n pipe(\n loadRuntimeByProject(items),\n Effect.map((runtimeByProject) => ({ items, runtimeByProject }))\n )\n ),\n Effect.tap(({ items, runtimeByProject }) =>\n Effect.sync(() => {\n if (items.length === 0) {\n resetToMenu(context)\n context.setMessage(\"No running docker-git containers.\")\n return\n }\n startSelectView(items, \"Down\", context, runtimeByProject)\n context.setMessage(\"Container stopped. Select another to stop, or Esc to return.\")\n })\n ),\n Effect.asVoid\n ),\n {\n onError: pauseOnError(renderError),\n onResume: resumeWithSkipInputs(context)\n }\n )\n )\n}\n\nexport const runInfoSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Details for ${selected.displayName} are shown on the right. Press Esc to return to the menu.`)\n}\n\nexport const runAuthSelection = (selected: ProjectItem, context: SelectContext) => {\n openProjectAuthMenu({\n project: selected,\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nexport const runDeleteSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Deleting ${selected.displayName}...`)\n context.runner.runEffect(\n pipe(\n withSuspendedTui(\n deleteDockerGitProject(selected).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n if (context.activeDir === selected.projectDir) {\n context.setActiveDir(null)\n }\n context.setView({ _tag: \"Menu\" })\n })\n ),\n Effect.asVoid\n ),\n {\n onError: pauseOnError(renderError),\n onResume: resumeWithSkipInputs(context)\n }\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(\"Project deleted.\")\n })\n ),\n Effect.asVoid\n )\n )\n}\n","import { Match } from \"effect\"\n\nimport {\n runAuthSelection,\n runConnectSelection,\n runDeleteSelection,\n runDownSelection,\n runInfoSelection,\n type SelectContext\n} from \"./menu-select-actions.js\"\nimport { isConnectMcpToggleInput } from \"./menu-select-connect.js\"\nimport { runtimeForSelection } from \"./menu-select-runtime.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport type { MenuKeyInput, ViewState } from \"./menu-types.js\"\n\nexport { startSelectView } from \"./menu-select-view.js\"\n\nconst clampIndex = (value: number, size: number): number => {\n if (size <= 0) {\n return 0\n }\n if (value < 0) {\n return 0\n }\n if (value >= size) {\n return size - 1\n }\n return value\n}\n\nexport const handleSelectInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (handleConnectOptionToggle(input, view, context)) {\n return\n }\n if (handleSelectNavigation(key, view, context)) {\n return\n }\n if (key.return) {\n handleSelectReturn(view, context)\n return\n }\n if (input.trim().length > 0) {\n context.setMessage(\"Use arrows + Enter to select a project, Esc to cancel.\")\n }\n}\n\nconst handleConnectOptionToggle = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: Pick<SelectContext, \"setView\" | \"setMessage\">\n): boolean => {\n if (view.purpose !== \"Connect\" || !isConnectMcpToggleInput(input)) {\n return false\n }\n const nextValue = !view.connectEnableMcpPlaywright\n context.setView({ ...view, connectEnableMcpPlaywright: nextValue, confirmDelete: false })\n context.setMessage(\n nextValue\n ? \"Playwright MCP will be enabled before SSH (press Enter to connect).\"\n : \"Playwright MCP toggle is OFF (press Enter to connect without changes).\"\n )\n return true\n}\n\nconst handleSelectNavigation = (\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n): boolean => {\n if (key.upArrow) {\n const next = clampIndex(view.selected - 1, view.items.length)\n context.setView({ ...view, selected: next, confirmDelete: false })\n return true\n }\n if (key.downArrow) {\n const next = clampIndex(view.selected + 1, view.items.length)\n context.setView({ ...view, selected: next, confirmDelete: false })\n return true\n }\n return false\n}\n\nconst formatSshSessionsLabel = (sshSessions: number): string =>\n sshSessions === 1 ? \"1 active SSH session\" : `${sshSessions} active SSH sessions`\n\nconst handleSelectReturn = (\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n) => {\n const selected = view.items[view.selected]\n if (!selected) {\n context.setMessage(\"No project selected.\")\n resetToMenu(context)\n return\n }\n const selectedRuntime = runtimeForSelection(view, selected)\n const sshSessionsLabel = formatSshSessionsLabel(selectedRuntime.sshSessions)\n\n Match.value(view.purpose).pipe(\n Match.when(\"Connect\", () => {\n context.setActiveDir(selected.projectDir)\n runConnectSelection(selected, context, view.connectEnableMcpPlaywright)\n }),\n Match.when(\"Auth\", () => {\n context.setActiveDir(selected.projectDir)\n runAuthSelection(selected, context)\n }),\n Match.when(\"Down\", () => {\n if (selectedRuntime.sshSessions > 0 && !view.confirmDelete) {\n context.setMessage(\n `${selected.containerName} has ${sshSessionsLabel}. Press Enter again to stop, Esc to cancel.`\n )\n context.setView({ ...view, confirmDelete: true })\n return\n }\n context.setActiveDir(selected.projectDir)\n runDownSelection(selected, context)\n }),\n Match.when(\"Info\", () => {\n context.setActiveDir(selected.projectDir)\n runInfoSelection(selected, context)\n }),\n Match.when(\"Delete\", () => {\n if (!view.confirmDelete) {\n const activeSshWarning = selectedRuntime.sshSessions > 0 ? ` ${sshSessionsLabel}.` : \"\"\n context.setMessage(\n `Really delete ${selected.displayName}?${activeSshWarning} Press Enter again to confirm, Esc to cancel.`\n )\n context.setView({ ...view, confirmDelete: true })\n return\n }\n runDeleteSelection(selected, context)\n }),\n Match.exhaustive\n )\n}\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport { loadRuntimeByProject } from \"./menu-select-runtime.js\"\nimport { startSelectView } from \"./menu-select.js\"\nimport type { MenuEnv, MenuViewContext } from \"./menu-types.js\"\n\nexport const loadSelectView = <E>(\n effect: Effect.Effect<ReadonlyArray<ProjectItem>, E, MenuEnv>,\n purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\",\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, E, MenuEnv> =>\n pipe(\n effect,\n Effect.flatMap((items) =>\n pipe(\n loadRuntimeByProject(items),\n Effect.flatMap((runtimeByProject) =>\n Effect.sync(() => {\n if (items.length === 0) {\n context.setMessage(\n purpose === \"Down\"\n ? \"No running docker-git containers.\"\n : \"No docker-git projects found.\"\n )\n return\n }\n startSelectView(items, purpose, context, runtimeByProject)\n })\n )\n )\n )\n )\n","import { type MenuAction, type ProjectConfig } from \"@effect-template/lib/core/domain\"\nimport { readProjectConfig } from \"@effect-template/lib/shell/config\"\nimport { runDockerComposeDown, runDockerComposeLogs, runDockerComposePs } from \"@effect-template/lib/shell/docker\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport {\n downAllDockerGitProjects,\n listProjectItems,\n listProjectStatus,\n listRunningProjectItems\n} from \"@effect-template/lib/usecases/projects\"\nimport { gcProjectNetworkByTemplate } from \"@effect-template/lib/usecases/docker-network-gc\"\nimport { runDockerComposeUpWithPortCheck } from \"@effect-template/lib/usecases/projects-up\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { openAuthMenu } from \"./menu-auth.js\"\nimport { startCreateView } from \"./menu-create.js\"\nimport { loadSelectView } from \"./menu-select-load.js\"\nimport { withSuspendedTui, writeErrorAndPause } from \"./menu-shared.js\"\nimport { type MenuEnv, type MenuRunner, type MenuState, type MenuViewContext } from \"./menu-types.js\"\n\n// CHANGE: keep menu actions and input parsing in a dedicated module\n// WHY: reduce cognitive complexity in the TUI entry\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall a: action(a) -> effect(a)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, MenuEnv>\n// INVARIANT: menu selection runs exactly one action\n// COMPLEXITY: O(1) per keypress\n\nconst continueOutcome = (state: MenuState): { readonly _tag: \"Continue\"; readonly state: MenuState } => ({\n _tag: \"Continue\",\n state\n})\n\nconst quitOutcome: { readonly _tag: \"Quit\" } = { _tag: \"Quit\" }\n\nexport type MenuContext = {\n readonly state: MenuState\n readonly runner: MenuRunner\n readonly exit: () => void\n} & MenuViewContext\n\nexport type MenuSelectionContext = MenuContext & {\n readonly selected: number\n readonly setSelected: (update: (value: number) => number) => void\n}\n\nconst actionLabel = (action: MenuAction): string =>\n Match.value(action).pipe(\n Match.when({ _tag: \"Auth\" }, () => \"Auth profiles\"),\n Match.when({ _tag: \"ProjectAuth\" }, () => \"Project auth\"),\n Match.when({ _tag: \"Up\" }, () => \"docker compose up\"),\n Match.when({ _tag: \"Status\" }, () => \"docker compose ps\"),\n Match.when({ _tag: \"Logs\" }, () => \"docker compose logs\"),\n Match.when({ _tag: \"Down\" }, () => \"docker compose down\"),\n Match.when({ _tag: \"DownAll\" }, () => \"docker compose down (all projects)\"),\n Match.orElse(() => \"action\")\n )\n\nconst runWithSuspendedTui = (\n effect: Effect.Effect<void, AppError, MenuEnv>,\n context: MenuContext,\n label: string\n) => {\n context.runner.runEffect(\n pipe(\n Effect.sync(() => {\n context.setMessage(`${label}...`)\n }),\n Effect.zipRight(withSuspendedTui(effect, { onError: (error) => writeErrorAndPause(renderError(error)) })),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(`${label} finished.`)\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst requireActiveProject = (context: MenuContext): boolean => {\n if (context.state.activeDir) {\n return true\n }\n context.setMessage(\n \"No active project. Use Create or paste a repo URL to set one before running this action.\"\n )\n return false\n}\n\nconst handleMissingConfig = (\n state: MenuState,\n setMessage: (message: string | null) => void,\n error: AppError\n) =>\n pipe(\n Effect.sync(() => {\n setMessage(renderError(error))\n }),\n Effect.as(continueOutcome(state))\n )\n\nconst withProjectConfig = <R>(\n state: MenuState,\n setMessage: (message: string | null) => void,\n f: (config: ProjectConfig) => Effect.Effect<void, AppError, R>\n) =>\n pipe(\n readProjectConfig(state.activeDir ?? state.cwd),\n Effect.matchEffect({\n onFailure: (error) =>\n error._tag === \"ConfigNotFoundError\" || error._tag === \"ConfigDecodeError\"\n ? handleMissingConfig(state, setMessage, error)\n : Effect.fail(error),\n onSuccess: (config) =>\n pipe(\n f(config),\n Effect.as(continueOutcome(state))\n )\n })\n )\n\nconst handleMenuAction = (\n state: MenuState,\n setMessage: (message: string | null) => void,\n action: MenuAction\n): Effect.Effect<\n { readonly _tag: \"Continue\"; readonly state: MenuState } | { readonly _tag: \"Quit\" },\n AppError,\n MenuEnv\n> =>\n Match.value(action).pipe(\n Match.when({ _tag: \"Quit\" }, () => Effect.succeed(quitOutcome)),\n Match.when({ _tag: \"Create\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Select\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Auth\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"ProjectAuth\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Info\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Delete\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Up\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposeUpWithPortCheck(state.activeDir ?? state.cwd).pipe(Effect.asVoid))),\n Match.when({ _tag: \"Status\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposePs(state.activeDir ?? state.cwd))),\n Match.when({ _tag: \"Logs\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposeLogs(state.activeDir ?? state.cwd))),\n Match.when({ _tag: \"Down\" }, () =>\n withProjectConfig(state, setMessage, (config) =>\n runDockerComposeDown(state.activeDir ?? state.cwd).pipe(\n Effect.zipRight(gcProjectNetworkByTemplate(state.activeDir ?? state.cwd, config.template))\n ))),\n Match.when({ _tag: \"DownAll\" }, () =>\n pipe(\n downAllDockerGitProjects,\n Effect.as(continueOutcome(state))\n )),\n Match.exhaustive\n )\n\nconst runCreateAction = (context: MenuContext) => {\n startCreateView(context.setView, context.setMessage)\n}\n\nconst runSelectAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Connect\", context))\n}\n\nconst runAuthProfilesAction = (context: MenuContext) => {\n context.setMessage(null)\n openAuthMenu({\n state: context.state,\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst runProjectAuthAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Auth\", context))\n}\n\nconst runDownAllAction = (context: MenuContext) => {\n context.setMessage(null)\n runWithSuspendedTui(downAllDockerGitProjects, context, \"Stopping all docker-git containers\")\n}\n\nconst runDownAction = (context: MenuContext, action: MenuAction) => {\n context.setMessage(null)\n if (context.state.activeDir === null) {\n context.runner.runEffect(loadSelectView(listRunningProjectItems, \"Down\", context))\n return\n }\n runComposeAction(action, context)\n}\n\nconst runInfoAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Info\", context))\n}\n\nconst runDeleteAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Delete\", context))\n}\n\nconst runComposeAction = (action: MenuAction, context: MenuContext) => {\n if (action._tag === \"Status\" && context.state.activeDir === null) {\n runWithSuspendedTui(listProjectStatus, context, \"docker compose ps (all projects)\")\n return\n }\n if (!requireActiveProject(context)) {\n return\n }\n const effect = pipe(handleMenuAction(context.state, context.setMessage, action), Effect.asVoid)\n runWithSuspendedTui(effect, context, actionLabel(action))\n}\n\nconst runQuitAction = (context: MenuContext, action: MenuAction) => {\n context.runner.runEffect(\n pipe(handleMenuAction(context.state, context.setMessage, action), Effect.asVoid)\n )\n context.exit()\n}\n\nexport const handleMenuActionSelection = (action: MenuAction, context: MenuContext) => {\n Match.value(action).pipe(\n Match.when({ _tag: \"Create\" }, () => {\n runCreateAction(context)\n }),\n Match.when({ _tag: \"Select\" }, () => {\n runSelectAction(context)\n }),\n Match.when({ _tag: \"Auth\" }, () => {\n runAuthProfilesAction(context)\n }),\n Match.when({ _tag: \"ProjectAuth\" }, () => {\n runProjectAuthAction(context)\n }),\n Match.when({ _tag: \"Info\" }, () => {\n runInfoAction(context)\n }),\n Match.when({ _tag: \"Delete\" }, () => {\n runDeleteAction(context)\n }),\n Match.when({ _tag: \"Up\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Status\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Logs\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Down\" }, (selected) => {\n runDownAction(context, selected)\n }),\n Match.when({ _tag: \"DownAll\" }, () => {\n runDownAllAction(context)\n }),\n Match.when({ _tag: \"Quit\" }, (selected) => {\n runQuitAction(context, selected)\n }),\n Match.exhaustive\n )\n}\n","import { parseMenuSelection } from \"@effect-template/lib/core/domain\"\nimport { isRepoUrlInput } from \"@effect-template/lib/usecases/menu-helpers\"\nimport { Either } from \"effect\"\n\nimport { handleMenuActionSelection, type MenuSelectionContext } from \"./menu-actions.js\"\nimport { startCreateView } from \"./menu-create.js\"\nimport { menuItems } from \"./menu-types.js\"\n\nconst handleMenuNavigation = (\n key: { readonly upArrow?: boolean; readonly downArrow?: boolean },\n setSelected: (update: (value: number) => number) => void\n) => {\n if (key.upArrow) {\n setSelected((prev) => (prev === 0 ? menuItems.length - 1 : prev - 1))\n return\n }\n if (key.downArrow) {\n setSelected((prev) => (prev === menuItems.length - 1 ? 0 : prev + 1))\n }\n}\n\nconst handleMenuEnter = (context: MenuSelectionContext) => {\n const action = menuItems[context.selected]?.id\n if (!action) {\n return\n }\n handleMenuActionSelection(action, context)\n}\n\nconst handleMenuTextInput = (input: string, context: MenuSelectionContext): boolean => {\n const trimmed = input.trim()\n if (trimmed.length > 0 && isRepoUrlInput(trimmed)) {\n startCreateView(context.setView, context.setMessage, trimmed)\n return true\n }\n const selection = parseMenuSelection(input)\n if (Either.isRight(selection)) {\n handleMenuActionSelection(selection.right, context)\n return true\n }\n return false\n}\n\nexport const handleMenuInput = (\n input: string,\n key: { readonly upArrow?: boolean; readonly downArrow?: boolean; readonly return?: boolean },\n context: MenuSelectionContext\n) => {\n if (key.upArrow || key.downArrow) {\n handleMenuNavigation(key, context.setSelected)\n return\n }\n if (key.return) {\n handleMenuEnter(context)\n return\n }\n handleMenuTextInput(input, context)\n}\n","import { handleAuthInput } from \"./menu-auth.js\"\nimport { handleCreateInput } from \"./menu-create.js\"\nimport { handleMenuInput } from \"./menu-menu.js\"\nimport { handleProjectAuthInput } from \"./menu-project-auth.js\"\nimport { handleSelectInput } from \"./menu-select.js\"\nimport type { MenuKeyInput, MenuRunner, MenuState, MenuViewContext, ViewState } from \"./menu-types.js\"\n\nexport type InputStage = \"cold\" | \"active\"\n\nexport type MenuInputContext = MenuViewContext & {\n readonly busy: boolean\n readonly view: ViewState\n readonly inputStage: InputStage\n readonly setInputStage: (stage: InputStage) => void\n readonly selected: number\n readonly setSelected: (update: (value: number) => number) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n readonly sshActive: boolean\n readonly setSshActive: (active: boolean) => void\n readonly state: MenuState\n readonly runner: MenuRunner\n readonly exit: () => void\n}\n\ntype ActiveView = Exclude<ViewState, { readonly _tag: \"Menu\" }>\n\nconst activateInput = (\n input: string,\n key: Pick<MenuKeyInput, \"upArrow\" | \"downArrow\" | \"return\">,\n context: Pick<MenuInputContext, \"inputStage\" | \"setInputStage\">\n): { readonly activated: boolean; readonly allowProcessing: boolean } => {\n if (context.inputStage === \"active\") {\n return { activated: false, allowProcessing: true }\n }\n\n if (input.trim().length > 0) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: true }\n }\n\n if (key.upArrow || key.downArrow || key.return) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: false }\n }\n\n if (input.length > 0) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: true }\n }\n\n return { activated: false, allowProcessing: false }\n}\n\nconst shouldHandleMenuInput = (\n input: string,\n key: Pick<MenuKeyInput, \"upArrow\" | \"downArrow\" | \"return\">,\n context: Pick<MenuInputContext, \"inputStage\" | \"setInputStage\">\n): boolean => {\n const activation = activateInput(input, key, context)\n if (activation.activated && !activation.allowProcessing) {\n return false\n }\n return activation.allowProcessing\n}\n\nconst handleMenuViewInput = (\n input: string,\n key: MenuKeyInput,\n context: MenuInputContext\n) => {\n if (!shouldHandleMenuInput(input, key, context)) {\n return\n }\n handleMenuInput(input, key, {\n selected: context.selected,\n setSelected: context.setSelected,\n state: context.state,\n runner: context.runner,\n exit: context.exit,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleCreateViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"Create\" }>,\n context: MenuInputContext\n) => {\n handleCreateInput(input, key, view, {\n state: context.state,\n setView: context.setView,\n setMessage: context.setMessage,\n runner: context.runner,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleAuthViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" | \"AuthPrompt\" }>,\n context: MenuInputContext\n) => {\n handleAuthInput(input, key, view, {\n state: context.state,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir,\n runner: context.runner,\n setSshActive: context.setSshActive,\n setSkipInputs: context.setSkipInputs\n })\n}\n\nconst handleProjectAuthViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" | \"ProjectAuthPrompt\" }>,\n context: MenuInputContext\n) => {\n handleProjectAuthInput(input, key, view, {\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleSelectViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: MenuInputContext\n) => {\n handleSelectInput(input, key, view, {\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir,\n activeDir: context.state.activeDir,\n runner: context.runner,\n setSshActive: context.setSshActive,\n setSkipInputs: context.setSkipInputs\n })\n}\n\nconst handleActiveViewInput = (\n input: string,\n key: MenuKeyInput,\n view: ActiveView,\n context: MenuInputContext\n) => {\n if (view._tag === \"Create\") {\n handleCreateViewInput(input, key, view, context)\n return\n }\n if (view._tag === \"AuthMenu\" || view._tag === \"AuthPrompt\") {\n handleAuthViewInput(input, key, view, context)\n return\n }\n if (view._tag === \"ProjectAuthMenu\" || view._tag === \"ProjectAuthPrompt\") {\n handleProjectAuthViewInput(input, key, view, context)\n return\n }\n handleSelectViewInput(input, key, view, context)\n}\n\nexport const handleUserInput = (\n input: string,\n key: MenuKeyInput,\n context: MenuInputContext\n) => {\n if (context.busy || context.sshActive) {\n return\n }\n if (context.view._tag === \"Menu\") {\n handleMenuViewInput(input, key, context)\n return\n }\n handleActiveViewInput(input, key, context.view, context)\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nconst renderMessage = (message: string | null): React.ReactElement | null => {\n if (!message) {\n return null\n }\n return React.createElement(\n Box,\n { marginTop: 1 },\n React.createElement(Text, { color: \"magenta\" }, message)\n )\n}\n\nexport const renderLayout = (\n title: string,\n body: ReadonlyArray<React.ReactElement>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const messageView = renderMessage(message)\n const tail = messageView ? [messageView] : []\n return el(\n Box,\n { flexDirection: \"column\", padding: 1, borderStyle: \"round\" },\n el(Text, { color: \"cyan\", bold: true }, title),\n ...body,\n ...tail\n )\n}\n","import { Match } from \"effect\"\nimport { Text } from \"ink\"\nimport type React from \"react\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport type { SelectProjectRuntime } from \"./menu-types.js\"\n\nexport type SelectPurpose = \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\"\n\nconst formatRepoRef = (repoRef: string): string => {\n const trimmed = repoRef.trim()\n const prPrefix = \"refs/pull/\"\n if (trimmed.startsWith(prPrefix)) {\n const rest = trimmed.slice(prPrefix.length)\n const number = rest.split(\"/\")[0] ?? rest\n return `PR#${number}`\n }\n return trimmed.length > 0 ? trimmed : \"main\"\n}\n\nconst stoppedRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst pad2 = (value: number): string => value.toString().padStart(2, \"0\")\n\nconst formatUtcTimestamp = (epochMs: number, withSeconds: boolean): string => {\n const date = new Date(epochMs)\n const seconds = withSeconds ? `:${pad2(date.getUTCSeconds())}` : \"\"\n return `${date.getUTCFullYear()}-${pad2(date.getUTCMonth() + 1)}-${pad2(date.getUTCDate())} ${\n pad2(\n date.getUTCHours()\n )\n }:${pad2(date.getUTCMinutes())}${seconds} UTC`\n}\n\nconst renderStartedAtCompact = (runtime: SelectProjectRuntime): string =>\n runtime.startedAtEpochMs === null ? \"-\" : formatUtcTimestamp(runtime.startedAtEpochMs, false)\n\nconst renderStartedAtDetailed = (runtime: SelectProjectRuntime): string =>\n runtime.startedAtEpochMs === null ? \"not available\" : formatUtcTimestamp(runtime.startedAtEpochMs, true)\n\nconst runtimeForProject = (\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n item: ProjectItem\n): SelectProjectRuntime => runtimeByProject[item.projectDir] ?? stoppedRuntime()\n\nconst renderRuntimeLabel = (runtime: SelectProjectRuntime): string =>\n `${runtime.running ? \"running\" : \"stopped\"}, ssh=${runtime.sshSessions}, started=${\n renderStartedAtCompact(\n runtime\n )\n }`\n\nexport const selectTitle = (purpose: SelectPurpose): string =>\n Match.value(purpose).pipe(\n Match.when(\"Connect\", () => \"docker-git / Select project\"),\n Match.when(\"Auth\", () => \"docker-git / Project auth\"),\n Match.when(\"Down\", () => \"docker-git / Stop container\"),\n Match.when(\"Info\", () => \"docker-git / Show connection info\"),\n Match.when(\"Delete\", () => \"docker-git / Delete project\"),\n Match.exhaustive\n )\n\nexport const selectHint = (\n purpose: SelectPurpose,\n connectEnableMcpPlaywright: boolean\n): string =>\n Match.value(purpose).pipe(\n Match.when(\n \"Connect\",\n () => `Enter = select + SSH, P = toggle Playwright MCP (${connectEnableMcpPlaywright ? \"on\" : \"off\"}), Esc = back`\n ),\n Match.when(\"Auth\", () => \"Enter = open project auth menu, Esc = back\"),\n Match.when(\"Down\", () => \"Enter = stop container, Esc = back\"),\n Match.when(\"Info\", () => \"Use arrows to browse details, Enter = set active, Esc = back\"),\n Match.when(\"Delete\", () => \"Enter = ask/confirm delete, Esc = cancel\"),\n Match.exhaustive\n )\n\nexport const buildSelectLabels = (\n items: ReadonlyArray<ProjectItem>,\n selected: number,\n purpose: SelectPurpose,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): ReadonlyArray<string> =>\n items.map((item, index) => {\n const prefix = index === selected ? \">\" : \" \"\n const refLabel = formatRepoRef(item.repoRef)\n const runtime = runtimeForProject(runtimeByProject, item)\n const runtimeSuffix = purpose === \"Down\" || purpose === \"Delete\"\n ? ` [${renderRuntimeLabel(runtime)}]`\n : ` [started=${renderStartedAtCompact(runtime)}]`\n return `${prefix} ${index + 1}. ${item.displayName} (${refLabel})${runtimeSuffix}`\n })\n\nexport type SelectListWindow = {\n readonly start: number\n readonly end: number\n}\n\nexport const buildSelectListWindow = (\n total: number,\n selected: number,\n maxVisible: number\n): SelectListWindow => {\n if (total <= 0) {\n return { start: 0, end: 0 }\n }\n const visible = Math.max(1, maxVisible)\n if (total <= visible) {\n return { start: 0, end: total }\n }\n const boundedSelected = Math.min(Math.max(selected, 0), total - 1)\n const half = Math.floor(visible / 2)\n const maxStart = total - visible\n const start = Math.min(Math.max(boundedSelected - half, 0), maxStart)\n return { start, end: start + visible }\n}\n\ntype SelectDetailsContext = {\n readonly item: ProjectItem\n readonly refLabel: string\n readonly authSuffix: string\n readonly runtime: SelectProjectRuntime\n readonly sshSessionsLabel: string\n}\n\nconst buildDetailsContext = (\n item: ProjectItem,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): SelectDetailsContext => {\n const runtime = runtimeForProject(runtimeByProject, item)\n return {\n item,\n refLabel: formatRepoRef(item.repoRef),\n authSuffix: item.authorizedKeysExists ? \"\" : \" (missing)\",\n runtime,\n sshSessionsLabel: runtime.sshSessions === 1\n ? \"1 active SSH session\"\n : `${runtime.sshSessions} active SSH sessions`\n }\n}\n\nconst titleRow = (el: typeof React.createElement, value: string): React.ReactElement =>\n el(Text, { color: \"cyan\", bold: true, wrap: \"truncate\" }, value)\n\nconst commonRows = (\n el: typeof React.createElement,\n context: SelectDetailsContext\n): ReadonlyArray<React.ReactElement> => [\n el(Text, { wrap: \"wrap\" }, `Project directory: ${context.item.projectDir}`),\n el(Text, { wrap: \"wrap\" }, `Container: ${context.item.containerName}`),\n el(Text, { wrap: \"wrap\" }, `State: ${context.runtime.running ? \"running\" : \"stopped\"}`),\n el(Text, { wrap: \"wrap\" }, `Started at: ${renderStartedAtDetailed(context.runtime)}`),\n el(Text, { wrap: \"wrap\" }, `SSH sessions now: ${context.sshSessionsLabel}`)\n]\n\nconst renderInfoDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext,\n common: ReadonlyArray<React.ReactElement>\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Connection info\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Service: ${context.item.serviceName}`),\n el(Text, { wrap: \"wrap\" }, `SSH command: ${context.item.sshCommand}`),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `Workspace: ${context.item.targetDir}`),\n el(Text, { wrap: \"wrap\" }, `Authorized keys: ${context.item.authorizedKeysPath}${context.authSuffix}`),\n el(Text, { wrap: \"wrap\" }, `Env global: ${context.item.envGlobalPath}`),\n el(Text, { wrap: \"wrap\" }, `Env project: ${context.item.envProjectPath}`),\n el(Text, { wrap: \"wrap\" }, `Codex auth: ${context.item.codexAuthPath} -> ${context.item.codexHome}`)\n]\n\nconst renderDefaultDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Details\"),\n el(Text, { wrap: \"truncate\" }, `Repo: ${context.item.repoUrl}`),\n el(Text, { wrap: \"truncate\" }, `Ref: ${context.item.repoRef}`),\n el(Text, { wrap: \"truncate\" }, `Project dir: ${context.item.projectDir}`),\n el(Text, { wrap: \"truncate\" }, `Workspace: ${context.item.targetDir}`),\n el(Text, { wrap: \"truncate\" }, `SSH: ${context.item.sshCommand}`)\n]\n\nconst renderConnectDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext,\n common: ReadonlyArray<React.ReactElement>,\n connectEnableMcpPlaywright: boolean\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Connect + SSH\"),\n ...common,\n el(\n Text,\n { color: connectEnableMcpPlaywright ? \"green\" : \"gray\", wrap: \"wrap\" },\n connectEnableMcpPlaywright\n ? \"Playwright MCP: will be enabled before SSH (P to disable).\"\n : \"Playwright MCP: keep current project setting (P to enable before SSH).\"\n ),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `SSH command: ${context.item.sshCommand}`)\n]\n\nexport const renderSelectDetails = (\n el: typeof React.createElement,\n purpose: SelectPurpose,\n item: ProjectItem | undefined,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n connectEnableMcpPlaywright: boolean\n): ReadonlyArray<React.ReactElement> => {\n if (!item) {\n return [el(Text, { color: \"gray\", wrap: \"truncate\" }, \"No project selected.\")]\n }\n const context = buildDetailsContext(item, runtimeByProject)\n const common = commonRows(el, context)\n\n return Match.value(purpose).pipe(\n Match.when(\"Connect\", () => renderConnectDetails(el, context, common, connectEnableMcpPlaywright)),\n Match.when(\"Auth\", () => [\n titleRow(el, \"Project auth\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `Env global: ${context.item.envGlobalPath}`),\n el(Text, { wrap: \"wrap\" }, `Env project: ${context.item.envProjectPath}`),\n el(Text, { color: \"gray\", wrap: \"wrap\" }, \"Press Enter to manage labels for this project.\")\n ]),\n Match.when(\"Info\", () => renderInfoDetails(el, context, common)),\n Match.when(\"Down\", () => [\n titleRow(el, \"Stop container\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`)\n ]),\n Match.when(\"Delete\", () => [\n titleRow(el, \"Delete project\"),\n ...common,\n context.runtime.sshSessions > 0\n ? el(Text, { color: \"yellow\", wrap: \"wrap\" }, \"Warning: project has active SSH sessions.\")\n : el(Text, { color: \"gray\", wrap: \"wrap\" }, \"No active SSH sessions detected.\"),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, \"Removes project folder and runs docker compose down -v.\")\n ]),\n Match.orElse(() => renderDefaultDetails(el, context))\n )\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { renderLayout } from \"./menu-render-layout.js\"\n\nexport const renderSelectableMenuList = (\n labels: ReadonlyArray<string>,\n selected: number\n): ReadonlyArray<React.ReactElement> => {\n const el = React.createElement\n return labels.map((label, index) =>\n el(\n Text,\n { key: `${index}-${label}`, color: index === selected ? \"green\" : \"white\" },\n `${index === selected ? \">\" : \" \"} ${index + 1}) ${label}`\n )\n )\n}\n\nexport const renderMenuHelp = (primaryLine: string): React.ReactElement => {\n const el = React.createElement\n return el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, primaryLine),\n el(Text, { color: \"gray\" }, \"Esc returns to the main menu.\")\n )\n}\n\ntype PromptStepLike = {\n readonly label: string\n readonly secret: boolean\n}\n\nexport const resolvePromptState = (\n steps: ReadonlyArray<PromptStepLike>,\n step: number,\n buffer: string\n): { readonly prompt: string; readonly visibleBuffer: string } => {\n const current = steps[step]\n const prompt = current?.label ?? \"Value\"\n const isSecret = current?.secret === true\n const visibleBuffer = isSecret ? \"*\".repeat(buffer.length) : buffer\n return { prompt, visibleBuffer }\n}\n\ntype RenderPromptArgs = {\n readonly title: string\n readonly header: ReadonlyArray<React.ReactElement>\n readonly prompt: string\n readonly visibleBuffer: string\n readonly helpLine: string\n readonly message: string | null\n}\n\nexport const renderPromptLayout = (args: RenderPromptArgs): React.ReactElement => {\n const el = React.createElement\n return renderLayout(\n args.title,\n [\n ...args.header,\n el(Box, { marginTop: 1 }, el(Text, null, `${args.prompt}: `), el(Text, { color: \"green\" }, args.visibleBuffer)),\n el(Box, { marginTop: 1, flexDirection: \"column\" }, el(Text, { color: \"gray\" }, args.helpLine))\n ],\n args.message\n )\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { authMenuLabels, authViewSteps, authViewTitle } from \"./menu-auth-data.js\"\nimport {\n renderMenuHelp,\n renderPromptLayout,\n renderSelectableMenuList,\n resolvePromptState\n} from \"./menu-render-common.js\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport type { AuthSnapshot, ViewState } from \"./menu-types.js\"\n\nconst renderCountLine = (title: string, count: number): string => `${title}: ${count}`\n\nexport const renderAuthMenu = (\n snapshot: AuthSnapshot,\n selected: number,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const list = renderSelectableMenuList(authMenuLabels(), selected)\n return renderLayout(\n \"docker-git / Auth profiles\",\n [\n el(Text, null, `Global env: ${snapshot.globalEnvPath}`),\n el(Text, null, `Claude auth: ${snapshot.claudeAuthPath}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Entries\", snapshot.totalEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"GitHub tokens\", snapshot.githubTokenEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Git tokens\", snapshot.gitTokenEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Git users\", snapshot.gitUserEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Claude logins\", snapshot.claudeAuthEntries)),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...list),\n renderMenuHelp(\"Use arrows + Enter, or type a number.\")\n ],\n message\n )\n}\n\nexport const renderAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const { prompt, visibleBuffer } = resolvePromptState(authViewSteps(view.flow), view.step, view.buffer)\n let helpLine = \"Enter = next, Esc = cancel.\"\n if (view.flow === \"GithubOauth\" || view.flow === \"ClaudeOauth\") {\n helpLine = \"Enter = start OAuth, Esc = cancel.\"\n } else if (view.flow === \"ClaudeLogout\") {\n helpLine = \"Enter = logout, Esc = cancel.\"\n }\n return renderPromptLayout({\n title: `docker-git / Auth / ${authViewTitle(view.flow)}`,\n header: [\n el(Text, { color: \"gray\" }, `Global env: ${view.snapshot.globalEnvPath}`),\n ...(view.flow === \"ClaudeOauth\" || view.flow === \"ClaudeLogout\"\n ? [el(Text, { color: \"gray\" }, `Claude auth: ${view.snapshot.claudeAuthPath}`)]\n : [])\n ],\n prompt,\n visibleBuffer,\n helpLine,\n message\n })\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { projectAuthMenuLabels, projectAuthViewSteps } from \"./menu-project-auth-data.js\"\nimport {\n renderMenuHelp,\n renderPromptLayout,\n renderSelectableMenuList,\n resolvePromptState\n} from \"./menu-render-common.js\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport type { ProjectAuthSnapshot, ViewState } from \"./menu-types.js\"\n\nconst renderActiveLabel = (value: string | null): string => value ?? \"(not set)\"\n\nconst renderCountLine = (title: string, count: number): string => `${title}: ${count}`\n\nexport const renderProjectAuthMenu = (\n snapshot: ProjectAuthSnapshot,\n selected: number,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const list = renderSelectableMenuList(projectAuthMenuLabels(), selected)\n\n return renderLayout(\n \"docker-git / Project auth\",\n [\n el(Text, null, `Project: ${snapshot.projectName}`),\n el(Text, { color: \"gray\" }, `Dir: ${snapshot.projectDir}`),\n el(Text, { color: \"gray\" }, `Project env: ${snapshot.envProjectPath}`),\n el(Text, { color: \"gray\" }, `Global env: ${snapshot.envGlobalPath}`),\n el(Text, { color: \"gray\" }, `Claude auth: ${snapshot.claudeAuthPath}`),\n el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, `GitHub label: ${renderActiveLabel(snapshot.activeGithubLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available GitHub tokens\", snapshot.githubTokenEntries)),\n el(Text, { color: \"gray\" }, `Git label: ${renderActiveLabel(snapshot.activeGitLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available Git tokens\", snapshot.gitTokenEntries)),\n el(Text, { color: \"gray\" }, `Claude label: ${renderActiveLabel(snapshot.activeClaudeLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available Claude logins\", snapshot.claudeAuthEntries))\n ),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...list),\n renderMenuHelp(\"Use arrows + Enter, or type a number from the list.\")\n ],\n message\n )\n}\n\nexport const renderProjectAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const { prompt, visibleBuffer } = resolvePromptState(projectAuthViewSteps(view.flow), view.step, view.buffer)\n\n return renderPromptLayout({\n title: \"docker-git / Project auth / Set label\",\n header: [\n el(Text, { color: \"gray\" }, `Project: ${view.snapshot.projectName}`),\n el(Text, { color: \"gray\" }, `Project env: ${view.snapshot.envProjectPath}`),\n el(Text, { color: \"gray\" }, `Global env: ${view.snapshot.envGlobalPath}`)\n ],\n prompt,\n visibleBuffer,\n helpLine: \"Enter = apply, Esc = cancel.\",\n message\n })\n}\n","import { Match } from \"effect\"\nimport { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport {\n buildSelectLabels,\n buildSelectListWindow,\n renderSelectDetails,\n selectHint,\n type SelectPurpose,\n selectTitle\n} from \"./menu-render-select.js\"\nimport type { CreateInputs, CreateStep, SelectProjectRuntime } from \"./menu-types.js\"\nimport { createSteps, menuItems } from \"./menu-types.js\"\n\n// CHANGE: render menu views with Ink without JSX\n// WHY: keep UI logic separate from input/state reducers\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall v: view(v) -> render(v)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: menu renders all items once\n// COMPLEXITY: O(n)\n\nexport const renderStepLabel = (step: CreateStep, defaults: CreateInputs): string =>\n Match.value(step).pipe(\n Match.when(\"repoUrl\", () => \"Repo URL (optional for empty workspace)\"),\n Match.when(\"repoRef\", () => `Repo ref [${defaults.repoRef}]`),\n Match.when(\"outDir\", () => `Output dir [${defaults.outDir}]`),\n Match.when(\"runUp\", () => `Run docker compose up now? [${defaults.runUp ? \"Y\" : \"n\"}]`),\n Match.when(\n \"mcpPlaywright\",\n () => `Enable Playwright MCP (Chromium sidecar)? [${defaults.enableMcpPlaywright ? \"y\" : \"N\"}]`\n ),\n Match.when(\n \"force\",\n () => `Force recreate (overwrite files + wipe volumes)? [${defaults.force ? \"y\" : \"N\"}]`\n ),\n Match.exhaustive\n )\n\nconst compactElements = (\n items: ReadonlyArray<React.ReactElement | null>\n): ReadonlyArray<React.ReactElement> => items.filter((item): item is React.ReactElement => item !== null)\n\nconst renderMenuHints = (el: typeof React.createElement): React.ReactElement =>\n el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, \"Hints:\"),\n el(Text, { color: \"gray\" }, \" - Paste repo URL to create directly.\"),\n el(\n Text,\n { color: \"gray\" },\n \" - Aliases: create/c, select/s, auth/a, project-auth/pa, info/i, status/ps, logs/l, down/d, down-all/da, delete/del, quit/q\"\n ),\n el(Text, { color: \"gray\" }, \" - Use arrows and Enter to run.\")\n )\n\nconst renderMenuMessage = (\n el: typeof React.createElement,\n message: string | null\n): React.ReactElement | null => {\n if (!message || message.length === 0) {\n return null\n }\n return el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n ...message\n .split(\"\\n\")\n .map((line, index) => el(Text, { key: `${index}-${line}`, color: \"magenta\" }, line))\n )\n}\n\ntype MenuRenderInput = {\n readonly cwd: string\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly selected: number\n readonly busy: boolean\n readonly message: string | null\n}\n\nexport const renderMenu = (input: MenuRenderInput): React.ReactElement => {\n const { activeDir, busy, cwd, message, runningDockerGitContainers, selected } = input\n const el = React.createElement\n const activeLabel = `Active: ${activeDir ?? \"(none)\"}`\n const runningLabel = `Running docker-git containers: ${runningDockerGitContainers}`\n const cwdLabel = `CWD: ${cwd}`\n const items = menuItems.map((item, index) => {\n const indexLabel = `${index + 1})`\n const prefix = index === selected ? \">\" : \" \"\n return el(\n Text,\n { key: item.label, color: index === selected ? \"green\" : \"white\" },\n `${prefix} ${indexLabel} ${item.label}`\n )\n })\n\n const busyView = busy\n ? el(Box, { marginTop: 1 }, el(Text, { color: \"yellow\" }, \"Running...\"))\n : null\n\n const messageView = renderMenuMessage(el, message)\n const hints = renderMenuHints(el)\n\n return renderLayout(\n \"docker-git\",\n compactElements([\n el(Text, null, activeLabel),\n el(Text, null, runningLabel),\n el(Text, null, cwdLabel),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...items),\n hints,\n busyView,\n messageView\n ]),\n null\n )\n}\n\nexport const renderCreate = (\n label: string,\n buffer: string,\n message: string | null,\n stepIndex: number,\n defaults: CreateInputs\n): React.ReactElement => {\n const el = React.createElement\n const steps = createSteps.map((step, index) =>\n el(\n Text,\n { key: step, color: index === stepIndex ? \"green\" : \"gray\" },\n `${index === stepIndex ? \">\" : \" \"} ${renderStepLabel(step, defaults)}`\n )\n )\n return renderLayout(\n \"docker-git / Create\",\n [\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...steps),\n el(\n Box,\n { marginTop: 1 },\n el(Text, null, `${label}: `),\n el(Text, { color: \"green\" }, buffer)\n ),\n el(Box, { marginTop: 1 }, el(Text, { color: \"gray\" }, \"Enter = next, Esc = cancel.\"))\n ],\n message\n )\n}\n\nexport { renderAuthMenu, renderAuthPrompt } from \"./menu-render-auth.js\"\nexport { renderProjectAuthMenu, renderProjectAuthPrompt } from \"./menu-render-project-auth.js\"\n\nconst computeListWidth = (labels: ReadonlyArray<string>): number => {\n const maxLabelWidth = labels.length > 0 ? Math.max(...labels.map((label) => label.length)) : 24\n return Math.min(Math.max(maxLabelWidth + 2, 28), 54)\n}\n\nconst readStdoutRows = (): number | null => {\n const rows = process.stdout.rows\n if (typeof rows !== \"number\" || !Number.isFinite(rows) || rows <= 0) {\n return null\n }\n return rows\n}\n\nconst computeSelectListMaxRows = (): number => {\n const rows = readStdoutRows()\n if (rows === null) {\n return 12\n }\n return Math.max(6, rows - 14)\n}\n\nconst renderSelectListBox = (\n el: typeof React.createElement,\n items: ReadonlyArray<ProjectItem>,\n selected: number,\n labels: ReadonlyArray<string>,\n width: number\n): React.ReactElement => {\n const window = buildSelectListWindow(labels.length, selected, computeSelectListMaxRows())\n const hiddenAbove = window.start\n const hiddenBelow = labels.length - window.end\n const visibleLabels = labels.slice(window.start, window.end)\n const list = visibleLabels.map((label, offset) => {\n const index = window.start + offset\n return el(\n Text,\n {\n key: items[index]?.projectDir ?? String(index),\n color: index === selected ? \"green\" : \"white\",\n wrap: \"truncate\"\n },\n label\n )\n })\n\n const before = hiddenAbove > 0\n ? [el(Text, { color: \"gray\", wrap: \"truncate\" }, `[scroll] ${hiddenAbove} more above`)]\n : []\n const after = hiddenBelow > 0\n ? [el(Text, { color: \"gray\", wrap: \"truncate\" }, `[scroll] ${hiddenBelow} more below`)]\n : []\n const listBody = list.length > 0 ? list : [el(Text, { color: \"gray\" }, \"No projects found.\")]\n\n return el(\n Box,\n { flexDirection: \"column\", width },\n ...before,\n ...listBody,\n ...after\n )\n}\n\ntype SelectDetailsBoxInput = {\n readonly purpose: SelectPurpose\n readonly items: ReadonlyArray<ProjectItem>\n readonly selected: number\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly connectEnableMcpPlaywright: boolean\n}\n\nconst renderSelectDetailsBox = (\n el: typeof React.createElement,\n input: SelectDetailsBoxInput\n): React.ReactElement => {\n const details = renderSelectDetails(\n el,\n input.purpose,\n input.items[input.selected],\n input.runtimeByProject,\n input.connectEnableMcpPlaywright\n )\n return el(\n Box,\n { flexDirection: \"column\", marginLeft: 2, flexGrow: 1 },\n ...details\n )\n}\n\nexport const renderSelect = (\n input: {\n readonly purpose: SelectPurpose\n readonly items: ReadonlyArray<ProjectItem>\n readonly selected: number\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly confirmDelete: boolean\n readonly connectEnableMcpPlaywright: boolean\n readonly message: string | null\n }\n): React.ReactElement => {\n const { confirmDelete, connectEnableMcpPlaywright, items, message, purpose, runtimeByProject, selected } = input\n const el = React.createElement\n const listLabels = buildSelectLabels(items, selected, purpose, runtimeByProject)\n const listWidth = computeListWidth(listLabels)\n const listBox = renderSelectListBox(el, items, selected, listLabels, listWidth)\n const detailsBox = renderSelectDetailsBox(el, {\n purpose,\n items,\n selected,\n runtimeByProject,\n connectEnableMcpPlaywright\n })\n const baseHint = selectHint(purpose, connectEnableMcpPlaywright)\n const confirmHint = (() => {\n if (purpose === \"Delete\" && confirmDelete) {\n return \"Confirm mode: Enter = delete now, Esc = cancel\"\n }\n if (purpose === \"Down\" && confirmDelete) {\n return \"Confirm mode: Enter = stop now, Esc = cancel\"\n }\n return baseHint\n })()\n const hints = el(Box, { marginTop: 1 }, el(Text, { color: \"gray\" }, confirmHint))\n\n return renderLayout(\n selectTitle(purpose),\n [\n el(Box, { flexDirection: \"row\", marginTop: 1 }, listBox, detailsBox),\n hints\n ],\n message\n )\n}\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nexport type MenuStartupSnapshot = {\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly message: string | null\n}\n\nconst dockerGitContainerPrefix = \"dg-\"\n\nconst emptySnapshot = (): MenuStartupSnapshot => ({\n activeDir: null,\n runningDockerGitContainers: 0,\n message: null\n})\n\nconst uniqueDockerGitContainerNames = (\n runningContainerNames: ReadonlyArray<string>\n): ReadonlyArray<string> => [\n ...new Set(runningContainerNames.filter((name) => name.startsWith(dockerGitContainerPrefix)))\n]\n\nconst detectKnownRunningProjects = (\n items: ReadonlyArray<ProjectItem>,\n runningDockerGitNames: ReadonlyArray<string>\n): ReadonlyArray<ProjectItem> => {\n const runningSet = new Set(runningDockerGitNames)\n return items.filter((item) => runningSet.has(item.containerName))\n}\n\nconst renderRunningHint = (runningCount: number): string =>\n runningCount === 1\n ? \"Detected 1 running docker-git container.\"\n : `Detected ${runningCount} running docker-git containers.`\n\n// CHANGE: infer initial menu state from currently running docker-git containers\n// WHY: avoid \"(none)\" confusion when containers are already up outside this TUI session\n// QUOTE(ISSUE): \"У меня запущены контейнеры от docker-git но он говорит что они не запущены\"\n// REF: issue-13\n// SOURCE: n/a\n// FORMAT THEOREM: forall startupState: snapshot(startupState) -> deterministic(menuState)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: activeDir is set only when exactly one known project is running\n// COMPLEXITY: O(|containers| + |projects|)\nexport const resolveMenuStartupSnapshot = (\n items: ReadonlyArray<ProjectItem>,\n runningContainerNames: ReadonlyArray<string>\n): MenuStartupSnapshot => {\n const runningDockerGitNames = uniqueDockerGitContainerNames(runningContainerNames)\n if (runningDockerGitNames.length === 0) {\n return emptySnapshot()\n }\n\n const knownRunningProjects = detectKnownRunningProjects(items, runningDockerGitNames)\n if (knownRunningProjects.length === 1 && runningDockerGitNames.length === 1) {\n const selected = knownRunningProjects[0]\n if (!selected) {\n return emptySnapshot()\n }\n return {\n activeDir: selected.projectDir,\n runningDockerGitContainers: 1,\n message: `Auto-selected active project: ${selected.displayName}.`\n }\n }\n\n if (knownRunningProjects.length === 0) {\n return {\n activeDir: null,\n runningDockerGitContainers: runningDockerGitNames.length,\n message: `${renderRunningHint(runningDockerGitNames.length)} No matching project config found.`\n }\n }\n\n return {\n activeDir: null,\n runningDockerGitContainers: runningDockerGitNames.length,\n message: `${renderRunningHint(runningDockerGitNames.length)} Use Select project to choose active.`\n }\n}\n\nexport const defaultMenuStartupSnapshot = emptySnapshot\n","import { runDockerPsNames } from \"@effect-template/lib/shell/docker\"\nimport { type InputCancelledError, InputReadError } from \"@effect-template/lib/shell/errors\"\nimport { type AppError, renderError } from \"@effect-template/lib/usecases/errors\"\nimport { listProjectItems } from \"@effect-template/lib/usecases/projects\"\nimport { NodeContext } from \"@effect/platform-node\"\nimport { Effect, pipe } from \"effect\"\nimport { render, useApp, useInput } from \"ink\"\nimport React, { useEffect, useMemo, useState } from \"react\"\n\nimport { resolveCreateInputs } from \"./menu-create.js\"\nimport { handleUserInput, type InputStage } from \"./menu-input-handler.js\"\nimport {\n renderAuthMenu,\n renderAuthPrompt,\n renderCreate,\n renderMenu,\n renderProjectAuthMenu,\n renderProjectAuthPrompt,\n renderSelect,\n renderStepLabel\n} from \"./menu-render.js\"\nimport { leaveTui, resumeTui } from \"./menu-shared.js\"\nimport { defaultMenuStartupSnapshot, resolveMenuStartupSnapshot } from \"./menu-startup.js\"\nimport { createSteps, type MenuEnv, type MenuState, type ViewState } from \"./menu-types.js\"\n\n// CHANGE: keep menu state in the TUI layer\n// WHY: provide a dynamic interface with live selection and inputs\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: input(s) -> state'(s)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: activeDir updated only after successful create\n// COMPLEXITY: O(1) per keypress\n\nconst useRunner = (\n setBusy: (busy: boolean) => void,\n setMessage: (message: string | null) => void\n) => {\n const runEffect = function<E extends AppError>(effect: Effect.Effect<void, E, MenuEnv>) {\n setBusy(true)\n const program = pipe(\n effect,\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.sync(() => {\n setMessage(renderError(error))\n }),\n onSuccess: () => Effect.void\n }),\n Effect.ensuring(\n Effect.sync(() => {\n setBusy(false)\n })\n )\n )\n void Effect.runPromise(Effect.provide(program, NodeContext.layer))\n }\n\n return { runEffect }\n}\n\ntype RenderContext = {\n readonly state: MenuState\n readonly view: ViewState\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly selected: number\n readonly busy: boolean\n readonly message: string | null\n}\n\nconst renderView = (context: RenderContext) => {\n if (context.view._tag === \"Menu\") {\n return renderMenu({\n cwd: context.state.cwd,\n activeDir: context.activeDir,\n runningDockerGitContainers: context.runningDockerGitContainers,\n selected: context.selected,\n busy: context.busy,\n message: context.message\n })\n }\n\n if (context.view._tag === \"Create\") {\n const currentDefaults = resolveCreateInputs(context.state.cwd, context.view.values)\n const step = createSteps[context.view.step] ?? \"repoUrl\"\n const label = renderStepLabel(step, currentDefaults)\n\n return renderCreate(label, context.view.buffer, context.message, context.view.step, currentDefaults)\n }\n\n if (context.view._tag === \"AuthMenu\") {\n return renderAuthMenu(context.view.snapshot, context.view.selected, context.message)\n }\n\n if (context.view._tag === \"AuthPrompt\") {\n return renderAuthPrompt(context.view, context.message)\n }\n\n if (context.view._tag === \"ProjectAuthMenu\") {\n return renderProjectAuthMenu(context.view.snapshot, context.view.selected, context.message)\n }\n\n if (context.view._tag === \"ProjectAuthPrompt\") {\n return renderProjectAuthPrompt(context.view, context.message)\n }\n\n return renderSelect({\n purpose: context.view.purpose,\n items: context.view.items,\n selected: context.view.selected,\n runtimeByProject: context.view.runtimeByProject,\n confirmDelete: context.view.confirmDelete,\n connectEnableMcpPlaywright: context.view.connectEnableMcpPlaywright,\n message: context.message\n })\n}\n\nconst useMenuState = () => {\n const [activeDir, setActiveDir] = useState<string | null>(null)\n const [runningDockerGitContainers, setRunningDockerGitContainers] = useState(0)\n const [selected, setSelected] = useState(0)\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n const [view, setView] = useState<ViewState>({ _tag: \"Menu\" })\n const [inputStage, setInputStage] = useState<InputStage>(\"cold\")\n const [ready, setReady] = useState(false)\n const [skipInputs, setSkipInputs] = useState(2)\n const [sshActive, setSshActive] = useState(false)\n const ignoreUntil = useMemo(() => Date.now() + 400, [])\n const state = useMemo<MenuState>(() => ({ cwd: process.cwd(), activeDir }), [activeDir])\n const runner = useRunner(setBusy, setMessage)\n\n return {\n activeDir,\n setActiveDir,\n runningDockerGitContainers,\n setRunningDockerGitContainers,\n selected,\n setSelected,\n busy,\n message,\n setMessage,\n view,\n setView,\n inputStage,\n setInputStage,\n ready,\n setReady,\n skipInputs,\n setSkipInputs,\n sshActive,\n setSshActive,\n ignoreUntil,\n state,\n runner\n }\n}\n\nconst useReadyGate = (setReady: (ready: boolean) => void) => {\n useEffect(() => {\n const timer = setTimeout(() => {\n setReady(true)\n }, 150)\n return () => {\n clearTimeout(timer)\n }\n }, [setReady])\n}\n\nconst useStartupSnapshot = (\n setActiveDir: (value: string | null) => void,\n setRunningDockerGitContainers: (value: number) => void,\n setMessage: (message: string | null) => void\n) => {\n useEffect(() => {\n let cancelled = false\n\n const startup = pipe(\n Effect.all([listProjectItems, runDockerPsNames(process.cwd())]),\n Effect.map(([items, runningNames]) => resolveMenuStartupSnapshot(items, runningNames)),\n Effect.match({\n onFailure: () => defaultMenuStartupSnapshot(),\n onSuccess: (snapshot) => snapshot\n }),\n Effect.provide(NodeContext.layer)\n )\n\n void Effect.runPromise(startup).then((snapshot) => {\n if (cancelled) {\n return\n }\n setRunningDockerGitContainers(snapshot.runningDockerGitContainers)\n setMessage(snapshot.message)\n if (snapshot.activeDir !== null) {\n setActiveDir(snapshot.activeDir)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [setActiveDir, setMessage, setRunningDockerGitContainers])\n}\n\nconst useSigintGuard = (exit: () => void, sshActive: boolean) => {\n useEffect(() => {\n const handleSigint = () => {\n if (sshActive) {\n return\n }\n exit()\n }\n process.on(\"SIGINT\", handleSigint)\n return () => {\n process.off(\"SIGINT\", handleSigint)\n }\n }, [exit, sshActive])\n}\n\nconst TuiApp = () => {\n const { exit } = useApp()\n const menu = useMenuState()\n\n useReadyGate(menu.setReady)\n useStartupSnapshot(menu.setActiveDir, menu.setRunningDockerGitContainers, menu.setMessage)\n useSigintGuard(exit, menu.sshActive)\n\n useInput(\n (input, key) => {\n if (!menu.ready) {\n return\n }\n if (Date.now() < menu.ignoreUntil) {\n return\n }\n if (menu.skipInputs > 0) {\n menu.setSkipInputs((value) => (value > 0 ? value - 1 : 0))\n return\n }\n handleUserInput(input, key, {\n busy: menu.busy,\n view: menu.view,\n inputStage: menu.inputStage,\n setInputStage: menu.setInputStage,\n selected: menu.selected,\n setSelected: menu.setSelected,\n setSkipInputs: menu.setSkipInputs,\n sshActive: menu.sshActive,\n setSshActive: menu.setSshActive,\n state: menu.state,\n runner: menu.runner,\n exit,\n setView: menu.setView,\n setMessage: menu.setMessage,\n setActiveDir: menu.setActiveDir\n })\n },\n { isActive: !menu.sshActive }\n )\n\n return renderView({\n state: menu.state,\n view: menu.view,\n activeDir: menu.activeDir,\n runningDockerGitContainers: menu.runningDockerGitContainers,\n selected: menu.selected,\n busy: menu.busy,\n message: menu.message\n })\n}\n\n// CHANGE: provide an interactive TUI menu for docker-git\n// WHY: allow dynamic selection and inline create flow without raw prompts\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: tui(s) -> state transitions\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: app exits only on Quit or ctrl+c\n// COMPLEXITY: O(1) per input\nexport const runMenu = pipe(\n Effect.sync(() => {\n resumeTui()\n }),\n Effect.zipRight(\n Effect.tryPromise({\n try: () => render(React.createElement(TuiApp)).waitUntilExit(),\n catch: (error) => new InputReadError({ message: error instanceof Error ? error.message : String(error) })\n })\n ),\n Effect.ensuring(\n Effect.sync(() => {\n leaveTui()\n })\n ),\n Effect.asVoid\n)\n\nexport type MenuError = AppError | InputCancelledError\n","import type { Command, ParseError } from \"@effect-template/lib/core/domain\"\nimport { createProject } from \"@effect-template/lib/usecases/actions\"\nimport { applyProjectConfig } from \"@effect-template/lib/usecases/apply\"\nimport {\n authClaudeLogin,\n authClaudeLogout,\n authClaudeStatus,\n authCodexLogin,\n authCodexLogout,\n authCodexStatus,\n authGithubLogin,\n authGithubLogout,\n authGithubStatus\n} from \"@effect-template/lib/usecases/auth\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport { mcpPlaywrightUp } from \"@effect-template/lib/usecases/mcp-playwright\"\nimport { downAllDockerGitProjects, listProjectStatus } from \"@effect-template/lib/usecases/projects\"\nimport { exportScrap, importScrap } from \"@effect-template/lib/usecases/scrap\"\nimport {\n stateCommit,\n stateInit,\n statePath,\n statePull,\n statePush,\n stateStatus,\n stateSync\n} from \"@effect-template/lib/usecases/state-repo\"\nimport {\n killTerminalProcess,\n listTerminalSessions,\n tailTerminalLogs\n} from \"@effect-template/lib/usecases/terminal-sessions\"\nimport { Effect, Match, pipe } from \"effect\"\nimport { readCommand } from \"./cli/read-command.js\"\nimport { attachTmux, listTmuxPanes } from \"./tmux.js\"\n\nimport { runMenu } from \"./menu.js\"\n\nconst isParseError = (error: AppError): error is ParseError =>\n error._tag === \"UnknownCommand\" ||\n error._tag === \"UnknownOption\" ||\n error._tag === \"MissingOptionValue\" ||\n error._tag === \"MissingRequiredOption\" ||\n error._tag === \"InvalidOption\" ||\n error._tag === \"UnexpectedArgument\"\n\nconst setExitCode = (code: number) =>\n Effect.sync(() => {\n process.exitCode = code\n })\n\nconst logWarningAndExit = (error: AppError) =>\n pipe(\n Effect.logWarning(renderError(error)),\n Effect.tap(() => setExitCode(1)),\n Effect.asVoid\n )\n\nconst logErrorAndExit = (error: AppError) =>\n pipe(\n Effect.logError(renderError(error)),\n Effect.tap(() => setExitCode(1)),\n Effect.asVoid\n )\n\ntype NonBaseCommand = Exclude<\n Command,\n | { readonly _tag: \"Help\" }\n | { readonly _tag: \"Create\" }\n | { readonly _tag: \"Status\" }\n | { readonly _tag: \"DownAll\" }\n | { readonly _tag: \"Menu\" }\n>\n\nconst handleNonBaseCommand = (command: NonBaseCommand) =>\n Match.value(command)\n .pipe(\n Match.when({ _tag: \"StatePath\" }, () => statePath),\n Match.when({ _tag: \"StateInit\" }, (cmd) => stateInit(cmd)),\n Match.when({ _tag: \"StateStatus\" }, () => stateStatus),\n Match.when({ _tag: \"StatePull\" }, () => statePull),\n Match.when({ _tag: \"StateCommit\" }, (cmd) => stateCommit(cmd.message)),\n Match.when({ _tag: \"StatePush\" }, () => statePush),\n Match.when({ _tag: \"StateSync\" }, (cmd) => stateSync(cmd.message)),\n Match.when({ _tag: \"AuthGithubLogin\" }, (cmd) => authGithubLogin(cmd)),\n Match.when({ _tag: \"AuthGithubStatus\" }, (cmd) => authGithubStatus(cmd)),\n Match.when({ _tag: \"AuthGithubLogout\" }, (cmd) => authGithubLogout(cmd)),\n Match.when({ _tag: \"AuthCodexLogin\" }, (cmd) => authCodexLogin(cmd)),\n Match.when({ _tag: \"AuthCodexStatus\" }, (cmd) => authCodexStatus(cmd)),\n Match.when({ _tag: \"AuthCodexLogout\" }, (cmd) => authCodexLogout(cmd)),\n Match.when({ _tag: \"AuthClaudeLogin\" }, (cmd) => authClaudeLogin(cmd)),\n Match.when({ _tag: \"AuthClaudeStatus\" }, (cmd) => authClaudeStatus(cmd)),\n Match.when({ _tag: \"AuthClaudeLogout\" }, (cmd) => authClaudeLogout(cmd)),\n Match.when({ _tag: \"Attach\" }, (cmd) => attachTmux(cmd)),\n Match.when({ _tag: \"Panes\" }, (cmd) => listTmuxPanes(cmd)),\n Match.when({ _tag: \"SessionsList\" }, (cmd) => listTerminalSessions(cmd)),\n Match.when({ _tag: \"SessionsKill\" }, (cmd) => killTerminalProcess(cmd))\n )\n .pipe(\n Match.when({ _tag: \"Apply\" }, (cmd) => applyProjectConfig(cmd)),\n Match.when({ _tag: \"SessionsLogs\" }, (cmd) => tailTerminalLogs(cmd)),\n Match.when({ _tag: \"ScrapExport\" }, (cmd) => exportScrap(cmd)),\n Match.when({ _tag: \"ScrapImport\" }, (cmd) => importScrap(cmd)),\n Match.when({ _tag: \"McpPlaywrightUp\" }, (cmd) => mcpPlaywrightUp(cmd)),\n Match.exhaustive\n )\n\n// CHANGE: compose CLI program with typed errors and shell effects\n// WHY: keep a thin entry layer over pure parsing and template generation\n// QUOTE(ТЗ): \"CLI команду... создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: handle(cmd) terminates with typed outcome\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: help is printed without side effects beyond logs\n// COMPLEXITY: O(n) where n = |files|\nexport const program = pipe(\n readCommand,\n Effect.flatMap((command: Command) =>\n Match.value(command).pipe(\n Match.when({ _tag: \"Help\" }, ({ message }) => Effect.log(message)),\n Match.when({ _tag: \"Create\" }, (create) => createProject(create)),\n Match.when({ _tag: \"Status\" }, () => listProjectStatus),\n Match.when({ _tag: \"DownAll\" }, () => downAllDockerGitProjects),\n Match.when({ _tag: \"Menu\" }, () => runMenu),\n Match.orElse((cmd) => handleNonBaseCommand(cmd))\n )\n ),\n Effect.catchTag(\"FileExistsError\", (error) =>\n pipe(\n Effect.logWarning(renderError(error)),\n Effect.asVoid\n )),\n Effect.catchTag(\"DockerAccessError\", logWarningAndExit),\n Effect.catchTag(\"DockerCommandError\", logWarningAndExit),\n Effect.catchTag(\"AuthError\", logWarningAndExit),\n Effect.catchTag(\"CommandFailedError\", logWarningAndExit),\n Effect.catchTag(\"ScrapArchiveNotFoundError\", logErrorAndExit),\n Effect.catchTag(\"ScrapTargetDirUnsupportedError\", logErrorAndExit),\n Effect.catchTag(\"ScrapWipeRefusedError\", logErrorAndExit),\n Effect.matchEffect({\n onFailure: (error) =>\n isParseError(error)\n ? logErrorAndExit(error)\n : pipe(\n Effect.logError(renderError(error)),\n Effect.flatMap(() => Effect.fail(error))\n ),\n onSuccess: () => Effect.void\n }),\n Effect.asVoid\n)\n","import { NodeContext, NodeRuntime } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\n\nimport { program } from \"./program.js\"\n\n// CHANGE: run docker-git CLI through the Node runtime\n// WHY: ensure platform services (FS, Path, Command) are available in app CLI\n// QUOTE(ТЗ): \"CLI (отображение, фронт) это app\"\n// REF: user-request-2026-01-28-cli-move\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: runMain(program, env) -> exit\n// PURITY: SHELL\n// EFFECT: Effect<void, unknown, NodeContext>\n// INVARIANT: program runs with NodeContext.layer\n// COMPLEXITY: O(n)\nconst main = Effect.provide(program, NodeContext.layer)\n\nNodeRuntime.runMain(main)\n"],"names":["collectUint8Array","process","formatParseError","isParseError","defaultEnvContents","ensureEnvFile","resolveGithubToken","gitBaseEnv","toPosixPath","prBranch","compareUrl","_","resolvePathFromBase","maxPortAttempts","ensureBridgeAccess","buildSshArgs","Fiber","repo","ScrapArchiveInvalidErrorClass","dockerOk","shellEscape","CommandFailedErrorClass","runDockerExecCapture","runDockerExec","ScrapWipeRefusedErrorClass","normalizeLabel","codexHome","render","flowSteps","successMessage","buildGlobalEnvPath","buildClaudeAuthPath","emptyRuntimeByProject","stoppedRuntime","tokenKey","runProjectAuthAction","renderCountLine","program"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"main.js","sources":["../../../../lib/src/core/menu.ts","../../../../lib/src/core/strings.ts","../../../../lib/src/core/repo.ts","../../../../lib/src/core/domain.ts","../../../../lib/src/shell/command-runner.ts","../../../../lib/src/shell/errors.ts","../../../../lib/src/shell/docker-daemon-access.ts","../../../../lib/src/shell/docker-published-ports.ts","../../../../lib/src/shell/docker.ts","../../../../lib/src/core/docker-network.ts","../../../../lib/src/usecases/docker-dns.ts","../../../../lib/src/usecases/access-log.ts","../../../../lib/src/core/parse-errors.ts","../../../../lib/src/usecases/errors.ts","../../../../lib/src/shell/docker-auth.ts","../../../../lib/src/usecases/auth-helpers.ts","../../../../lib/src/usecases/env-file.ts","../../../../lib/src/usecases/path-helpers.ts","../../../../lib/src/usecases/docker-image.ts","../../../../lib/src/usecases/github-auth-image.ts","../../../../lib/src/usecases/runtime.ts","../../../../lib/src/usecases/github-fork.ts","../../../../lib/src/usecases/menu-helpers.ts","../../../../lib/src/shell/paths.ts","../../../../lib/src/shell/config.ts","../../../../lib/src/usecases/docker-git-config-search.ts","../../../../lib/src/usecases/projects-core.ts","../../../../lib/src/usecases/state-repo/env.ts","../../../../lib/src/usecases/state-repo/git-commands.ts","../../../../lib/src/usecases/state-repo/github-auth.ts","../../../../lib/src/usecases/state-repo/gitignore.ts","../../../../lib/src/core/templates-prompt.ts","../../../../lib/src/core/templates-entrypoint/base.ts","../../../../lib/src/core/templates-entrypoint/claude.ts","../../../../lib/src/core/templates-entrypoint/codex.ts","../../../../lib/src/core/templates-entrypoint/git.ts","../../../../lib/src/core/templates-entrypoint/nested-docker-git.ts","../../../../lib/src/core/templates-entrypoint/opencode.ts","../../../../lib/src/core/templates-entrypoint/tasks.ts","../../../../lib/src/core/templates-entrypoint.ts","../../../../lib/src/core/templates/docker-compose.ts","../../../../lib/src/core/templates/dockerfile.ts","../../../../lib/src/core/templates/playwright.ts","../../../../lib/src/core/templates.ts","../../../../lib/src/shell/files.ts","../../../../lib/src/usecases/state-normalize.ts","../../../../lib/src/usecases/state-repo/sync-ops.ts","../../../../lib/src/usecases/state-repo.ts","../../../../lib/src/usecases/terminal-cursor.ts","../../../../lib/src/usecases/docker-network-gc.ts","../../../../lib/src/usecases/projects-delete.ts","../../../../lib/src/usecases/projects-down.ts","../../../../lib/src/usecases/projects-list.ts","../../../../lib/src/usecases/auth-copy.ts","../../../../lib/src/usecases/auth-sync-helpers.ts","../../../../lib/src/usecases/auth-sync.ts","../../../../lib/src/shell/ports.ts","../../../../lib/src/usecases/ports-reserve.ts","../../../../lib/src/usecases/projects-up.ts","../../../../lib/src/usecases/projects-ssh.ts","../../../../lib/src/usecases/actions/docker-up.ts","../../../../lib/src/usecases/actions/paths.ts","../../../../lib/src/usecases/actions/ports.ts","../../../../lib/src/usecases/actions/prepare-files.ts","../../../../lib/src/usecases/actions/create-project.ts","../../../../lib/src/core/token-labels.ts","../../../../lib/src/usecases/apply-overrides.ts","../../../../lib/src/usecases/apply.ts","../../../../lib/src/usecases/auth-claude-oauth.ts","../../../../lib/src/usecases/auth-claude.ts","../../../../lib/src/usecases/auth-codex.ts","../../../../lib/src/usecases/auth-github.ts","../../../../lib/src/usecases/mcp-playwright.ts","../../../../lib/src/usecases/scrap-chunks.ts","../../../../lib/src/usecases/scrap-path.ts","../../../../lib/src/usecases/scrap-common.ts","../../../../lib/src/usecases/scrap-session-export.ts","../../../../lib/src/usecases/scrap-session-manifest.ts","../../../../lib/src/usecases/scrap-session-import.ts","../../../../lib/src/usecases/scrap.ts","../../../../lib/src/usecases/terminal-sessions.ts","../../../src/docker-git/cli/parser-options.ts","../../../src/docker-git/cli/parser-shared.ts","../../../src/docker-git/cli/parser-apply.ts","../../../src/docker-git/cli/parser-attach.ts","../../../src/docker-git/cli/parser-auth.ts","../../../../lib/src/core/command-builders.ts","../../../src/docker-git/cli/parser-clone.ts","../../../src/docker-git/cli/parser-mcp-playwright.ts","../../../src/docker-git/cli/parser-panes.ts","../../../src/docker-git/cli/parser-scrap.ts","../../../src/docker-git/cli/parser-sessions.ts","../../../src/docker-git/cli/parser-state.ts","../../../src/docker-git/cli/usage.ts","../../../src/docker-git/cli/parser.ts","../../../src/docker-git/cli/read-command.ts","../../../src/docker-git/tmux.ts","../../../src/docker-git/menu-buffer-input.ts","../../../src/docker-git/menu-shared.ts","../../../src/docker-git/menu-types.ts","../../../src/docker-git/menu-create.ts","../../../src/docker-git/menu-auth-helpers.ts","../../../src/docker-git/menu-labeled-env.ts","../../../src/docker-git/menu-auth-data.ts","../../../src/docker-git/menu-input-utils.ts","../../../src/docker-git/menu-auth.ts","../../../src/docker-git/menu-select-runtime.ts","../../../src/docker-git/menu-project-auth-claude.ts","../../../src/docker-git/menu-project-auth-data.ts","../../../src/docker-git/menu-project-auth.ts","../../../src/docker-git/menu-select-connect.ts","../../../src/docker-git/menu-select-order.ts","../../../src/docker-git/menu-select-view.ts","../../../src/docker-git/menu-select-actions.ts","../../../src/docker-git/menu-select.ts","../../../src/docker-git/menu-select-load.ts","../../../src/docker-git/menu-actions.ts","../../../src/docker-git/menu-menu.ts","../../../src/docker-git/menu-input-handler.ts","../../../src/docker-git/menu-render-layout.ts","../../../src/docker-git/menu-render-select.ts","../../../src/docker-git/menu-render-common.ts","../../../src/docker-git/menu-render-auth.ts","../../../src/docker-git/menu-render-project-auth.ts","../../../src/docker-git/menu-render.ts","../../../src/docker-git/menu-startup.ts","../../../src/docker-git/menu.ts","../../../src/docker-git/program.ts","../../../src/docker-git/main.ts"],"sourcesContent":["import { Either } from \"effect\"\n\nexport type MenuAction =\n | { readonly _tag: \"Create\" }\n | { readonly _tag: \"Select\" }\n | { readonly _tag: \"Auth\" }\n | { readonly _tag: \"ProjectAuth\" }\n | { readonly _tag: \"Info\" }\n | { readonly _tag: \"Up\" }\n | { readonly _tag: \"Status\" }\n | { readonly _tag: \"Logs\" }\n | { readonly _tag: \"Down\" }\n | { readonly _tag: \"DownAll\" }\n | { readonly _tag: \"Delete\" }\n | { readonly _tag: \"Quit\" }\n\nexport type ParseError =\n | { readonly _tag: \"UnknownCommand\"; readonly command: string }\n | { readonly _tag: \"UnknownOption\"; readonly option: string }\n | { readonly _tag: \"MissingOptionValue\"; readonly option: string }\n | { readonly _tag: \"MissingRequiredOption\"; readonly option: string }\n | { readonly _tag: \"InvalidOption\"; readonly option: string; readonly reason: string }\n | { readonly _tag: \"UnexpectedArgument\"; readonly value: string }\n\nconst normalizeMenuInput = (input: string): string => input.trim().toLowerCase()\n\nconst menuAliasMap = new Map<string, MenuAction>([\n [\"1\", { _tag: \"Create\" }],\n [\"create\", { _tag: \"Create\" }],\n [\"c\", { _tag: \"Create\" }],\n [\"2\", { _tag: \"Select\" }],\n [\"select\", { _tag: \"Select\" }],\n [\"s\", { _tag: \"Select\" }],\n [\"3\", { _tag: \"Auth\" }],\n [\"auth\", { _tag: \"Auth\" }],\n [\"a\", { _tag: \"Auth\" }],\n [\"4\", { _tag: \"ProjectAuth\" }],\n [\"project-auth\", { _tag: \"ProjectAuth\" }],\n [\"projectauth\", { _tag: \"ProjectAuth\" }],\n [\"pa\", { _tag: \"ProjectAuth\" }],\n [\"5\", { _tag: \"Info\" }],\n [\"info\", { _tag: \"Info\" }],\n [\"i\", { _tag: \"Info\" }],\n [\"up\", { _tag: \"Up\" }],\n [\"u\", { _tag: \"Up\" }],\n [\"start\", { _tag: \"Up\" }],\n [\"6\", { _tag: \"Status\" }],\n [\"status\", { _tag: \"Status\" }],\n [\"ps\", { _tag: \"Status\" }],\n [\"7\", { _tag: \"Logs\" }],\n [\"logs\", { _tag: \"Logs\" }],\n [\"log\", { _tag: \"Logs\" }],\n [\"l\", { _tag: \"Logs\" }],\n [\"8\", { _tag: \"Down\" }],\n [\"down\", { _tag: \"Down\" }],\n [\"stop\", { _tag: \"Down\" }],\n [\"d\", { _tag: \"Down\" }],\n [\"9\", { _tag: \"DownAll\" }],\n [\"down-all\", { _tag: \"DownAll\" }],\n [\"downall\", { _tag: \"DownAll\" }],\n [\"stop-all\", { _tag: \"DownAll\" }],\n [\"stopall\", { _tag: \"DownAll\" }],\n [\"kill-all\", { _tag: \"DownAll\" }],\n [\"killall\", { _tag: \"DownAll\" }],\n [\"da\", { _tag: \"DownAll\" }],\n [\"10\", { _tag: \"Delete\" }],\n [\"delete\", { _tag: \"Delete\" }],\n [\"del\", { _tag: \"Delete\" }],\n [\"remove\", { _tag: \"Delete\" }],\n [\"rm\", { _tag: \"Delete\" }],\n [\"0\", { _tag: \"Quit\" }],\n [\"11\", { _tag: \"Quit\" }],\n [\"quit\", { _tag: \"Quit\" }],\n [\"q\", { _tag: \"Quit\" }],\n [\"exit\", { _tag: \"Quit\" }]\n])\n\nconst resolveMenuAction = (normalized: string): MenuAction | undefined => menuAliasMap.get(normalized)\n\n// CHANGE: decode interactive menu input into a typed action\n// WHY: keep menu parsing pure and reusable across shells\n// QUOTE(ТЗ): \"Хочу что бы открылось менюшка\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: parseMenu(s) = a -> deterministic(a)\n// PURITY: CORE\n// EFFECT: Effect<MenuAction, ParseError, never>\n// INVARIANT: unknown input maps to InvalidOption\n// COMPLEXITY: O(1)\nexport const parseMenuSelection = (input: string): Either.Either<MenuAction, ParseError> => {\n const normalized = normalizeMenuInput(input)\n\n if (normalized.length === 0) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"menu\",\n reason: \"empty selection\"\n })\n }\n\n const action = resolveMenuAction(normalized)\n if (action === undefined) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"menu\",\n reason: `unknown selection: ${input}`\n })\n }\n\n return Either.right(action)\n}\n","export const trimLeftChar = (value: string, char: string): string => {\n let start = 0\n while (start < value.length && value[start] === char) {\n start += 1\n }\n return value.slice(start)\n}\n\nexport const trimRightChar = (value: string, char: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === char) {\n end -= 1\n }\n return value.slice(0, end)\n}\n","import { trimLeftChar, trimRightChar } from \"./strings.js\"\n\nconst slugify = (value: string): string => {\n const normalized = value\n .trim()\n .toLowerCase()\n .replaceAll(/[^a-z0-9_-]+/g, \"-\")\n .replaceAll(/-+/g, \"-\")\n const withoutLeading = trimLeftChar(normalized, \"-\")\n const cleaned = trimRightChar(withoutLeading, \"-\")\n\n return cleaned.length > 0 ? cleaned : \"app\"\n}\n\n// CHANGE: derive a stable repo slug from a repo URL\n// WHY: generate deterministic container/service names per repository\n// QUOTE(ТЗ): \"по факту он должен создавтаь постоянно новый контейнер для нового репозитория\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: slug(url) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: slug is lowercase and non-empty\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveRepoSlug = (repoUrl: string): string => {\n const trimmed = trimRightChar(repoUrl.trim(), \"/\")\n if (trimmed.length === 0) {\n return \"app\"\n }\n\n const lastSlash = trimmed.lastIndexOf(\"/\")\n const lastColon = trimmed.lastIndexOf(\":\")\n const pivot = Math.max(lastSlash, lastColon)\n const segment = pivot >= 0 ? trimmed.slice(pivot + 1) : trimmed\n const withoutGit = segment.endsWith(\".git\") ? segment.slice(0, -4) : segment\n\n return slugify(withoutGit)\n}\n\ntype RepoPathParts = {\n readonly ownerParts: ReadonlyArray<string>\n readonly repo: string\n readonly pathParts: ReadonlyArray<string>\n}\n\nconst stripGitSuffix = (segment: string): string => segment.endsWith(\".git\") ? segment.slice(0, -4) : segment\n\nconst normalizePathParts = (pathPart: string): ReadonlyArray<string> => {\n const cleaned = trimLeftChar(pathPart, \"/\")\n if (cleaned.length === 0) {\n return []\n }\n const rawParts = cleaned.split(\"/\").filter(Boolean)\n return rawParts.map((part, index) => index === rawParts.length - 1 ? stripGitSuffix(part) : part)\n}\n\nconst extractFromScheme = (trimmed: string): ReadonlyArray<string> | null => {\n const schemeIndex = trimmed.indexOf(\"://\")\n if (schemeIndex === -1) {\n return null\n }\n const afterScheme = trimmed.slice(schemeIndex + 3)\n const firstSlash = afterScheme.indexOf(\"/\")\n if (firstSlash === -1) {\n return []\n }\n return normalizePathParts(afterScheme.slice(firstSlash + 1))\n}\n\nconst extractFromColon = (trimmed: string): ReadonlyArray<string> | null => {\n const colonIndex = trimmed.indexOf(\":\")\n if (colonIndex === -1) {\n return null\n }\n return normalizePathParts(trimmed.slice(colonIndex + 1))\n}\n\nconst extractFromSlash = (trimmed: string): ReadonlyArray<string> | null => {\n const slashIndex = trimmed.indexOf(\"/\")\n if (slashIndex === -1) {\n return null\n }\n return normalizePathParts(trimmed.slice(slashIndex + 1))\n}\n\nconst extractRepoPathParts = (repoUrl: string): ReadonlyArray<string> => {\n const trimmed = trimRightChar(repoUrl.trim(), \"/\")\n if (trimmed.length === 0) {\n return []\n }\n\n const fromScheme = extractFromScheme(trimmed)\n if (fromScheme !== null) {\n return fromScheme\n }\n\n const fromColon = extractFromColon(trimmed)\n if (fromColon !== null) {\n return fromColon\n }\n\n const fromSlash = extractFromSlash(trimmed)\n if (fromSlash !== null) {\n return fromSlash\n }\n\n return [stripGitSuffix(trimmed)]\n}\n\nconst normalizeRepoSegment = (segment: string, fallback: string): string => {\n const normalized = slugify(segment)\n return normalized.length > 0 ? normalized : fallback\n}\n\n// CHANGE: derive stable owner/repo path parts from a repo URL\n// WHY: avoid collisions when orgs have identical repo names\n// QUOTE(ТЗ): \"пути учитывают организацию в которой это лежит\"\n// REF: user-request-2026-01-27\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: parts(url) -> deterministic(parts)\n// PURITY: CORE\n// EFFECT: Effect<RepoPathParts, never, never>\n// INVARIANT: path parts are slugified and non-empty\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveRepoPathParts = (repoUrl: string): RepoPathParts => {\n const repoSlug = deriveRepoSlug(repoUrl)\n const rawParts = extractRepoPathParts(repoUrl)\n if (rawParts.length === 0) {\n return { ownerParts: [], repo: repoSlug, pathParts: [repoSlug] }\n }\n\n const rawRepo = rawParts.at(-1) ?? repoSlug\n const repo = normalizeRepoSegment(rawRepo, repoSlug)\n const ownerParts = rawParts\n .slice(0, -1)\n .map((part) => normalizeRepoSegment(part, \"org\"))\n .filter((part) => part.length > 0)\n const pathParts = ownerParts.length > 0 ? [...ownerParts, repo] : [repo]\n\n return { ownerParts, repo, pathParts }\n}\n\nexport type GithubRepo = {\n readonly owner: string\n readonly repo: string\n}\n\nconst stripQueryHash = (value: string): string => {\n const queryIndex = value.indexOf(\"?\")\n const hashIndex = value.indexOf(\"#\")\n const indices = [queryIndex, hashIndex].filter((index) => index >= 0)\n if (indices.length === 0) {\n return value\n }\n const cutIndex = Math.min(...indices)\n return value.slice(0, cutIndex)\n}\n\nconst splitGithubPath = (input: string): ReadonlyArray<string> | null => {\n const trimmed = input.trim()\n const httpsPrefix = \"https://github.com/\"\n const sshPrefix = \"ssh://git@github.com/\"\n const gitPrefix = \"git@github.com:\"\n let rest: string | null = null\n if (trimmed.startsWith(httpsPrefix)) {\n rest = trimmed.slice(httpsPrefix.length)\n } else if (trimmed.startsWith(sshPrefix)) {\n rest = trimmed.slice(sshPrefix.length)\n } else if (trimmed.startsWith(gitPrefix)) {\n rest = trimmed.slice(gitPrefix.length)\n }\n if (rest === null) {\n return null\n }\n const cleaned = trimRightChar(stripQueryHash(rest), \"/\")\n if (cleaned.length === 0) {\n return []\n }\n return cleaned.split(\"/\").filter((part) => part.length > 0)\n}\n\n// CHANGE: parse GitHub owner/repo from common URL formats\n// WHY: enable auto-fork logic without relying on slugified paths\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: github(u) → repo(u) = {owner, repo}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returns null for non-GitHub inputs\n// COMPLEXITY: O(n) where n = |input|\nexport const parseGithubRepoUrl = (input: string): GithubRepo | null => {\n const parts = splitGithubPath(input)\n if (!parts || parts.length < 2) {\n return null\n }\n\n const owner = parts[0]?.trim()\n const repoRaw = parts[1]?.trim()\n if (!owner || !repoRaw) {\n return null\n }\n\n const repo = stripGitSuffix(repoRaw)\n return { owner, repo }\n}\n\nexport type ResolvedRepoInput = {\n readonly repoUrl: string\n readonly repoRef?: string\n readonly workspaceSuffix?: string\n}\n\ntype GithubRefParts = {\n readonly owner: string\n readonly repoRaw: string\n readonly marker: string\n readonly ref: string\n}\n\nconst readGithubPart = (value: string | undefined): string | null => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : null\n}\n\nconst parseGithubRefParts = (input: string): GithubRefParts | null => {\n const parts = splitGithubPath(input)\n if (!parts || parts.length < 4) {\n return null\n }\n const owner = readGithubPart(parts[0])\n const repoRaw = readGithubPart(parts[1])\n const markerRaw = readGithubPart(parts[2])\n const ref = readGithubPart(parts[3])\n if (!owner || !repoRaw || !markerRaw || !ref) {\n return null\n }\n return { owner, repoRaw, marker: markerRaw.toLowerCase(), ref }\n}\n\nconst parseGithubPrUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || parsed.marker !== \"pull\") {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n const workspaceSuffix = `pr-${slugify(parsed.ref)}`\n return {\n repoUrl: `https://github.com/${parsed.owner}/${repo}.git`,\n repoRef: `refs/pull/${parsed.ref}/head`,\n workspaceSuffix\n }\n}\n\n// CHANGE: normalize GitHub tree/blob URLs into repo + ref\n// WHY: allow docker-git clone to accept branch URLs like /tree/<branch>\n// QUOTE(ТЗ): \"вызови --force на https://github.com/agiens/crm/tree/vova-fork\"\n// REF: user-request-2026-02-10-github-tree-url\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: tree(u) → repo(u)=git(u) ∧ ref(u)=branch(u)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: ignores additional path segments after the ref\n// COMPLEXITY: O(n) where n = |url|\nconst parseGithubTreeUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || (parsed.marker !== \"tree\" && parsed.marker !== \"blob\")) {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n return { repoUrl: `https://github.com/${parsed.owner}/${repo}.git`, repoRef: parsed.ref }\n}\n\n// CHANGE: normalize GitHub issue URLs into repo URLs\n// WHY: allow docker-git clone to accept issue links directly\n// QUOTE(ТЗ): \"Сразу на issues\"\n// REF: user-request-2026-02-05-issues\n// SOURCE: n/a\n// FORMAT THEOREM: ∀u: issue(u) → repo(u)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: issue URL yields repoUrl + deterministic issue branch\n// COMPLEXITY: O(n) where n = |url|\nconst parseGithubIssueUrl = (input: string): ResolvedRepoInput | null => {\n const parsed = parseGithubRefParts(input)\n if (!parsed || parsed.marker !== \"issues\") {\n return null\n }\n\n const repo = stripGitSuffix(parsed.repoRaw)\n const workspaceSuffix = `issue-${slugify(parsed.ref)}`\n return {\n repoUrl: `https://github.com/${parsed.owner}/${repo}.git`,\n repoRef: workspaceSuffix,\n workspaceSuffix\n }\n}\n\n// CHANGE: normalize repo input and PR/issue URLs into repo + ref\n// WHY: allow cloning GitHub PR links and issue links directly\n// QUOTE(ТЗ): \"клонировть по cсылке на PR\" | \"Сразу на issues\"\n// REF: user-request-2026-01-28-pr | user-request-2026-02-05-issues\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: resolve(url) -> deterministic(url, ref)\n// PURITY: CORE\n// EFFECT: Effect<ResolvedRepoInput, never, never>\n// INVARIANT: PR URL yields repoUrl + refs/pull/<id>/head\n// COMPLEXITY: O(n) where n = |url|\nexport const resolveRepoInput = (repoUrl: string): ResolvedRepoInput =>\n parseGithubPrUrl(repoUrl)\n ?? parseGithubTreeUrl(repoUrl)\n ?? parseGithubIssueUrl(repoUrl)\n ?? { repoUrl: repoUrl.trim() }\n","export type { MenuAction, ParseError } from \"./menu.js\"\nexport { parseMenuSelection } from \"./menu.js\"\nexport { deriveRepoPathParts, deriveRepoSlug, resolveRepoInput } from \"./repo.js\"\n\nexport type DockerNetworkMode = \"shared\" | \"project\"\n\nexport const defaultDockerNetworkMode: DockerNetworkMode = \"shared\"\n\nexport const defaultDockerSharedNetworkName = \"docker-git-shared\"\n\nexport interface TemplateConfig {\n readonly containerName: string\n readonly serviceName: string\n readonly sshUser: string\n readonly sshPort: number\n readonly repoUrl: string\n readonly repoRef: string\n readonly forkRepoUrl?: string\n readonly gitTokenLabel?: string | undefined\n readonly codexAuthLabel?: string | undefined\n readonly claudeAuthLabel?: string | undefined\n readonly targetDir: string\n readonly volumeName: string\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexSharedAuthPath: string\n readonly codexHome: string\n readonly dockerNetworkMode: DockerNetworkMode\n readonly dockerSharedNetworkName: string\n readonly enableMcpPlaywright: boolean\n readonly pnpmVersion: string\n}\n\nexport interface ProjectConfig {\n readonly schemaVersion: 1\n readonly template: TemplateConfig\n}\n\nexport interface CreateCommand {\n readonly _tag: \"Create\"\n readonly config: TemplateConfig\n readonly outDir: string\n readonly runUp: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n readonly waitForClone: boolean\n readonly openSsh: boolean\n}\n\nexport interface MenuCommand {\n readonly _tag: \"Menu\"\n}\n\nexport interface AttachCommand {\n readonly _tag: \"Attach\"\n readonly projectDir: string\n}\n\nexport interface PanesCommand {\n readonly _tag: \"Panes\"\n readonly projectDir: string\n}\n\nexport interface SessionsListCommand {\n readonly _tag: \"SessionsList\"\n readonly projectDir: string\n readonly includeDefault: boolean\n}\n\nexport interface SessionsKillCommand {\n readonly _tag: \"SessionsKill\"\n readonly projectDir: string\n readonly pid: number\n}\n\nexport interface SessionsLogsCommand {\n readonly _tag: \"SessionsLogs\"\n readonly projectDir: string\n readonly pid: number\n readonly lines: number\n}\n\n// CHANGE: remove scrap cache mode and keep only the reproducible session snapshot.\n// WHY: cache archives include large, easily-rebuildable artifacts (e.g. node_modules) that should not be stored in git.\n// QUOTE(ТЗ): \"не должно быть старого режима где он качает весь шлак типо node_modules\"\n// REF: user-request-2026-02-15\n// SOURCE: n/a\n// FORMAT THEOREM: forall m: ScrapMode, m = \"session\"\n// PURITY: CORE\n// EFFECT: Effect<never>\n// INVARIANT: scrap exports/imports are always recipe-like (git state + small secrets), never full workspace caches\n// COMPLEXITY: O(1)\nexport type ScrapMode = \"session\"\n\nexport interface ScrapExportCommand {\n readonly _tag: \"ScrapExport\"\n readonly projectDir: string\n readonly archivePath: string\n readonly mode: ScrapMode\n}\n\nexport interface ScrapImportCommand {\n readonly _tag: \"ScrapImport\"\n readonly projectDir: string\n readonly archivePath: string\n readonly wipe: boolean\n readonly mode: ScrapMode\n}\n\nexport interface McpPlaywrightUpCommand {\n readonly _tag: \"McpPlaywrightUp\"\n readonly projectDir: string\n readonly runUp: boolean\n}\n\nexport interface ApplyCommand {\n readonly _tag: \"Apply\"\n readonly projectDir: string\n readonly runUp: boolean\n readonly gitTokenLabel?: string | undefined\n readonly codexTokenLabel?: string | undefined\n readonly claudeTokenLabel?: string | undefined\n readonly enableMcpPlaywright?: boolean | undefined\n}\n\nexport interface HelpCommand {\n readonly _tag: \"Help\"\n readonly message: string\n}\n\nexport interface StatusCommand {\n readonly _tag: \"Status\"\n}\n\nexport interface DownAllCommand {\n readonly _tag: \"DownAll\"\n}\n\nexport interface StatePathCommand {\n readonly _tag: \"StatePath\"\n}\n\nexport interface StateInitCommand {\n readonly _tag: \"StateInit\"\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nexport interface StatePullCommand {\n readonly _tag: \"StatePull\"\n}\n\nexport interface StatePushCommand {\n readonly _tag: \"StatePush\"\n}\n\nexport interface StateStatusCommand {\n readonly _tag: \"StateStatus\"\n}\n\nexport interface StateCommitCommand {\n readonly _tag: \"StateCommit\"\n readonly message: string\n}\n\nexport interface StateSyncCommand {\n readonly _tag: \"StateSync\"\n readonly message: string | null\n}\n\nexport interface AuthGithubLoginCommand {\n readonly _tag: \"AuthGithubLogin\"\n readonly label: string | null\n readonly token: string | null\n readonly scopes: string | null\n readonly envGlobalPath: string\n}\n\nexport interface AuthGithubStatusCommand {\n readonly _tag: \"AuthGithubStatus\"\n readonly envGlobalPath: string\n}\n\nexport interface AuthGithubLogoutCommand {\n readonly _tag: \"AuthGithubLogout\"\n readonly label: string | null\n readonly envGlobalPath: string\n}\n\nexport interface AuthCodexLoginCommand {\n readonly _tag: \"AuthCodexLogin\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthCodexStatusCommand {\n readonly _tag: \"AuthCodexStatus\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthCodexLogoutCommand {\n readonly _tag: \"AuthCodexLogout\"\n readonly label: string | null\n readonly codexAuthPath: string\n}\n\nexport interface AuthClaudeLoginCommand {\n readonly _tag: \"AuthClaudeLogin\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport interface AuthClaudeStatusCommand {\n readonly _tag: \"AuthClaudeStatus\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport interface AuthClaudeLogoutCommand {\n readonly _tag: \"AuthClaudeLogout\"\n readonly label: string | null\n readonly claudeAuthPath: string\n}\n\nexport type SessionsCommand =\n | SessionsListCommand\n | SessionsKillCommand\n | SessionsLogsCommand\n\nexport type ScrapCommand =\n | ScrapExportCommand\n | ScrapImportCommand\n\nexport type AuthCommand =\n | AuthGithubLoginCommand\n | AuthGithubStatusCommand\n | AuthGithubLogoutCommand\n | AuthCodexLoginCommand\n | AuthCodexStatusCommand\n | AuthCodexLogoutCommand\n | AuthClaudeLoginCommand\n | AuthClaudeStatusCommand\n | AuthClaudeLogoutCommand\n\nexport type StateCommand =\n | StatePathCommand\n | StateInitCommand\n | StatePullCommand\n | StatePushCommand\n | StateStatusCommand\n | StateCommitCommand\n | StateSyncCommand\n\nexport type Command =\n | CreateCommand\n | MenuCommand\n | AttachCommand\n | PanesCommand\n | SessionsCommand\n | ScrapCommand\n | McpPlaywrightUpCommand\n | ApplyCommand\n | HelpCommand\n | StatusCommand\n | DownAllCommand\n | StateCommand\n | AuthCommand\n\n// CHANGE: validate docker network mode values at the CLI/config boundary\n// WHY: keep compose network behavior explicit and type-safe\n// QUOTE(ТЗ): \"Что бы среды были изолированы?\"\n// REF: user-request-2026-02-20-networks\n// SOURCE: n/a\n// FORMAT THEOREM: ∀x: isDockerNetworkMode(x) -> x ∈ {\"shared\",\"project\"}\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: returns true only for known modes\n// COMPLEXITY: O(1)\nexport const isDockerNetworkMode = (value: string): value is DockerNetworkMode =>\n value === \"shared\" || value === \"project\"\n\n// CHANGE: derive compose network name from typed template config\n// WHY: keep network naming deterministic across template generation and runtime checks\n// QUOTE(ТЗ): \"Если я хочу уникальную сеть на каждый контейнер?\"\n// REF: user-request-2026-02-20-networks\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cfg: resolveComposeNetworkName(cfg) = n -> deterministic(n)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: shared mode always resolves to dockerSharedNetworkName; project mode to \"<service>-net\"\n// COMPLEXITY: O(1)\nexport const resolveComposeNetworkName = (\n config: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): string =>\n config.dockerNetworkMode === \"shared\"\n ? config.dockerSharedNetworkName\n : `${config.serviceName}-net`\n\nexport const defaultTemplateConfig = {\n containerName: \"dev-ssh\",\n serviceName: \"dev\",\n sshUser: \"dev\",\n sshPort: 2222,\n repoRef: \"main\",\n targetDir: \"/home/dev/app\",\n volumeName: \"dev_home\",\n dockerGitPath: \"./.docker-git\",\n authorizedKeysPath: \"./.docker-git/authorized_keys\",\n envGlobalPath: \"./.docker-git/.orch/env/global.env\",\n envProjectPath: \"./.orch/env/project.env\",\n codexAuthPath: \"./.docker-git/.orch/auth/codex\",\n codexSharedAuthPath: \"./.docker-git/.orch/auth/codex\",\n codexHome: \"/home/dev/.codex\",\n dockerNetworkMode: defaultDockerNetworkMode,\n dockerSharedNetworkName: defaultDockerSharedNetworkName,\n enableMcpPlaywright: false,\n pnpmVersion: \"10.27.0\"\n}\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Chunk from \"effect/Chunk\"\nimport * as Stream from \"effect/Stream\"\n\ntype RunCommandSpec = {\n readonly cwd: string\n readonly command: string\n readonly args: ReadonlyArray<string>\n readonly env?: Readonly<Record<string, string | undefined>>\n}\n\nconst buildCommand = (\n spec: RunCommandSpec,\n stdout: \"inherit\" | \"pipe\",\n stderr: \"inherit\" | \"pipe\",\n stdin: Command.CommandInput = \"pipe\"\n) =>\n pipe(\n Command.make(spec.command, ...spec.args),\n Command.workingDirectory(spec.cwd),\n spec.env ? Command.env(spec.env) : (value) => value,\n Command.stdin(stdin),\n Command.stdout(stdout),\n Command.stderr(stderr)\n )\n\nconst ensureExitCode = <E>(\n exitCode: number,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<number, E> =>\n okExitCodes.includes(exitCode)\n ? Effect.succeed(exitCode)\n : Effect.fail(onFailure(exitCode))\n\nexport const runCommandWithExitCodes = <E>(\n spec: RunCommandSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<void, E | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const exitCode = yield* _(Command.exitCode(buildCommand(spec, \"inherit\", \"inherit\", \"inherit\")))\n const numericExitCode = Number(exitCode)\n yield* _(ensureExitCode(numericExitCode, okExitCodes, onFailure))\n })\n\n// CHANGE: run a command and return the exit code\n// WHY: enable status checks without throwing on non-zero exits\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) = n\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: stdout/stderr are suppressed for status checks\n// COMPLEXITY: O(command)\nexport const runCommandExitCode = (\n spec: RunCommandSpec\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.map(\n Command.exitCode(\n buildCommand(spec, \"pipe\", \"pipe\", \"inherit\")\n ),\n Number\n )\n\nconst collectUint8Array = (chunks: Chunk.Chunk<Uint8Array>): Uint8Array =>\n Chunk.reduce(chunks, new Uint8Array(), (acc, curr) => {\n const next = new Uint8Array(acc.length + curr.length)\n next.set(acc)\n next.set(curr, acc.length)\n return next\n })\n\n// CHANGE: run a command and capture stdout\n// WHY: allow auth flows to retrieve tokens from CLI tools\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: capture(cmd) -> stdout(cmd)\n// PURITY: SHELL\n// EFFECT: Effect<string, E | PlatformError, CommandExecutor>\n// INVARIANT: stderr is captured but ignored for output\n// COMPLEXITY: O(command)\nexport const runCommandCapture = <E>(\n spec: RunCommandSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<string, E | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const process = yield* _(executor.start(buildCommand(spec, \"pipe\", \"pipe\", \"pipe\")))\n const bytes = yield* _(\n pipe(process.stdout, Stream.runCollect, Effect.map((chunks) => collectUint8Array(chunks)))\n )\n const exitCode = yield* _(process.exitCode)\n yield* _(ensureExitCode(Number(exitCode), okExitCodes, onFailure))\n return new TextDecoder(\"utf-8\").decode(bytes)\n })\n )\n","import { Data } from \"effect\"\n\nexport class FileExistsError extends Data.TaggedError(\"FileExistsError\")<{\n readonly path: string\n}> {}\n\nexport class ConfigNotFoundError extends Data.TaggedError(\"ConfigNotFoundError\")<{\n readonly path: string\n}> {}\n\nexport class ConfigDecodeError extends Data.TaggedError(\"ConfigDecodeError\")<{\n readonly path: string\n readonly message: string\n}> {}\n\nexport class InputCancelledError extends Data.TaggedError(\"InputCancelledError\")<\n Record<string, never>\n> {}\n\nexport class InputReadError extends Data.TaggedError(\"InputReadError\")<{\n readonly message: string\n}> {}\n\nexport class DockerCommandError extends Data.TaggedError(\"DockerCommandError\")<{\n readonly exitCode: number\n}> {}\n\nexport type DockerAccessIssue = \"PermissionDenied\" | \"DaemonUnavailable\"\n\nexport class DockerAccessError extends Data.TaggedError(\"DockerAccessError\")<{\n readonly issue: DockerAccessIssue\n readonly details: string\n}> {}\n\nexport class CloneFailedError extends Data.TaggedError(\"CloneFailedError\")<{\n readonly repoUrl: string\n readonly repoRef: string\n readonly targetDir: string\n}> {}\n\nexport class PortProbeError extends Data.TaggedError(\"PortProbeError\")<{\n readonly port: number\n readonly message: string\n}> {}\n\nexport class CommandFailedError extends Data.TaggedError(\"CommandFailedError\")<{\n readonly command: string\n readonly exitCode: number\n}> {}\n\nexport class AuthError extends Data.TaggedError(\"AuthError\")<{\n readonly message: string\n}> {}\n\nexport class ScrapArchiveNotFoundError extends Data.TaggedError(\"ScrapArchiveNotFoundError\")<{\n readonly path: string\n}> {}\n\nexport class ScrapArchiveInvalidError extends Data.TaggedError(\"ScrapArchiveInvalidError\")<{\n readonly path: string\n readonly message: string\n}> {}\n\nexport class ScrapTargetDirUnsupportedError extends Data.TaggedError(\"ScrapTargetDirUnsupportedError\")<{\n readonly sshUser: string\n readonly targetDir: string\n readonly reason: string\n}> {}\n\nexport class ScrapWipeRefusedError extends Data.TaggedError(\"ScrapWipeRefusedError\")<{\n readonly sshUser: string\n readonly targetDir: string\n readonly reason: string\n}> {}\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Chunk from \"effect/Chunk\"\nimport * as Stream from \"effect/Stream\"\n\nimport { DockerAccessError, type DockerAccessIssue } from \"./errors.js\"\n\nconst permissionDeniedPattern = /permission denied/i\n\nconst collectUint8Array = (chunks: Chunk.Chunk<Uint8Array>): Uint8Array =>\n Chunk.reduce(chunks, new Uint8Array(), (acc, curr) => {\n const next = new Uint8Array(acc.length + curr.length)\n next.set(acc)\n next.set(curr, acc.length)\n return next\n })\n\nconst resolveDockerHostFallbackCandidates = (): ReadonlyArray<string> => {\n if (process.env[\"DOCKER_HOST\"] !== undefined) {\n return []\n }\n\n const runtimeDir = process.env[\"XDG_RUNTIME_DIR\"]?.trim()\n const uid = typeof process.getuid === \"function\"\n ? process.getuid().toString()\n : process.env[\"UID\"]?.trim()\n\n return [\n ...new Set(\n [\n runtimeDir ? `unix://${runtimeDir}/docker.sock` : undefined,\n uid ? `unix:///run/user/${uid}/docker.sock` : undefined\n ].filter((value): value is string => value !== undefined)\n )\n ]\n}\n\nconst runDockerInfoCommand = (\n cwd: string,\n env?: Readonly<Record<string, string | undefined>>\n): Effect.Effect<\n { readonly exitCode: number; readonly details: string },\n PlatformError,\n CommandExecutor.CommandExecutor\n> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const process = yield* _(\n executor.start(\n pipe(\n Command.make(\"docker\", \"info\"),\n Command.workingDirectory(cwd),\n env ? Command.env(env) : (value) => value,\n Command.stdin(\"pipe\"),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n )\n )\n\n const stderrBytes = yield* _(\n pipe(process.stderr, Stream.runCollect, Effect.map((chunks) => collectUint8Array(chunks)))\n )\n const exitCode = Number(yield* _(process.exitCode))\n const stderr = new TextDecoder(\"utf-8\").decode(stderrBytes).trim()\n return {\n exitCode,\n details: stderr.length > 0 ? stderr : `docker info failed with exit code ${exitCode}`\n }\n })\n )\n\n// CHANGE: classify docker daemon access failure into deterministic typed reasons\n// WHY: allow callers to render actionable recovery guidance for socket permission issues\n// QUOTE(ТЗ): \"docker-git handles Docker socket permission problems predictably\"\n// REF: issue-11\n// SOURCE: n/a\n// FORMAT THEOREM: ∀m: classify(m) ∈ {\"PermissionDenied\",\"DaemonUnavailable\"}\n// PURITY: CORE\n// EFFECT: Effect<DockerAccessIssue, never, never>\n// INVARIANT: classification is stable for equal input\n// COMPLEXITY: O(|m|)\nexport const classifyDockerAccessIssue = (message: string): DockerAccessIssue =>\n permissionDeniedPattern.test(message) ? \"PermissionDenied\" : \"DaemonUnavailable\"\n\n// CHANGE: verify docker daemon access before compose/auth flows\n// WHY: fail fast on socket permission errors instead of cascading into opaque command failures\n// QUOTE(ТЗ): \"permission denied to /var/run/docker.sock\"\n// REF: issue-11\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cwd: access(cwd)=ok ∨ DockerAccessError\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerAccessError | PlatformError, CommandExecutor>\n// INVARIANT: non-zero docker info exit always maps to DockerAccessError\n// COMPLEXITY: O(command)\nexport const ensureDockerDaemonAccess = (\n cwd: string\n): Effect.Effect<void, DockerAccessError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const primaryResult = yield* _(runDockerInfoCommand(cwd))\n if (primaryResult.exitCode === 0) {\n return\n }\n\n const primaryIssue = classifyDockerAccessIssue(primaryResult.details)\n if (primaryIssue !== \"PermissionDenied\") {\n return yield* _(\n Effect.fail(\n new DockerAccessError({\n issue: primaryIssue,\n details: primaryResult.details\n })\n )\n )\n }\n\n let fallbackErrorDetails = primaryResult.details\n let fallbackIssue: DockerAccessIssue = primaryIssue\n\n for (const fallbackHost of resolveDockerHostFallbackCandidates()) {\n const fallbackResult = yield* _(\n runDockerInfoCommand(cwd, {\n ...process.env,\n DOCKER_HOST: fallbackHost\n })\n )\n\n if (fallbackResult.exitCode === 0) {\n process.env[\"DOCKER_HOST\"] = fallbackHost\n return\n }\n\n fallbackErrorDetails = fallbackResult.details\n fallbackIssue = classifyDockerAccessIssue(fallbackResult.details)\n }\n\n return yield* _(\n Effect.fail(\n new DockerAccessError({\n issue: fallbackIssue,\n details: fallbackErrorDetails\n })\n )\n )\n })\n )\n","import { ExitCode } from \"@effect/platform/CommandExecutor\"\nimport type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runCommandCapture } from \"./command-runner.js\"\nimport { CommandFailedError } from \"./errors.js\"\n\nconst publishedHostPortPattern = /:(\\d+)->/g\n\nconst parsePublishedHostPortsFromLine = (line: string): ReadonlyArray<number> => {\n const parsed: Array<number> = []\n for (const match of line.matchAll(publishedHostPortPattern)) {\n const rawPort = match[1]\n if (rawPort === undefined) {\n continue\n }\n const value = Number.parseInt(rawPort, 10)\n if (Number.isInteger(value) && value > 0 && value <= 65_535) {\n parsed.push(value)\n }\n }\n return parsed\n}\n\n// CHANGE: decode published host ports from `docker ps --format \"{{.Ports}}\"` output\n// WHY: Docker can reserve host ports via NAT even when no host TCP socket is visible\n// QUOTE(ТЗ): \"должен просто новый порт брать под себя\"\n// REF: user-request-2026-02-19-port-allocation\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in parse(output): published_by_docker(p)\n// PURITY: CORE\n// EFFECT: Effect<ReadonlyArray<number>, never, never>\n// INVARIANT: returns unique ports in encounter order\n// COMPLEXITY: O(|output|)\nexport const parseDockerPublishedHostPorts = (output: string): ReadonlyArray<number> => {\n const unique = new Set<number>()\n const parsed: Array<number> = []\n\n for (const line of output.split(/\\r?\\n/)) {\n const trimmed = line.trim()\n if (trimmed.length === 0) {\n continue\n }\n for (const port of parsePublishedHostPortsFromLine(trimmed)) {\n if (!unique.has(port)) {\n unique.add(port)\n parsed.push(port)\n }\n }\n }\n\n return parsed\n}\n\n// CHANGE: read currently published Docker host ports from running containers\n// WHY: avoid false \"free port\" results when Docker reserves ports without userland proxy sockets\n// QUOTE(ТЗ): \"а не сражаться за старый\"\n// REF: user-request-2026-02-19-port-allocation\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: published_by_running_container(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<number>, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: output ports are unique\n// COMPLEXITY: O(command + |stdout|)\nexport const runDockerPsPublishedHostPorts = (\n cwd: string\n): Effect.Effect<ReadonlyArray<number>, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"ps\", \"--format\", \"{{.Ports}}\"]\n },\n [Number(ExitCode(0))],\n (exitCode) => new CommandFailedError({ command: \"docker ps\", exitCode })\n ),\n Effect.map((output) => parseDockerPublishedHostPorts(output))\n )\n","import * as Command from \"@effect/platform/Command\"\nimport type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport { ExitCode } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Duration, Effect, Schedule, pipe } from \"effect\"\n\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"./command-runner.js\"\nimport { CommandFailedError, DockerCommandError } from \"./errors.js\"\n\nexport { classifyDockerAccessIssue, ensureDockerDaemonAccess } from \"./docker-daemon-access.js\"\nexport { parseDockerPublishedHostPorts, runDockerPsPublishedHostPorts } from \"./docker-published-ports.js\"\n\nconst composeSpec = (cwd: string, args: ReadonlyArray<string>) => ({\n cwd,\n command: \"docker\",\n args: [\"compose\", \"--ansi\", \"never\", \"--progress\", \"plain\", ...args]\n})\n\nconst parseInspectNetworkEntry = (line: string): ReadonlyArray<readonly [string, string]> => {\n const idx = line.indexOf(\"=\")\n if (idx <= 0) {\n return []\n }\n const network = line.slice(0, idx).trim()\n const ip = line.slice(idx + 1).trim()\n if (network.length === 0 || ip.length === 0) {\n return []\n }\n const entry: readonly [string, string] = [network, ip]\n return [entry]\n}\n\nconst runCompose = (\n cwd: string,\n args: ReadonlyArray<string>,\n okExitCodes: ReadonlyArray<number>\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n composeSpec(cwd, args),\n okExitCodes,\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\nconst runComposeCapture = (\n cwd: string,\n args: ReadonlyArray<string>,\n okExitCodes: ReadonlyArray<number>\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n composeSpec(cwd, args),\n okExitCodes,\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\nconst dockerComposeUpRetrySchedule = Schedule.addDelay(\n Schedule.recurs(2),\n () => Duration.seconds(2)\n)\n\nconst retryDockerComposeUp = (\n cwd: string,\n effect: Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor>\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n effect.pipe(\n Effect.tapError(() =>\n Effect.logWarning(\n `docker compose up failed in ${cwd}; retrying (possible transient Docker Hub/DNS issue)...`\n )\n ),\n Effect.retry(dockerComposeUpRetrySchedule)\n )\n\n// CHANGE: run docker compose up -d --build in the target directory\n// WHY: provide a controlled shell effect for image creation\n// QUOTE(ТЗ): \"создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> image_built(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeUp = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n retryDockerComposeUp(\n cwd,\n runCompose(cwd, [\"up\", \"-d\", \"--build\"], [Number(ExitCode(0))])\n )\n\nexport const dockerComposeUpRecreateArgs: ReadonlyArray<string> = [\n \"up\",\n \"-d\",\n \"--build\",\n \"--force-recreate\"\n]\n\n// CHANGE: recreate running containers and refresh images when needed\n// WHY: apply env/template updates while preserving workspace volumes\n// QUOTE(ТЗ): \"сбросит только окружение\"\n// REF: user-request-2026-02-11-force-env\n// SOURCE: n/a\n// FORMAT THEOREM: ∀dir: up_force_recreate(dir) → recreated(containers(dir)) ∧ preserved(volumes(dir)) ∧ updated(images(dir))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: may rebuild images but does not remove volumes\n// COMPLEXITY: O(command)\nexport const runDockerComposeUpRecreate = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n retryDockerComposeUp(\n cwd,\n runCompose(cwd, dockerComposeUpRecreateArgs, [Number(ExitCode(0))])\n )\n\n// CHANGE: run docker compose down in the target directory\n// WHY: allow stopping managed containers from the CLI/menu\n// QUOTE(ТЗ): \"Могу удалить / Отключить\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> containers_stopped(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeDown = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"down\"], [Number(ExitCode(0))])\n\n// CHANGE: run docker compose down -v in the target directory\n// WHY: allow a truly fresh environment by wiping the named volumes (e.g. /home/dev)\n// QUOTE(ТЗ): \"контейнер полностью должен же очищаться при --force\"\n// REF: user-request-2026-02-07-force-wipe-volumes\n// SOURCE: n/a\n// FORMAT THEOREM: ∀dir: down_v(dir) → removed(volumes(dir))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: removes only resources within the compose project (containers, networks, volumes)\n// COMPLEXITY: O(command)\nexport const runDockerComposeDownVolumes = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"down\", \"-v\"], [Number(ExitCode(0))])\n\n// CHANGE: recreate docker compose environment in the target directory\n// WHY: allow a clean rebuild of the container from the UI\n// QUOTE(ТЗ): \"дропнул контейнер и заново его создал\"\n// REF: user-request-2026-01-13\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: down(dir) && up(dir) -> recreated(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: down completes before up starts\n// COMPLEXITY: O(command)\nexport const runDockerComposeRecreate = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runDockerComposeDown(cwd),\n Effect.zipRight(runDockerComposeUp(cwd))\n )\n\n// CHANGE: run docker compose ps in the target directory\n// WHY: expose runtime status in the interactive menu\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) = 0 -> status_listed(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposePs = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"ps\"], [Number(ExitCode(0))])\n\n// CHANGE: capture docker compose ps output in a parseable format\n// WHY: allow structured, readable status output for CLI\n// QUOTE(ТЗ): \"информация отображалиась удобно\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: ps_fmt(dir) -> tabbed_string\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: output is tab-delimited columns from docker compose ps\n// COMPLEXITY: O(command)\nexport const runDockerComposePsFormatted = (\n cwd: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runComposeCapture(\n cwd,\n [\"ps\", \"--format\", \"{{.Name}}\\t{{.Status}}\\t{{.Ports}}\\t{{.Image}}\"],\n [Number(ExitCode(0))]\n )\n\n// CHANGE: run docker compose logs in the target directory\n// WHY: allow quick inspection of container output without leaving the menu\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: exitCode(cmd(dir)) in {0,130} -> logs_shown(dir)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeLogs = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"logs\", \"--tail\", \"200\"], [Number(ExitCode(0)), 130])\n\n// CHANGE: stream docker compose logs until interrupted\n// WHY: allow synchronous clone flow to surface container output\n// QUOTE(ТЗ): \"должно работать синхронно отображая весь процесс\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall dir: logs_follow(dir) -> stdout(stream)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: command output is inherited from the parent process\n// COMPLEXITY: O(command)\nexport const runDockerComposeLogsFollow = (\n cwd: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCompose(cwd, [\"logs\", \"--follow\", \"--tail\", \"0\"], [Number(ExitCode(0)), 130])\n\n// CHANGE: run docker exec and return its exit code\n// WHY: allow polling for clone completion markers inside the container\n// QUOTE(ТЗ): \"весь процесс от и до\"\n// REF: user-request-2026-01-28\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(docker exec cmd) = n -> deterministic(n)\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: stdout/stderr are suppressed for polling commands\n// COMPLEXITY: O(command)\nexport const runDockerExecExitCode = (\n cwd: string,\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const command = pipe(\n Command.make(\"docker\", \"exec\", containerName, ...args),\n Command.workingDirectory(cwd),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n const exitCode = yield* _(Command.exitCode(command))\n return Number(exitCode)\n })\n\n// CHANGE: inspect container IP address\n// WHY: enable per-container DNS mapping on the host\n// QUOTE(ТЗ): \"У каждого контейнера свой IP т.е свой домен\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: inspect(c) -> ip(c)\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: returns empty string when not available\n// COMPLEXITY: O(command)\nexport const runDockerInspectContainerIp = (\n cwd: string,\n containerName: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\n \"inspect\",\n \"-f\",\n // Prefer the built-in `bridge` network IP when present so the printed IP\n // works from \"external\" containers that default to `bridge`.\n // Example output:\n // bridge=172.17.0.4\n // <project>_dg-<repo>-net=192.168.64.3\n String.raw`{{range $k,$v := .NetworkSettings.Networks}}{{printf \"%s=%s\\n\" $k $v.IPAddress}}{{end}}`,\n containerName\n ]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.map((output) => {\n const lines = output\n .trim()\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n\n const entries = lines.flatMap((line) => parseInspectNetworkEntry(line))\n\n if (entries.length === 0) {\n return \"\"\n }\n\n const map = new Map(entries)\n return map.get(\"bridge\") ?? entries[0]![1]\n })\n )\n\n// CHANGE: inspect the container IP address on the default `bridge` network\n// WHY: allow callers to decide whether `docker network connect bridge` is needed\n// QUOTE(ТЗ): \"подключиться с внешнего контейнера\"\n// REF: user-request-2026-02-10-bridge-ip\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: bridge(c) → ip_bridge(c) ≠ \"\"\n// PURITY: SHELL\n// EFFECT: Effect<string, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: returns \"\" when the container is not connected to `bridge`\n// COMPLEXITY: O(command)\nexport const runDockerInspectContainerBridgeIp = (\n cwd: string,\n containerName: string\n): Effect.Effect<string, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\n \"inspect\",\n \"-f\",\n \"{{with (index .NetworkSettings.Networks \\\"bridge\\\")}}{{.IPAddress}}{{end}}\",\n containerName\n ]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.map((output) => output.trim())\n )\n\n// CHANGE: connect an existing container to the default `bridge` network\n// WHY: allow \"external\" containers (which default to `bridge`) to reach services by container IP\n// QUOTE(ТЗ): \"Всё что запущено в докере должно быть публично наружу\"\n// REF: user-request-2026-02-10-public-ports\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: up(c) → reachable(bridge_ip(c), ports(c))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: does not fail the overall flow when already connected (handled by caller)\n// COMPLEXITY: O(command)\nexport const runDockerNetworkConnectBridge = (\n cwd: string,\n containerName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"connect\", \"bridge\", containerName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ),\n Effect.asVoid\n )\n\n// CHANGE: check whether a Docker network already exists\n// WHY: allow shared-network mode to create the network only when missing\n// QUOTE(ТЗ): \"Что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: exists(n) ∈ {true,false}\n// PURITY: SHELL\n// EFFECT: Effect<boolean, PlatformError, CommandExecutor>\n// INVARIANT: returns false for non-zero inspect exit codes\n// COMPLEXITY: O(command)\nexport const runDockerNetworkExists = (\n cwd: string,\n networkName: string\n): Effect.Effect<boolean, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({\n cwd,\n command: \"docker\",\n args: [\"network\", \"inspect\", networkName]\n }).pipe(Effect.map((exitCode) => exitCode === 0))\n\n// CHANGE: create a Docker bridge network with a deterministic name\n// WHY: shared-network mode requires an external network before compose up\n// QUOTE(ТЗ): \"сделай что бы я эту ошибку больше не видел\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: create(n)=0 -> network_exists(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: network driver is always `bridge`\n// COMPLEXITY: O(command)\nexport const runDockerNetworkCreateBridge = (\n cwd: string,\n networkName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"create\", \"--driver\", \"bridge\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: create a Docker bridge network with an explicit subnet\n// WHY: allow callers to bypass default address-pool allocation when it is exhausted\n// QUOTE(ТЗ): \"научилось создавать сети правильно\"\n// REF: user-request-2026-02-20-network-fallback\n// SOURCE: n/a\n// FORMAT THEOREM: ∀(n,s): create(n,s)=0 -> exists(n) ∧ subnet(n)=s\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: network driver is always `bridge`\n// COMPLEXITY: O(command)\nexport const runDockerNetworkCreateBridgeWithSubnet = (\n cwd: string,\n networkName: string,\n subnet: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"create\", \"--driver\", \"bridge\", \"--subnet\", subnet, networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: inspect how many containers are attached to a network\n// WHY: network GC must remove only detached networks\n// QUOTE(ТЗ): \"Только так что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: count(n) = |containers(n)|\n// PURITY: SHELL\n// EFFECT: Effect<number, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: parse fallback is 0 when docker inspect output is empty\n// COMPLEXITY: O(command)\nexport const runDockerNetworkContainerCount = (\n cwd: string,\n networkName: string\n): Effect.Effect<number, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"inspect\", \"-f\", \"{{len .Containers}}\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n ).pipe(\n Effect.map((output) => {\n const parsed = Number.parseInt(output.trim(), 10)\n return Number.isNaN(parsed) ? 0 : parsed\n })\n )\n\n// CHANGE: remove a Docker network by name\n// WHY: network GC should reclaim detached project-scoped networks\n// QUOTE(ТЗ): \"убирать мусорные сети автоматически\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: rm(n)=0 -> !exists(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: removes exactly the named network\n// COMPLEXITY: O(command)\nexport const runDockerNetworkRemove = (\n cwd: string,\n networkName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"network\", \"rm\", networkName]\n },\n [Number(ExitCode(0))],\n (exitCode) => new DockerCommandError({ exitCode })\n )\n\n// CHANGE: list names of running Docker containers\n// WHY: support TUI filtering (e.g. stop only running docker-git containers)\n// QUOTE(ТЗ): \"Если я выбираю остановку контейнера значит он мне должен показывать контейнеры которые запущены\"\n// REF: user-request-2026-02-07-stop-only-running\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: c in ps -> running(c)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: result contains only non-empty container names\n// COMPLEXITY: O(command)\nexport const runDockerPsNames = (\n cwd: string\n): Effect.Effect<ReadonlyArray<string>, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runCommandCapture(\n {\n cwd,\n command: \"docker\",\n args: [\"ps\", \"--format\", \"{{.Names}}\"]\n },\n [Number(ExitCode(0))],\n (exitCode) => new CommandFailedError({ command: \"docker ps\", exitCode })\n ),\n Effect.map((output) =>\n output\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n )\n )\n","import { deriveRepoPathParts } from \"./domain.js\"\n\nexport type DockerNetworkConfig = {\n readonly subnet: string\n readonly ipAddress: string\n}\n\nconst hashRepoSeed = (value: string): number => {\n let hash = 0x81_1C_9D_C5\n for (const char of value) {\n hash ^= char.codePointAt(0) ?? 0\n hash = Math.imul(hash, 0x01_00_01_93)\n }\n return hash >>> 0\n}\n\n// CHANGE: derive a stable docker DNS hostname from repo URL\n// WHY: allow consistent per-project DNS aliases\n// QUOTE(ТЗ): \"docker.{dns}:port\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: dns(url) is deterministic\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: hostname always begins with docker.\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveDockerDnsName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl).pathParts\n return [\"docker\", ...parts].join(\".\")\n}\n\n// CHANGE: derive a stable docker subnet + IP for per-project isolation\n// WHY: avoid port conflicts by giving each container a unique IP\n// QUOTE(ТЗ): \"У каждого контейнера свой IP т.е свой домен\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall url: net(url) is deterministic\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: subnet in 172.20.0.0/16..172.31.0.0/16, IP host in [10,209]\n// COMPLEXITY: O(n) where n = |url|\nexport const deriveDockerNetworkConfig = (repoUrl: string): DockerNetworkConfig => {\n const hash = hashRepoSeed(repoUrl)\n const subnetA = 20 + (hash % 12)\n const subnetB = (hash >>> 8) & 0xFF\n const hostOctet = 10 + ((hash >>> 16) % 200)\n const subnet = `172.${subnetA}.${subnetB}.0/24`\n const ipAddress = `172.${subnetA}.${subnetB}.${hostOctet}`\n return { subnet, ipAddress }\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nimport { deriveDockerDnsName } from \"../core/docker-network.js\"\nimport { runDockerInspectContainerIp } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\n\n// CHANGE: register docker.<org>.<repo> hostname for the project\n// WHY: allow accessing container services via stable DNS\n// QUOTE(ТЗ): \"docker.{dns}:port\"\n// REF: user-request-2026-01-30-dns\n// SOURCE: n/a\n// FORMAT THEOREM: forall h: ensure(h) -> hosts(h)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem>\n// INVARIANT: adds entry once, idempotent\n// COMPLEXITY: O(n) where n = |/etc/hosts|\nexport const ensureDockerDnsHost = (\n cwd: string,\n containerName: string,\n repoUrl: string\n): Effect.Effect<\n void,\n DockerCommandError | PlatformError,\n FileSystem.FileSystem | CommandExecutor.CommandExecutor\n> => {\n const addHost = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const hostName = deriveDockerDnsName(repoUrl)\n const hostsPath = \"/etc/hosts\"\n const ipAddress = yield* _(runDockerInspectContainerIp(cwd, containerName))\n if (ipAddress.length === 0) {\n yield* _(Effect.logWarning(`Docker IP not available for ${containerName}; skipping DNS entry.`))\n return\n }\n const current = yield* _(fs.readFileString(hostsPath))\n if (current.includes(` ${hostName}`) || current.includes(`\\t${hostName}`)) {\n return\n }\n const next = `${current.trimEnd()}\\n${ipAddress} ${hostName}\\n`\n yield* _(fs.writeFileString(hostsPath, next))\n yield* _(Effect.log(`DNS alias added: ${hostName} -> ${ipAddress}`))\n })\n\n return Effect.match(addHost, {\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to update /etc/hosts for docker DNS: ${error instanceof Error ? error.message : String(error)}`\n ).pipe(Effect.asVoid),\n onSuccess: () => Effect.void\n })\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nimport { deriveDockerDnsName } from \"../core/docker-network.js\"\nimport type { CreateCommand } from \"../core/domain.js\"\nimport { runDockerInspectContainerIp } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\nimport { ensureDockerDnsHost } from \"./docker-dns.js\"\n\n// CHANGE: log docker DNS alias for the created project\n// WHY: surface the hostname users can use for container services\n// QUOTE(ТЗ): \"пусть ещё и отображает домен через который к нему можно обратиться\"\n// REF: user-request-2026-01-30-dns-log\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg: log(cfg) -> dns_alias(cfg)\n// PURITY: CORE\n// EFFECT: Effect<void, never, never>\n// INVARIANT: hostname is deterministic for repoUrl\n// COMPLEXITY: O(1)\nexport const logDockerDnsAccess = (config: CreateCommand[\"config\"]): Effect.Effect<void> =>\n Effect.log(`Docker DNS: ${deriveDockerDnsName(config.repoUrl)}`)\n\n// CHANGE: log container IP for direct access\n// WHY: allow users to access services without host port mappings\n// QUOTE(ТЗ): \"Пусть будет обращение через IP контейнера\"\n// REF: user-request-2026-02-01-ip-access\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg: ip(cfg) -> reachable(ip, port)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: logs only if IP is available\n// COMPLEXITY: O(1)\nexport const logContainerIpAccess = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const ipAddress = yield* _(runDockerInspectContainerIp(cwd, config.containerName))\n if (ipAddress.length === 0) {\n yield* _(Effect.logWarning(`Container IP not available: ${config.containerName}`))\n return\n }\n yield* _(Effect.log(`Container IP: ${ipAddress}`))\n yield* _(Effect.log(`Use: http://${ipAddress}:<port>`))\n })\n\n// CHANGE: ensure docker DNS entry and log access info together\n// WHY: keep create flow compact without losing access hints\n// QUOTE(ТЗ): \"Он должен сразу показать доступы\"\n// REF: user-request-2026-02-05-access-info\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: up(c) → dns(c) ∧ ip(c)\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, FileSystem | CommandExecutor>\n// INVARIANT: DNS entry is idempotent\n// COMPLEXITY: O(1)\nexport const logDockerAccessInfo = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<\n void,\n DockerCommandError | PlatformError,\n FileSystem.FileSystem | CommandExecutor.CommandExecutor\n> =>\n ensureDockerDnsHost(cwd, config.containerName, config.repoUrl).pipe(\n Effect.zipRight(logDockerDnsAccess(config)),\n Effect.zipRight(logContainerIpAccess(cwd, config))\n )\n","import { Match } from \"effect\"\n\nimport type { ParseError } from \"./domain.js\"\n\n// CHANGE: normalize parse errors into deterministic messages\n// WHY: reuse parse error formatting across CLI and server flows\n// QUOTE(ТЗ): \"ошибки должны быть описывающими\"\n// REF: user-request-2026-02-02-cli-split\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: format(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each ParseError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const formatParseError = (error: ParseError): string =>\n Match.value(error).pipe(\n Match.when({ _tag: \"UnknownCommand\" }, ({ command }) => `Unknown command: ${command}`),\n Match.when({ _tag: \"UnknownOption\" }, ({ option }) => `Unknown option: ${option}`),\n Match.when({ _tag: \"MissingOptionValue\" }, ({ option }) => `Missing value for option: ${option}`),\n Match.when({ _tag: \"MissingRequiredOption\" }, ({ option }) => `Missing required option: ${option}`),\n Match.when({ _tag: \"InvalidOption\" }, ({ option, reason }) => `Invalid option ${option}: ${reason}`),\n Match.when({ _tag: \"UnexpectedArgument\" }, ({ value }) => `Unexpected argument: ${value}`),\n Match.exhaustive\n )\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport { Match } from \"effect\"\nimport { type ParseError } from \"../core/domain.js\"\nimport { formatParseError } from \"../core/parse-errors.js\"\nimport type {\n AuthError,\n CloneFailedError,\n CommandFailedError,\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n InputCancelledError,\n InputReadError,\n PortProbeError,\n ScrapArchiveInvalidError,\n ScrapArchiveNotFoundError,\n ScrapTargetDirUnsupportedError,\n ScrapWipeRefusedError\n} from \"../shell/errors.js\"\n\nexport type AppError =\n | ParseError\n | FileExistsError\n | CloneFailedError\n | DockerAccessError\n | DockerCommandError\n | ConfigNotFoundError\n | ConfigDecodeError\n | ScrapArchiveInvalidError\n | ScrapArchiveNotFoundError\n | ScrapTargetDirUnsupportedError\n | ScrapWipeRefusedError\n | InputCancelledError\n | InputReadError\n | PortProbeError\n | AuthError\n | CommandFailedError\n | PlatformError\n\ntype NonParseError = Exclude<AppError, ParseError>\n\nconst isParseError = (error: AppError): error is ParseError =>\n error._tag === \"UnknownCommand\" ||\n error._tag === \"UnknownOption\" ||\n error._tag === \"MissingOptionValue\" ||\n error._tag === \"MissingRequiredOption\" ||\n error._tag === \"InvalidOption\" ||\n error._tag === \"UnexpectedArgument\"\n\nconst renderDockerAccessHeadline = (issue: DockerAccessError[\"issue\"]): string =>\n issue === \"PermissionDenied\"\n ? \"Cannot access Docker daemon socket: permission denied.\"\n : \"Cannot connect to Docker daemon.\"\n\nconst renderDockerAccessActionPlan = (issue: DockerAccessError[\"issue\"]): string => {\n const permissionDeniedPlan = [\n \"Action plan:\",\n \"1) In the same shell, run: `groups $USER` and make sure group `docker` is present.\",\n \"2) Re-login to refresh group memberships and run command again.\",\n \"3) If DOCKER_HOST is set to rootless socket, keep running: `export DOCKER_HOST=unix:///run/user/$UID/docker.sock`.\",\n \"4) If using a dedicated socket not in /run/user, set DOCKER_HOST explicitly and re-run.\",\n \"Tip: this app now auto-tries a rootless socket fallback on first permission error.\"\n ]\n\n const daemonUnavailablePlan = [\n \"Action plan:\",\n \"1) Check daemon status: `systemctl --user status docker` or `systemctl status docker`.\",\n \"2) Start daemon: `systemctl --user start docker` (or `systemctl start docker` for system Docker).\",\n \"3) Retry command in a new shell.\"\n ]\n\n return issue === \"PermissionDenied\" ? permissionDeniedPlan.join(\"\\n\") : daemonUnavailablePlan.join(\"\\n\")\n}\n\nconst renderPrimaryError = (error: NonParseError): string | null =>\n Match.value(error).pipe(\n Match.when({ _tag: \"FileExistsError\" }, ({ path }) => `File already exists: ${path} (use --force to overwrite)`),\n Match.when({ _tag: \"DockerCommandError\" }, ({ exitCode }) =>\n [\n `docker compose failed with exit code ${exitCode}`,\n \"Hint: ensure Docker daemon is running and current user can access /var/run/docker.sock (for example via the docker group).\",\n \"Hint: if output above contains 'port is already allocated', retry with a free SSH port via --ssh-port <port> (for example --ssh-port 2235), or stop the conflicting project/container.\",\n \"Hint: if output above contains 'all predefined address pools have been fully subnetted', run `docker network prune -f`, configure Docker `default-address-pools`, or use shared network mode (`--network-mode shared`).\",\n \"Hint: if output above contains 'lookup auth.docker.io' or 'read udp ... [::1]:53 ... connection refused', fix Docker DNS resolver (set working DNS in host/daemon config) and retry.\"\n ].join(\"\\n\")),\n Match.when({ _tag: \"DockerAccessError\" }, ({ details, issue }) =>\n [\n renderDockerAccessHeadline(issue),\n \"Hint: ensure Docker daemon is running and current user can access the docker socket.\",\n \"Hint: if you use rootless Docker, set DOCKER_HOST to your user socket (for example unix:///run/user/$UID/docker.sock).\",\n renderDockerAccessActionPlan(issue),\n `Details: ${details}`\n ].join(\"\\n\")),\n Match.when({ _tag: \"CloneFailedError\" }, ({ repoRef, repoUrl, targetDir }) =>\n `Clone failed for ${repoUrl} (${repoRef}) into ${targetDir}`),\n Match.when({ _tag: \"PortProbeError\" }, ({ message, port }) =>\n `SSH port check failed for ${port}: ${message}`),\n Match.when(\n { _tag: \"CommandFailedError\" },\n ({ command, exitCode }) => `${command} failed with exit code ${exitCode}`\n ),\n Match.when(\n { _tag: \"ScrapArchiveNotFoundError\" },\n ({ path }) => `Scrap archive not found: ${path} (run docker-git scrap export first)`\n ),\n Match.when(\n { _tag: \"ScrapArchiveInvalidError\" },\n ({ message, path }) => `Invalid scrap archive: ${path}\\nDetails: ${message}`\n ),\n Match.when({ _tag: \"ScrapTargetDirUnsupportedError\" }, ({ reason, targetDir }) =>\n [\n `Cannot use scrap with targetDir ${targetDir}.`,\n `Reason: ${reason}`,\n `Hint: scrap currently supports workspaces under the ssh home directory only (for example: ~/repo).`\n ].join(\"\\n\")),\n Match.when({ _tag: \"ScrapWipeRefusedError\" }, ({ reason, targetDir }) =>\n [\n `Refusing to wipe workspace for scrap import (targetDir ${targetDir}).`,\n `Reason: ${reason}`,\n \"Hint: re-run with --no-wipe, or set a narrower --target-dir when creating the project.\"\n ].join(\"\\n\")),\n Match.when({ _tag: \"AuthError\" }, ({ message }) => message),\n Match.orElse(() => null)\n )\n\nconst renderConfigError = (error: NonParseError): string | null => {\n if (error._tag === \"ConfigNotFoundError\") {\n return `docker-git.json not found: ${error.path} (run docker-git create in that directory)`\n }\n\n if (error._tag === \"ConfigDecodeError\") {\n return `Invalid docker-git.json at ${error.path}: ${error.message}`\n }\n\n return null\n}\n\nconst renderInputError = (error: NonParseError): string | null => {\n if (error._tag === \"InputCancelledError\") {\n return \"Input cancelled.\"\n }\n\n if (error._tag === \"InputReadError\") {\n return `Input error: ${error.message}`\n }\n\n return null\n}\n\nconst renderNonParseError = (error: NonParseError): string =>\n renderPrimaryError(error) ?? renderConfigError(error) ?? renderInputError(error) ?? error.message\n\n// CHANGE: render typed application errors into user-facing text\n// WHY: provide deterministic messaging for CLI and menu flows\n// QUOTE(ТЗ): \"вижу всю инфу по ним\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: render(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each AppError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const renderError = (error: AppError): string => {\n if (isParseError(error)) {\n return formatParseError(error)\n }\n\n return renderNonParseError(error)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { Effect } from \"effect\"\n\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"./command-runner.js\"\n\nexport type DockerVolume = {\n readonly hostPath: string\n readonly containerPath: string\n}\n\nexport type DockerAuthSpec = {\n readonly cwd: string\n readonly image: string\n readonly volume: DockerVolume\n readonly entrypoint?: string\n readonly user?: string\n readonly env?: string | ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n readonly interactive: boolean\n}\n\nexport const resolveDefaultDockerUser = (): string | null => {\n const getUid = Reflect.get(process, \"getuid\")\n const getGid = Reflect.get(process, \"getgid\")\n if (typeof getUid !== \"function\" || typeof getGid !== \"function\") {\n return null\n }\n const uid = getUid.call(process)\n const gid = getGid.call(process)\n if (typeof uid !== \"number\" || typeof gid !== \"number\") {\n return null\n }\n return `${uid}:${gid}`\n}\n\nconst appendEnvArgs = (base: Array<string>, env: string | ReadonlyArray<string>) => {\n if (typeof env === \"string\") {\n const trimmed = env.trim()\n if (trimmed.length > 0) {\n base.push(\"-e\", trimmed)\n }\n return\n }\n for (const entry of env) {\n const trimmed = entry.trim()\n if (trimmed.length === 0) {\n continue\n }\n base.push(\"-e\", trimmed)\n }\n}\n\nconst buildDockerArgs = (spec: DockerAuthSpec): ReadonlyArray<string> => {\n const base: Array<string> = [\"run\", \"--rm\"]\n const dockerUser = (spec.user ?? \"\").trim() || resolveDefaultDockerUser()\n if (dockerUser !== null) {\n base.push(\"--user\", dockerUser)\n }\n if (spec.interactive) {\n base.push(\"-it\")\n }\n if (spec.entrypoint && spec.entrypoint.length > 0) {\n base.push(\"--entrypoint\", spec.entrypoint)\n }\n base.push(\"-v\", `${spec.volume.hostPath}:${spec.volume.containerPath}`)\n if (spec.env !== undefined) {\n appendEnvArgs(base, spec.env)\n }\n return [...base, spec.image, ...spec.args]\n}\n\n// CHANGE: expose docker CLI args builder for advanced auth flows (stdin piping)\n// WHY: some OAuth CLIs (Claude Code) don't reliably render their input UI; docker-git needs to drive stdin explicitly\n// REF: issue-61\n// SOURCE: n/a\n// PURITY: CORE\n// INVARIANT: args match those used by runDockerAuth / runDockerAuthCapture\nexport const buildDockerAuthArgs = (spec: DockerAuthSpec): ReadonlyArray<string> => buildDockerArgs(spec)\n\n// CHANGE: run a docker auth command with controlled exit codes\n// WHY: reuse container auth flow for gh/codex\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) in ok -> success\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError | E, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuth = <E>(\n spec: DockerAuthSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<void, E | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n { cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) },\n okExitCodes,\n onFailure\n )\n\n// CHANGE: run a docker auth command and capture stdout\n// WHY: obtain tokens from container auth flows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: capture(cmd) -> stdout\n// PURITY: SHELL\n// EFFECT: Effect<string, PlatformError | E, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuthCapture = <E>(\n spec: DockerAuthSpec,\n okExitCodes: ReadonlyArray<number>,\n onFailure: (exitCode: number) => E\n): Effect.Effect<string, E | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n { cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) },\n okExitCodes,\n onFailure\n )\n\n// CHANGE: run a docker auth command and return the exit code\n// WHY: allow status checks without throwing\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: exitCode(cmd) = n\n// PURITY: SHELL\n// EFFECT: Effect<number, PlatformError, CommandExecutor>\n// INVARIANT: container is removed after execution\n// COMPLEXITY: O(command)\nexport const runDockerAuthExitCode = (\n spec: DockerAuthSpec\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({ cwd: spec.cwd, command: \"docker\", args: buildDockerArgs(spec) })\n","import { trimLeftChar, trimRightChar } from \"../core/strings.js\"\nimport type { DockerAuthSpec } from \"../shell/docker-auth.js\"\n\ntype DockerAuthSpecInput = {\n readonly cwd: string\n readonly image: string\n readonly hostPath: string\n readonly containerPath: string\n readonly entrypoint?: string\n readonly env?: string | ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n readonly interactive: boolean\n}\n\n// CHANGE: normalize auth account labels for filesystem paths\n// WHY: ensure consistent directory names across auth providers\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: label(l) -> normalized(l)\n// PURITY: CORE\n// INVARIANT: output is lowercase with hyphen separators\n// COMPLEXITY: O(n)\nexport const normalizeAccountLabel = (value: string | null, fallback: string): string => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return fallback\n }\n const normalized = trimmed.toLowerCase().replaceAll(/[^a-z0-9]+/g, \"-\")\n const withoutLeading = trimLeftChar(normalized, \"-\")\n const cleaned = trimRightChar(withoutLeading, \"-\")\n return cleaned.length > 0 ? cleaned : fallback\n}\n\n// CHANGE: build docker auth specs from common inputs\n// WHY: avoid duplication in gh/codex auth flows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall i: spec(i) -> dockerAuthSpec(i)\n// PURITY: CORE\n// INVARIANT: volume host/container paths are preserved\n// COMPLEXITY: O(1)\nexport const buildDockerAuthSpec = (input: DockerAuthSpecInput): DockerAuthSpec => ({\n cwd: input.cwd,\n image: input.image,\n volume: { hostPath: input.hostPath, containerPath: input.containerPath },\n ...(typeof input.entrypoint === \"string\" ? { entrypoint: input.entrypoint } : {}),\n ...(input.env === undefined ? {} : { env: input.env }),\n args: input.args,\n interactive: input.interactive\n})\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype EnvEntry = {\n readonly key: string\n readonly value: string\n}\n\nconst splitLines = (input: string): ReadonlyArray<string> =>\n input.replaceAll(\"\\r\\n\", \"\\n\").replaceAll(\"\\r\", \"\\n\").split(\"\\n\")\n\nconst joinLines = (lines: ReadonlyArray<string>): string => lines.join(\"\\n\")\n\nconst normalizeEnvText = (input: string): string => {\n const normalized = joinLines(splitLines(input))\n return normalized.endsWith(\"\\n\") ? normalized : `${normalized}\\n`\n}\n\nconst isAlpha = (char: string): boolean => {\n const code = char.codePointAt(0) ?? 0\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122)\n}\n\nconst isDigit = (char: string): boolean => {\n const code = char.codePointAt(0) ?? 0\n return code >= 48 && code <= 57\n}\n\nconst isValidFirstChar = (char: string): boolean => isAlpha(char) || char === \"_\"\n\nconst isValidEnvChar = (char: string): boolean => isAlpha(char) || isDigit(char) || char === \"_\"\n\nconst hasOnlyValidChars = (value: string): boolean => {\n for (const char of value) {\n if (!isValidEnvChar(char)) {\n return false\n }\n }\n return true\n}\n\nconst isEnvKey = (value: string): boolean => {\n if (value.length === 0) {\n return false\n }\n const first = value[0] ?? \"\"\n if (!isValidFirstChar(first)) {\n return false\n }\n return hasOnlyValidChars(value.slice(1))\n}\n\nconst parseEnvLine = (line: string): EnvEntry | null => {\n const trimmed = line.trim()\n if (trimmed.length === 0 || trimmed.startsWith(\"#\")) {\n return null\n }\n const raw = trimmed.startsWith(\"export \") ? trimmed.slice(\"export \".length).trimStart() : trimmed\n const eqIndex = raw.indexOf(\"=\")\n if (eqIndex <= 0) {\n return null\n }\n const key = raw.slice(0, eqIndex).trim()\n if (!isEnvKey(key)) {\n return null\n }\n const value = raw.slice(eqIndex + 1).trim()\n return { key, value }\n}\n\n// CHANGE: parse env file contents into key/value entries\n// WHY: allow updating shared auth env deterministically\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: parse(t) -> entries(t)\n// PURITY: CORE\n// INVARIANT: only valid KEY=VALUE lines are emitted\n// COMPLEXITY: O(n) where n = |lines|\nexport const parseEnvEntries = (input: string): ReadonlyArray<EnvEntry> => {\n const entries: Array<EnvEntry> = []\n for (const line of splitLines(input)) {\n const parsed = parseEnvLine(line)\n if (parsed) {\n entries.push(parsed)\n }\n }\n return entries\n}\n\n// CHANGE: resolve the latest value for an env key\n// WHY: support label-based lookups without allocating full entry lists\n// QUOTE(ТЗ): \"токенов может быть милион ... без хардкода\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall s,k: value(s,k) = last_assignment(s,k) | null\n// PURITY: CORE\n// INVARIANT: ignores commented/invalid lines and empty assignments\n// COMPLEXITY: O(n) where n = |lines|\nexport const findEnvValue = (input: string, key: string): string | null => {\n const trimmedKey = key.trim()\n if (trimmedKey.length === 0) {\n return null\n }\n const lines = splitLines(input)\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const parsed = parseEnvLine(lines[i] ?? \"\")\n if (parsed && parsed.key === trimmedKey) {\n const value = parsed.value.trim()\n return value.length > 0 ? value : null\n }\n }\n return null\n}\n\n// CHANGE: upsert a key in env contents\n// WHY: update tokens without manual edits\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall k,v: upsert(k,v) -> env(k)=v\n// PURITY: CORE\n// INVARIANT: env ends with newline\n// COMPLEXITY: O(n) where n = |lines|\nexport const upsertEnvKey = (input: string, key: string, value: string): string => {\n const sanitized = normalizeEnvText(input)\n const lines = splitLines(sanitized)\n const trimmedKey = key.trim()\n const cleaned = trimmedKey.length === 0 ? lines : lines.filter((line) => {\n const parsed = parseEnvLine(line)\n return parsed ? parsed.key !== trimmedKey : true\n })\n\n if (trimmedKey.length === 0 || value.trim().length === 0) {\n return normalizeEnvText(joinLines(cleaned))\n }\n\n return normalizeEnvText(joinLines([...cleaned, `${trimmedKey}=${value}`]))\n}\n\n// CHANGE: remove a key from env contents\n// WHY: allow token revocation\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall k: remove(k) -> !env(k)\n// PURITY: CORE\n// INVARIANT: env ends with newline\n// COMPLEXITY: O(n) where n = |lines|\nexport const removeEnvKey = (input: string, key: string): string => upsertEnvKey(input, key, \"\")\n\nexport const defaultEnvContents = \"# docker-git env\\n# KEY=value\\n\"\n\n// CHANGE: ensure env file exists\n// WHY: persist auth tokens in a stable file\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: ensure(p) -> exists(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: parent directories are created\n// COMPLEXITY: O(1)\nexport const ensureEnvFile = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n envPath: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(envPath))\n if (exists) {\n return\n }\n yield* _(fs.makeDirectory(path.dirname(envPath), { recursive: true }))\n yield* _(fs.writeFileString(envPath, defaultEnvContents))\n })\n\n// CHANGE: read env file contents\n// WHY: list and update stored tokens\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: read(p) -> contents(p)\n// PURITY: SHELL\n// EFFECT: Effect<string, PlatformError, FileSystem>\n// INVARIANT: returns default contents for missing/invalid file\n// COMPLEXITY: O(n) where n = |file|\nexport const readEnvText = (\n fs: FileSystem.FileSystem,\n envPath: string\n): Effect.Effect<string, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(envPath))\n if (!exists) {\n return defaultEnvContents\n }\n const info = yield* _(fs.stat(envPath))\n if (info.type !== \"File\") {\n return defaultEnvContents\n }\n return yield* _(fs.readFileString(envPath))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nexport const resolveAuthorizedKeysPath = (\n path: Path.Path,\n baseDir: string,\n authorizedKeysPath: string\n): string =>\n path.isAbsolute(authorizedKeysPath)\n ? authorizedKeysPath\n : path.resolve(baseDir, authorizedKeysPath)\n\nconst resolveHomeDir = (): string | null => {\n const raw = process.env[\"HOME\"] ?? process.env[\"USERPROFILE\"]\n const home = raw?.trim() ?? \"\"\n return home.length > 0 ? home : null\n}\n\nconst expandHome = (value: string, home: string | null): string => {\n if (home === null) {\n return value\n }\n if (value === \"~\") {\n return home\n }\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\n return `${home}${value.slice(1)}`\n }\n return value\n}\n\nconst trimTrailingSlash = (value: string): string => {\n let end = value.length\n while (end > 0) {\n const char = value[end - 1]\n if (char !== \"/\" && char !== \"\\\\\") {\n break\n }\n end -= 1\n }\n return value.slice(0, end)\n}\n\nexport const defaultProjectsRoot = (cwd: string): string => {\n const home = resolveHomeDir()\n const explicit = process.env[\"DOCKER_GIT_PROJECTS_ROOT\"]?.trim()\n if (explicit && explicit.length > 0) {\n return expandHome(explicit, home)\n }\n if (home !== null) {\n return `${trimTrailingSlash(home)}/.docker-git`\n }\n return `${cwd}/.docker-git`\n}\n\nconst normalizeRelativePath = (value: string): string =>\n value\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\")\n .trim()\n\nexport const resolvePathFromCwd = (\n path: Path.Path,\n cwd: string,\n targetPath: string\n): string =>\n path.isAbsolute(targetPath)\n ? targetPath\n : (() => {\n const projectsRoot = path.resolve(defaultProjectsRoot(cwd))\n const normalized = normalizeRelativePath(targetPath)\n if (normalized === \".docker-git\") {\n return projectsRoot\n }\n const prefix = \".docker-git/\"\n if (normalized.startsWith(prefix)) {\n return path.join(projectsRoot, normalized.slice(prefix.length))\n }\n return path.resolve(cwd, targetPath)\n })()\n\nexport const findExistingUpwards = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n startDir: string,\n fileName: string,\n maxDepth: number\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n let current = startDir\n\n for (let depth = 0; depth <= maxDepth; depth += 1) {\n const candidate = path.join(current, fileName)\n const exists = yield* _(fs.exists(candidate))\n if (exists) {\n return candidate\n }\n\n const parent = path.dirname(current)\n if (parent === current) {\n return null\n }\n\n current = parent\n }\n\n return null\n })\n\nexport const resolveEnvPath = (key: string): string | null => {\n const value = process.env[key]?.trim()\n return value && value.length > 0 ? value : null\n}\n\nexport const findExistingPath = (\n fs: FileSystem.FileSystem,\n candidate: string | null\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n candidate === null\n ? Effect.succeed(null)\n : Effect.flatMap(fs.exists(candidate), (exists) => (exists ? Effect.succeed(candidate) : Effect.succeed(null)))\n\nexport const findFirstExisting = (\n fs: FileSystem.FileSystem,\n candidates: ReadonlyArray<string>\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n for (const candidate of candidates) {\n const existing = yield* _(findExistingPath(fs, candidate))\n if (existing !== null) {\n return existing\n }\n }\n\n return null\n })\n\nexport type KeyLookupSpec = {\n readonly envVar: string\n readonly devKeyName: string\n readonly fallbackName?: string\n readonly homeCandidates: ReadonlyArray<string>\n}\n\nexport const findKeyByPriority = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string,\n spec: KeyLookupSpec\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const envPath = resolveEnvPath(spec.envVar)\n const envExisting = yield* _(findExistingPath(fs, envPath))\n if (envExisting !== null) {\n return envExisting\n }\n\n const devKey = yield* _(findExistingUpwards(fs, path, cwd, spec.devKeyName, 6))\n if (devKey !== null) {\n return devKey\n }\n\n if (spec.fallbackName !== undefined) {\n const fallback = yield* _(findExistingUpwards(fs, path, cwd, spec.fallbackName, 6))\n if (fallback !== null) {\n return fallback\n }\n }\n\n const home = resolveEnvPath(\"HOME\")\n if (home === null) {\n return null\n }\n\n return yield* _(\n findFirstExisting(\n fs,\n spec.homeCandidates.map((candidate) => path.join(home, \".ssh\", candidate))\n )\n )\n })\n\nconst authorizedKeysSpec: KeyLookupSpec = {\n envVar: \"DOCKER_GIT_AUTHORIZED_KEYS\",\n devKeyName: \"dev_ssh_key.pub\",\n fallbackName: \"authorized_keys\",\n homeCandidates: [\"id_ed25519.pub\", \"id_rsa.pub\"]\n}\n\nconst sshPrivateKeySpec: KeyLookupSpec = {\n envVar: \"DOCKER_GIT_SSH_KEY\",\n devKeyName: \"dev_ssh_key\",\n homeCandidates: [\"id_ed25519\", \"id_rsa\"]\n}\n\nconst makeKeyFinder = (spec: KeyLookupSpec) =>\n(\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string\n): Effect.Effect<string | null, PlatformError, FileSystem.FileSystem | Path.Path> =>\n findKeyByPriority(fs, path, cwd, spec)\n\nexport const findAuthorizedKeysSource = makeKeyFinder(authorizedKeysSpec)\n\nexport const findSshPrivateKey = makeKeyFinder(sshPrivateKeySpec)\n","import * as Command from \"@effect/platform/Command\"\nimport type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\n\nexport type DockerImageSpec = {\n readonly imageName: string\n readonly imageDir: string\n readonly dockerfile: string\n readonly buildLabel: string\n}\n\n// CHANGE: ensure a docker image is available locally\n// WHY: auth flows must not depend on external registry access\n// QUOTE(ТЗ): \"чтобы всё работало и поднималось\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall i: ensure(i) -> image_exists(i)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: image name is stable for docker-git auth\n// COMPLEXITY: O(command)\nexport const ensureDockerImage = (\n fs: FileSystem,\n path: Path,\n cwd: string,\n spec: DockerImageSpec\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const imagePath = resolvePathFromCwd(path, cwd, spec.imageDir)\n const dockerfilePath = path.join(imagePath, \"Dockerfile\")\n const imageCheck = yield* _(\n pipe(\n Command.make(\"docker\", \"image\", \"inspect\", spec.imageName),\n Command.workingDirectory(cwd),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\"),\n Command.exitCode,\n Effect.map(Number)\n )\n )\n const dockerfileExists = yield* _(fs.exists(dockerfilePath))\n const dockerfileMatches = yield* _(\n dockerfileExists\n ? Effect.gen(function*(__) {\n const info = yield* __(fs.stat(dockerfilePath))\n if (info.type !== \"File\") {\n return false\n }\n const current = yield* __(fs.readFileString(dockerfilePath))\n return current === spec.dockerfile\n })\n : Effect.succeed(false)\n )\n if (imageCheck === 0 && dockerfileMatches) {\n return\n }\n\n yield* _(fs.makeDirectory(imagePath, { recursive: true }))\n yield* _(fs.writeFileString(dockerfilePath, spec.dockerfile))\n yield* _(Effect.log(`Building ${spec.buildLabel} image (${spec.imageName})...`))\n yield* _(\n runCommandWithExitCodes(\n { cwd, command: \"docker\", args: [\"build\", \"-t\", spec.imageName, imagePath] },\n [0],\n (exitCode) => new CommandFailedError({ command: `docker build (${spec.buildLabel})`, exitCode })\n )\n )\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport type { Effect } from \"effect\"\n\nimport type { CommandFailedError } from \"../shell/errors.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\n\nexport const ghAuthRoot = \".docker-git/.orch/auth/gh\"\nexport const ghAuthDir = \"/root/.config/gh\"\nexport const ghImageName = \"docker-git-auth-gh:latest\"\nexport const ghImageDir = \".docker-git/.orch/auth/gh/.image\"\n\nexport const renderGhDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends ca-certificates curl gnupg bsdutils \\\n && mkdir -p /etc/apt/keyrings \\\n && curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \\\n | gpg --dearmor -o /etc/apt/keyrings/githubcli-archive-keyring.gpg \\\n && chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \\\n && echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main\" \\\n > /etc/apt/sources.list.d/github-cli.list \\\n && apt-get update \\\n && apt-get install -y --no-install-recommends gh git \\\n && rm -rf /var/lib/apt/lists/*\nENTRYPOINT [\"gh\"]\n`\n\n// CHANGE: centralize gh auth image build for reuse\n// WHY: avoid duplicated docker image logic across gh workflows\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: ∀l: ensure(l) → image_exists(gh)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: dockerfile content is stable\n// COMPLEXITY: O(command)\nexport const ensureGhAuthImage = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n cwd: string,\n buildLabel: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n ensureDockerImage(fs, path, cwd, {\n imageName: ghImageName,\n imageDir: ghImageDir,\n dockerfile: renderGhDockerfile(),\n buildLabel\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype FsPathContext = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly cwd: string\n}\n\n// CHANGE: provide a shared FileSystem/Path context for usecases\n// WHY: avoid duplicated setup across shell workflows\n// QUOTE(ТЗ): \"минимальный корректный diff\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall run: ctx(run) -> fs,path,cwd\n// PURITY: SHELL\n// EFFECT: Effect<A, PlatformError, FileSystem | Path>\n// INVARIANT: cwd is captured once per call\n// COMPLEXITY: O(1)\nexport const withFsPathContext = <A, E, R>(\n run: (context: FsPathContext) => Effect.Effect<A, E, R>\n): Effect.Effect<A, E | PlatformError, R | FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n return yield* _(run({ fs, path, cwd: process.cwd() }))\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../core/domain.js\"\nimport { parseGithubRepoUrl } from \"../core/repo.js\"\nimport { runDockerAuthCapture } from \"../shell/docker-auth.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec } from \"./auth-helpers.js\"\nimport { parseEnvEntries, readEnvText } from \"./env-file.js\"\nimport { ensureGhAuthImage, ghAuthDir, ghAuthRoot, ghImageName } from \"./github-auth-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\ntype GithubForkRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveGithubToken = (envText: string): string | null => {\n const entries = parseEnvEntries(envText)\n const direct = entries.find((entry) => entry.key === \"GITHUB_TOKEN\" || entry.key === \"GH_TOKEN\")\n if (direct && direct.value.trim().length > 0) {\n return direct.value.trim()\n }\n const labeled = entries.find((entry) => entry.key.startsWith(\"GITHUB_TOKEN__\"))\n return labeled && labeled.value.trim().length > 0 ? labeled.value.trim() : null\n}\n\nconst runGhApiCapture = (\n cwd: string,\n hostPath: string,\n token: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthCapture(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath,\n containerPath: ghAuthDir,\n env: `GH_TOKEN=${token}`,\n args: [\"api\", ...args],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: `gh api ${args.join(\" \")}`, exitCode })\n ).pipe(Effect.map((raw) => raw.trim()))\n\nconst runGhApiCloneUrl = (\n cwd: string,\n hostPath: string,\n token: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCapture(cwd, hostPath, token, args).pipe(\n Effect.catchTag(\"CommandFailedError\", () => Effect.succeed(\"\")),\n Effect.map((raw) => (raw.length === 0 ? null : raw))\n )\n\nconst resolveViewerLogin = (\n cwd: string,\n hostPath: string,\n token: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const command = \"gh api /user --jq .login\"\n const raw = yield* _(runGhApiCapture(cwd, hostPath, token, [\"/user\", \"--jq\", \".login\"]))\n if (raw.length === 0) {\n return yield* _(Effect.fail(new CommandFailedError({ command, exitCode: 1 })))\n }\n return raw\n })\n\nconst resolveRepoCloneUrl = (\n cwd: string,\n hostPath: string,\n token: string,\n fullName: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCloneUrl(cwd, hostPath, token, [`/repos/${fullName}`, \"--jq\", \".clone_url\"])\n\nconst createFork = (\n cwd: string,\n hostPath: string,\n token: string,\n owner: string,\n repo: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runGhApiCloneUrl(cwd, hostPath, token, [\n \"-X\",\n \"POST\",\n `/repos/${owner}/${repo}/forks`,\n \"--jq\",\n \".clone_url\"\n ])\n\n// CHANGE: resolve a fork URL for GitHub repos when a token is available\n// WHY: allow docker-git clone to auto-fork issue URLs for push access\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀r: github(r) ∧ token → fork(r)=url ∨ null\n// PURITY: SHELL\n// EFFECT: Effect<string | null, PlatformError | CommandFailedError, CommandExecutor>\n// INVARIANT: returns null when token or repo parsing is missing\n// COMPLEXITY: O(1) API calls\nexport const resolveGithubForkUrl = (\n repoUrl: string,\n envGlobalPath: string\n): Effect.Effect<string | null, PlatformError | CommandFailedError, GithubForkRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n const repo = parseGithubRepoUrl(repoUrl)\n if (!repo) {\n return null\n }\n const envPath = resolvePathFromCwd(path, cwd, envGlobalPath)\n const envText = yield* _(readEnvText(fs, envPath))\n const token = resolveGithubToken(envText)\n if (!token) {\n yield* _(Effect.logWarning(\"GitHub token missing; skipping auto-fork.\"))\n return null\n }\n const ghRoot = resolvePathFromCwd(path, cwd, ghAuthRoot)\n yield* _(fs.makeDirectory(ghRoot, { recursive: true }))\n yield* _(ensureGhAuthImage(fs, path, cwd, \"gh api\"))\n const viewer = yield* _(resolveViewerLogin(cwd, ghRoot, token))\n if (viewer.toLowerCase() === repo.owner.toLowerCase()) {\n return null\n }\n const forkFullName = `${viewer}/${repo.repo}`\n const existingFork = yield* _(resolveRepoCloneUrl(cwd, ghRoot, token, forkFullName))\n if (existingFork !== null) {\n return existingFork\n }\n return yield* _(createFork(cwd, ghRoot, token, repo.owner, repo.repo))\n })\n )\n\n// CHANGE: apply auto-fork URL to create configs when available\n// WHY: keep create flow small while enabling fork-aware remotes\n// QUOTE(ТЗ): \"Сразу на issues и он бы делал форк репы если это надо\"\n// REF: user-request-2026-02-05-issues-fork\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: fork(c) → config(c)=config(c)+forkUrl\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, never, FileSystem | Path | CommandExecutor>\n// INVARIANT: failures do not abort project creation\n// COMPLEXITY: O(1) API calls\nexport const applyGithubForkConfig = (\n config: CreateCommand[\"config\"]\n): Effect.Effect<CreateCommand[\"config\"], never, GithubForkRuntime> =>\n resolveGithubForkUrl(config.repoUrl, config.envGlobalPath).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Auto-fork failed; continuing without fork. (${error instanceof Error ? error.message : String(error)})`\n ).pipe(Effect.as(config)),\n onSuccess: (forkUrl) => Effect.succeed(forkUrl ? { ...config, forkRepoUrl: forkUrl } : config)\n })\n )\n","import type { ProjectConfig } from \"../core/domain.js\"\n\nexport { defaultProjectsRoot, findSshPrivateKey, resolveAuthorizedKeysPath } from \"./path-helpers.js\"\n\nexport const isRepoUrlInput = (input: string): boolean => {\n const trimmed = input.trim().toLowerCase()\n return trimmed.startsWith(\"http://\") ||\n trimmed.startsWith(\"https://\") ||\n trimmed.startsWith(\"ssh://\") ||\n trimmed.startsWith(\"git@\")\n}\n\nexport const formatConnectionInfo = (\n cwd: string,\n config: ProjectConfig,\n authorizedKeysPath: string,\n authorizedKeysExists: boolean,\n sshCommand: string\n): string =>\n `Project directory: ${cwd}\n` +\n `Container: ${config.template.containerName}\n` +\n `Service: ${config.template.serviceName}\n` +\n `SSH command: ${sshCommand}\n` +\n `Repo: ${config.template.repoUrl} (${config.template.repoRef})\n` +\n `Workspace: ${config.template.targetDir}\n` +\n `Authorized keys: ${authorizedKeysPath}${authorizedKeysExists ? \"\" : \" (missing)\"}\n` +\n `Env global: ${config.template.envGlobalPath}\n` +\n `Env project: ${config.template.envProjectPath}\n` +\n `Codex auth: ${config.template.codexAuthPath} -> ${config.template.codexHome}`\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype ResolvedContext = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly resolved: string\n}\n\nexport const resolveBaseDir = (\n baseDir: string\n): Effect.Effect<ResolvedContext, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const resolved = path.resolve(baseDir)\n\n return { fs, path, resolved }\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport { defaultTemplateConfig, type ProjectConfig } from \"../core/domain.js\"\nimport { ConfigDecodeError, ConfigNotFoundError } from \"./errors.js\"\nimport { resolveBaseDir } from \"./paths.js\"\n\nconst TemplateConfigSchema = Schema.Struct({\n containerName: Schema.String,\n serviceName: Schema.String,\n sshUser: Schema.String,\n sshPort: Schema.Number.pipe(Schema.int()),\n repoUrl: Schema.String,\n repoRef: Schema.String,\n gitTokenLabel: Schema.optional(Schema.String),\n codexAuthLabel: Schema.optional(Schema.String),\n claudeAuthLabel: Schema.optional(Schema.String),\n targetDir: Schema.String,\n volumeName: Schema.String,\n dockerGitPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.dockerGitPath\n }),\n authorizedKeysPath: Schema.String,\n envGlobalPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.envGlobalPath\n }),\n envProjectPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.envProjectPath\n }),\n codexAuthPath: Schema.String,\n codexSharedAuthPath: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.codexSharedAuthPath\n }),\n codexHome: Schema.String,\n dockerNetworkMode: Schema.optionalWith(Schema.Literal(\"shared\", \"project\"), {\n default: () => defaultTemplateConfig.dockerNetworkMode\n }),\n dockerSharedNetworkName: Schema.optionalWith(Schema.String, {\n default: () => defaultTemplateConfig.dockerSharedNetworkName\n }),\n enableMcpPlaywright: Schema.optionalWith(Schema.Boolean, {\n default: () => defaultTemplateConfig.enableMcpPlaywright\n }),\n pnpmVersion: Schema.String\n})\n\nconst ProjectConfigSchema = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n template: TemplateConfigSchema\n})\n\nconst ProjectConfigJsonSchema = Schema.parseJson(ProjectConfigSchema)\n\nconst decodeProjectConfig = (\n path: string,\n input: string\n): Effect.Effect<ProjectConfig, ConfigDecodeError> =>\n Either.match(ParseResult.decodeUnknownEither(ProjectConfigJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ConfigDecodeError({\n path,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n\n// CHANGE: read and decode docker-git.json from disk\n// WHY: keep unknown inputs at the boundary and validate with schema\n// QUOTE(ТЗ): \"интерфейс в котором можно авторизировать все что мы хотим иметь\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: decode(read(p)) = cfg -> cfg.schemaVersion = 1\n// PURITY: SHELL\n// EFFECT: Effect<ProjectConfig, ConfigNotFoundError | ConfigDecodeError | PlatformError, FileSystem | Path>\n// INVARIANT: unknown input never leaks past this boundary\n// COMPLEXITY: O(n) where n = |file|\nexport const readProjectConfig = (\n baseDir: string\n): Effect.Effect<\n ProjectConfig,\n ConfigNotFoundError | ConfigDecodeError | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(baseDir))\n const configPath = path.join(resolved, \"docker-git.json\")\n\n const exists = yield* _(fs.exists(configPath))\n if (!exists) {\n return yield* _(Effect.fail(new ConfigNotFoundError({ path: configPath })))\n }\n\n const contents = yield* _(fs.readFileString(configPath))\n return yield* _(decodeProjectConfig(configPath, contents))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\ntype DockerGitConfigSearchState = {\n readonly stack: Array<string>\n readonly results: Array<string>\n}\n\nconst isDockerGitConfig = (entry: string): boolean => entry.endsWith(\"docker-git.json\")\n\nconst shouldSkipDir = (entry: string): boolean =>\n entry === \".git\" || entry === \".orch\" || entry === \".docker-git\" || entry === \".cache\"\n\nconst isNotFoundStatError = (error: PlatformError): boolean =>\n error._tag === \"SystemError\" && error.reason === \"NotFound\"\n\nconst processDockerGitEntry = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n dir: string,\n entry: string,\n state: DockerGitConfigSearchState\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n if (shouldSkipDir(entry)) {\n return\n }\n\n const resolved = path.join(dir, entry)\n const info = yield* _(\n fs.stat(resolved).pipe(\n Effect.catchTag(\"SystemError\", (error) =>\n isNotFoundStatError(error)\n ? Effect.succeed(null)\n : Effect.fail(error))\n )\n )\n if (info === null) {\n return\n }\n if (info.type === \"Directory\") {\n state.stack.push(resolved)\n return\n }\n\n if (info.type === \"File\" && isDockerGitConfig(entry)) {\n state.results.push(resolved)\n }\n }).pipe(Effect.asVoid)\n\nexport const findDockerGitConfigPaths = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n rootDir: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(rootDir))\n if (!exists) {\n return []\n }\n\n // Avoid traversing git metadata (projectsRoot can itself be a git repo).\n const results: Array<string> = []\n const stack: Array<string> = [rootDir]\n const state: DockerGitConfigSearchState = { stack, results }\n while (stack.length > 0) {\n const dir = stack.pop()\n if (dir === undefined) {\n break\n }\n\n const entries = yield* _(fs.readDirectory(dir))\n for (const entry of entries) {\n yield* _(processDockerGitEntry(fs, path, dir, entry, state))\n }\n }\n\n return results\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { ProjectConfig, TemplateConfig } from \"../core/domain.js\"\nimport { deriveRepoPathParts } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport type { ConfigDecodeError, ConfigNotFoundError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\nimport { renderError } from \"./errors.js\"\nimport { defaultProjectsRoot, formatConnectionInfo } from \"./menu-helpers.js\"\nimport { findSshPrivateKey, resolveAuthorizedKeysPath, resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\nconst sshOptions = \"-tt -Y -o LogLevel=ERROR -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\"\n\nexport type ProjectLoadError = PlatformError | ConfigNotFoundError | ConfigDecodeError\n\nexport const buildSshCommand = (\n config: TemplateConfig,\n sshKey: string | null\n): string =>\n sshKey === null\n ? `ssh ${sshOptions} -p ${config.sshPort} ${config.sshUser}@localhost`\n : `ssh -i ${sshKey} ${sshOptions} -p ${config.sshPort} ${config.sshUser}@localhost`\n\nexport type ProjectSummary = {\n readonly projectDir: string\n readonly config: ProjectConfig\n readonly sshCommand: string\n readonly authorizedKeysPath: string\n readonly authorizedKeysExists: boolean\n}\n\nexport type ProjectItem = {\n readonly projectDir: string\n readonly displayName: string\n readonly repoUrl: string\n readonly repoRef: string\n readonly containerName: string\n readonly serviceName: string\n readonly sshUser: string\n readonly sshPort: number\n readonly targetDir: string\n readonly sshCommand: string\n readonly sshKeyPath: string | null\n readonly authorizedKeysPath: string\n readonly authorizedKeysExists: boolean\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexHome: string\n}\n\nexport type ProjectStatus = {\n readonly projectDir: string\n readonly config: ProjectConfig\n}\n\ntype ComposePsRow = {\n readonly name: string\n readonly status: string\n readonly ports: string\n readonly image: string\n}\n\ntype ProjectBase = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly projectDir: string\n readonly config: ProjectConfig\n}\n\nconst loadProjectBase = (\n configPath: string\n): Effect.Effect<ProjectBase, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(configPath))\n const projectDir = path.dirname(resolved)\n const config = yield* _(readProjectConfig(projectDir))\n return { fs, path, projectDir, config }\n })\n\nconst findProjectConfigPaths = (\n projectsRoot: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) => findDockerGitConfigPaths(fs, path, path.resolve(projectsRoot)))\n\nexport const loadProjectSummary = (\n configPath: string,\n sshKey: string | null\n): Effect.Effect<ProjectSummary, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, fs, path, projectDir } = yield* _(loadProjectBase(configPath))\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(\n path,\n projectDir,\n config.template.authorizedKeysPath\n )\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshCommand = buildSshCommand(config.template, sshKey)\n\n return {\n projectDir,\n config,\n sshCommand,\n authorizedKeysPath: resolvedAuthorizedKeys,\n authorizedKeysExists: authExists\n }\n })\n\nexport const loadProjectStatus = (\n configPath: string\n): Effect.Effect<ProjectStatus, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, projectDir } = yield* _(loadProjectBase(configPath))\n return { projectDir, config }\n })\n\nexport const renderProjectSummary = (summary: ProjectSummary): string =>\n formatConnectionInfo(\n summary.projectDir,\n summary.config,\n summary.authorizedKeysPath,\n summary.authorizedKeysExists,\n summary.sshCommand\n )\n\nconst formatDisplayName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl)\n if (parts.pathParts.length > 0) {\n return parts.pathParts.join(\"/\")\n }\n return repoUrl\n}\n\nexport const loadProjectItem = (\n configPath: string,\n sshKey: string | null\n): Effect.Effect<ProjectItem, ProjectLoadError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const { config, fs, path, projectDir } = yield* _(loadProjectBase(configPath))\n const template = config.template\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(path, projectDir, template.authorizedKeysPath)\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshCommand = buildSshCommand(template, sshKey)\n const displayName = formatDisplayName(template.repoUrl)\n\n return {\n projectDir,\n displayName,\n repoUrl: template.repoUrl,\n repoRef: template.repoRef,\n containerName: template.containerName,\n serviceName: template.serviceName,\n sshUser: template.sshUser,\n sshPort: template.sshPort,\n targetDir: template.targetDir,\n sshCommand,\n sshKeyPath: sshKey,\n authorizedKeysPath: resolvedAuthorizedKeys,\n authorizedKeysExists: authExists,\n envGlobalPath: resolvePathFromCwd(path, projectDir, template.envGlobalPath),\n envProjectPath: resolvePathFromCwd(path, projectDir, template.envProjectPath),\n codexAuthPath: resolvePathFromCwd(path, projectDir, template.codexAuthPath),\n codexHome: template.codexHome\n }\n })\n\nexport const renderProjectStatusHeader = (status: ProjectStatus): string => `Project: ${status.projectDir}`\n\nexport const skipWithWarning = <A>(configPath: string) => (error: ProjectLoadError) =>\n pipe(\n Effect.logWarning(`Skipping ${configPath}: ${renderError(error)}`),\n Effect.as<A | null>(null)\n )\n\nexport const forEachProjectStatus = <E, R>(\n configPaths: ReadonlyArray<string>,\n run: (status: ProjectStatus) => Effect.Effect<void, E, R>\n): Effect.Effect<void, E | PlatformError, R | FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n for (const configPath of configPaths) {\n const status = yield* _(\n loadProjectStatus(configPath).pipe(\n Effect.matchEffect({\n onFailure: skipWithWarning<ProjectStatus>(configPath),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (status === null) {\n continue\n }\n yield* _(run(status))\n }\n }).pipe(Effect.asVoid)\n\nconst normalizeCell = (value: string | undefined): string => value?.trim() ?? \"-\"\n\nconst parseComposeLine = (line: string): ComposePsRow => {\n const [name, status, ports, image] = line.split(\"\\t\")\n return {\n name: normalizeCell(name),\n status: normalizeCell(status),\n ports: normalizeCell(ports),\n image: normalizeCell(image)\n }\n}\n\nexport const parseComposePsOutput = (raw: string): ReadonlyArray<ComposePsRow> => {\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0)\n return lines.map((line) => parseComposeLine(line))\n}\n\nconst padRight = (value: string, width: number): string =>\n value.length >= width ? value : `${value}${\" \".repeat(width - value.length)}`\n\nexport const formatComposeRows = (entries: ReadonlyArray<ComposePsRow>): string => {\n if (entries.length === 0) {\n return \" status: not running\"\n }\n const nameWidth = Math.min(24, Math.max(...entries.map((row) => row.name.length), \"name\".length))\n const statusWidth = Math.min(28, Math.max(...entries.map((row) => row.status.length), \"status\".length))\n const portsWidth = Math.min(28, Math.max(...entries.map((row) => row.ports.length), \"ports\".length))\n const header = ` ${padRight(\"name\", nameWidth)} ${padRight(\"status\", statusWidth)} ${\n padRight(\"ports\", portsWidth)\n } image`\n const lines = entries.map((row) =>\n ` ${padRight(row.name, nameWidth)} ${padRight(row.status, statusWidth)} ${\n padRight(row.ports, portsWidth)\n } ${row.image}`\n )\n return [header, ...lines].join(\"\\n\")\n}\n\ntype ProjectIndex = {\n readonly projectsRoot: string\n readonly configPaths: ReadonlyArray<string>\n}\n\nexport const loadProjectIndex = (): Effect.Effect<\n ProjectIndex | null,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const projectsRoot = defaultProjectsRoot(process.cwd())\n const configPaths = yield* _(findProjectConfigPaths(projectsRoot))\n if (configPaths.length === 0) {\n yield* _(Effect.log(`No docker-git projects found in ${projectsRoot}`))\n return null\n }\n return { projectsRoot, configPaths }\n })\n\nexport const withProjectIndexAndSsh = <A, E, R>(\n run: (index: ProjectIndex, sshKey: string | null) => Effect.Effect<A, E, R>\n): Effect.Effect<A | null, PlatformError | E, FileSystem.FileSystem | Path.Path | R> =>\n pipe(\n loadProjectIndex(),\n Effect.flatMap((index) =>\n index === null\n ? Effect.succeed(null)\n : Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n return yield* _(run(index, sshKey))\n })\n )\n )\n","export const isTruthyEnv = (value: string): boolean => {\n const normalized = value.trim().toLowerCase()\n return normalized === \"1\" || normalized === \"true\" || normalized === \"yes\" || normalized === \"on\"\n}\n\nexport const isFalsyEnv = (value: string): boolean => {\n const normalized = value.trim().toLowerCase()\n return normalized === \"0\" || normalized === \"false\" || normalized === \"no\" || normalized === \"off\"\n}\n\nexport const autoSyncEnvKey = \"DOCKER_GIT_STATE_AUTO_SYNC\"\nexport const autoSyncStrictEnvKey = \"DOCKER_GIT_STATE_AUTO_SYNC_STRICT\"\n\nexport const defaultSyncMessage = \"chore(state): sync\"\n\nexport const isAutoSyncEnabled = (envValue: string | undefined, hasRemote: boolean): boolean => {\n if (envValue === undefined) {\n return hasRemote\n }\n if (envValue.trim().length === 0) {\n return hasRemote\n }\n if (isFalsyEnv(envValue)) {\n return false\n }\n if (isTruthyEnv(envValue)) {\n return true\n }\n // Non-empty values default to enabled.\n return true\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport { ExitCode } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect } from \"effect\"\nimport { runCommandCapture, runCommandExitCode, runCommandWithExitCodes } from \"../../shell/command-runner.js\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\n\nexport const successExitCode = Number(ExitCode(0))\n\nexport const gitBaseEnv: Readonly<Record<string, string>> = {\n // Avoid blocking on interactive credential prompts in CI / TUI contexts.\n GIT_TERMINAL_PROMPT: \"0\"\n}\n\nexport const git = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n { cwd, command: \"git\", args, env },\n [successExitCode],\n (exitCode) => new CommandFailedError({ command: `git ${args[0] ?? \"\"}`, exitCode })\n )\n\nexport const gitExitCode = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandExitCode({ cwd, command: \"git\", args, env })\n\nexport const gitCapture = (\n cwd: string,\n args: ReadonlyArray<string>,\n env: Readonly<Record<string, string | undefined>> = gitBaseEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n { cwd, command: \"git\", args, env },\n [successExitCode],\n (exitCode) => new CommandFailedError({ command: `git ${args[0] ?? \"\"}`, exitCode })\n )\n\nexport const isGitRepo = (root: string) =>\n Effect.map(gitExitCode(root, [\"rev-parse\", \"--is-inside-work-tree\"]), (exit) => exit === successExitCode)\n\nexport const hasOriginRemote = (root: string) =>\n Effect.map(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"]), (exit) => exit === successExitCode)\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { parseEnvEntries } from \"../env-file.js\"\nimport { gitBaseEnv } from \"./git-commands.js\"\n\nconst githubTokenKey = \"GITHUB_TOKEN\"\n\nconst githubHttpsRemoteRe = /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+?)(?:\\.git)?$/\nconst githubSshRemoteRe = /^git@github\\.com:([^/]+)\\/(.+?)(?:\\.git)?$/\nconst githubSshUrlRemoteRe = /^ssh:\\/\\/git@github\\.com\\/([^/]+)\\/(.+?)(?:\\.git)?$/\n\ntype GithubRemoteParts = {\n readonly owner: string\n readonly repo: string\n}\n\nconst tryParseGithubRemoteParts = (originUrl: string): GithubRemoteParts | null => {\n const trimmed = originUrl.trim()\n const match = githubHttpsRemoteRe.exec(trimmed) ??\n githubSshRemoteRe.exec(trimmed) ??\n githubSshUrlRemoteRe.exec(trimmed)\n if (match === null) {\n return null\n }\n const owner = match[1] ?? \"\"\n const repo = match[2] ?? \"\"\n return owner.length > 0 && repo.length > 0 ? { owner, repo } : null\n}\n\nexport const tryBuildGithubCompareUrl = (\n originUrl: string,\n baseBranch: string,\n headBranch: string\n): string | null => {\n const parts = tryParseGithubRemoteParts(originUrl)\n if (parts === null) {\n return null\n }\n return `https://github.com/${parts.owner}/${parts.repo}/compare/${encodeURIComponent(baseBranch)}...${\n encodeURIComponent(headBranch)\n }?expand=1`\n}\n\nexport const isGithubHttpsRemote = (url: string): boolean => /^https:\\/\\/github\\.com\\//.test(url.trim())\n\nconst resolveTokenFromProcessEnv = (): string | null => {\n const github = process.env[\"GITHUB_TOKEN\"]\n if (github !== undefined) {\n const trimmed = github.trim()\n if (trimmed.length > 0) {\n return trimmed\n }\n }\n\n const gh = process.env[\"GH_TOKEN\"]\n if (gh !== undefined) {\n const trimmed = gh.trim()\n if (trimmed.length > 0) {\n return trimmed\n }\n }\n\n return null\n}\n\ntype EnvEntry = {\n readonly key: string\n readonly value: string\n}\n\nconst findTokenInEnvEntries = (entries: ReadonlyArray<EnvEntry>): string | null => {\n const directEntry = entries.find((e) => e.key === githubTokenKey)\n if (directEntry !== undefined) {\n const direct = directEntry.value.trim()\n if (direct.length > 0) {\n return direct\n }\n }\n\n const labeledEntry = entries.find((e) => e.key.startsWith(\"GITHUB_TOKEN__\"))\n if (labeledEntry !== undefined) {\n const labeled = labeledEntry.value.trim()\n if (labeled.length > 0) {\n return labeled\n }\n }\n\n return null\n}\n\nexport const resolveGithubToken = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<string | null, PlatformError> =>\n Effect.gen(function*(_) {\n const fromEnv = resolveTokenFromProcessEnv()\n if (fromEnv !== null) {\n return fromEnv\n }\n\n const candidates: ReadonlyArray<string> = [\n // Canonical layout: ~/.docker-git/.orch/env/global.env\n path.join(root, \".orch\", \"env\", \"global.env\"),\n // Legacy layout (kept for backward compatibility): ~/.docker-git/secrets/global.env\n path.join(root, \"secrets\", \"global.env\")\n ]\n\n for (const envPath of candidates) {\n const exists = yield* _(fs.exists(envPath))\n if (!exists) {\n continue\n }\n const text = yield* _(fs.readFileString(envPath))\n const token = findTokenInEnvEntries(parseEnvEntries(text))\n if (token !== null) {\n return token\n }\n }\n\n return null\n })\n\nexport type GitAuthEnv = Readonly<Record<string, string | undefined>>\n\nexport const withGithubAskpassEnv = <A, E, R>(\n token: string,\n use: (env: GitAuthEnv) => Effect.Effect<A, E, R>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | R> =>\n Effect.scoped(\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const askpassPath = yield* _(fs.makeTempFileScoped({ prefix: \"docker-git-askpass-\" }))\n const contents = [\n \"#!/bin/sh\",\n \"case \\\"$1\\\" in\",\n \" *Username*) echo \\\"x-access-token\\\" ;;\",\n \" *Password*) echo \\\"${DOCKER_GIT_GITHUB_TOKEN}\\\" ;;\",\n \" *) echo \\\"${DOCKER_GIT_GITHUB_TOKEN}\\\" ;;\",\n \"esac\",\n \"\"\n ].join(\"\\n\")\n yield* _(fs.writeFileString(askpassPath, contents))\n yield* _(fs.chmod(askpassPath, 0o700))\n const env: GitAuthEnv = {\n ...gitBaseEnv,\n DOCKER_GIT_GITHUB_TOKEN: token,\n GIT_ASKPASS: askpassPath,\n GIT_ASKPASS_REQUIRE: \"force\"\n }\n return yield* _(use(env))\n })\n )\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nconst stateGitignoreMarker = \"# docker-git state repository\"\n\nconst legacySecretIgnorePatterns: ReadonlyArray<string> = [\n \"**/.orch/env/\",\n \"**/.orch/auth/\"\n]\n\nconst volatileCodexIgnorePatterns: ReadonlyArray<string> = [\n \"**/.orch/auth/codex/log/\",\n \"**/.orch/auth/codex/tmp/\",\n \"**/.orch/auth/codex/sessions/\",\n \"**/.orch/auth/codex/models_cache.json\"\n]\n\nconst repositoryCacheIgnorePatterns: ReadonlyArray<string> = [\n \".cache/git-mirrors/\",\n \".cache/packages/\"\n]\n\nconst defaultStateGitignore = [\n stateGitignoreMarker,\n \"# NOTE: this repo intentionally tracks EVERYTHING under the state dir, including .orch/env and .orch/auth.\",\n \"# Keep the remote private; treat it as sensitive infrastructure state.\",\n \"\",\n \"# Shared repository caches (do not commit)\",\n ...repositoryCacheIgnorePatterns,\n \"\",\n \"# Volatile Codex artifacts (do not commit)\",\n ...volatileCodexIgnorePatterns,\n \"\"\n].join(\"\\n\")\n\nconst normalizeGitignoreText = (text: string): string =>\n text\n .replaceAll(\"\\r\\n\", \"\\n\")\n .trim()\n\ntype MissingManagedPatterns = {\n readonly repositoryCache: ReadonlyArray<string>\n readonly volatileCodex: ReadonlyArray<string>\n}\n\nconst collectMissingManagedPatterns = (prevLines: ReadonlySet<string>): MissingManagedPatterns => ({\n repositoryCache: repositoryCacheIgnorePatterns.filter((p) => !prevLines.has(p)),\n volatileCodex: volatileCodexIgnorePatterns.filter((p) => !prevLines.has(p))\n})\n\nconst hasMissingManagedPatterns = (missing: MissingManagedPatterns): boolean =>\n missing.repositoryCache.length > 0 || missing.volatileCodex.length > 0\n\nconst appendManagedBlocks = (\n prev: string,\n missing: MissingManagedPatterns\n): string => {\n const blocks = [\n missing.repositoryCache.length > 0\n ? `# Shared repository caches (do not commit)\\n${missing.repositoryCache.join(\"\\n\")}`\n : \"\",\n missing.volatileCodex.length > 0\n ? `# Volatile Codex artifacts (do not commit)\\n${missing.volatileCodex.join(\"\\n\")}`\n : \"\"\n ].filter((block) => block.length > 0)\n return `${[prev.trimEnd(), ...blocks].join(\"\\n\\n\")}\\n`\n}\n\nexport const ensureStateGitignore = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const gitignorePath = path.join(root, \".gitignore\")\n const exists = yield* _(fs.exists(gitignorePath))\n if (!exists) {\n yield* _(fs.writeFileString(gitignorePath, defaultStateGitignore))\n return\n }\n\n const stat = yield* _(fs.stat(gitignorePath))\n if (stat.type !== \"File\") {\n yield* _(Effect.logWarning(`${gitignorePath} exists but is not a file; skipping`))\n return\n }\n\n const prev = yield* _(fs.readFileString(gitignorePath))\n const normalized = normalizeGitignoreText(prev)\n if (!normalized.startsWith(stateGitignoreMarker)) {\n return\n }\n\n // If the file is docker-git managed but still ignores secrets (legacy default), rewrite it.\n const prevLines = new Set(prev.replaceAll(\"\\r\", \"\").split(\"\\n\").map((l) => l.trimEnd()))\n const hasLegacySecretIgnores = legacySecretIgnorePatterns.some((p) => prevLines.has(p))\n if (hasLegacySecretIgnores) {\n yield* _(fs.writeFileString(gitignorePath, defaultStateGitignore))\n return\n }\n\n // Ensure managed ignore patterns exist; append any missing entries.\n const missing = collectMissingManagedPatterns(prevLines)\n if (!hasMissingManagedPatterns(missing)) {\n return\n }\n yield* _(fs.writeFileString(gitignorePath, appendManagedBlocks(prev, missing)))\n })\n","// CHANGE: standardize docker-git prompt script for interactive shells\n// WHY: keep prompt consistent between Dockerfile and entrypoint\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: script is deterministic\n// COMPLEXITY: O(1)\nconst dockerGitPromptScript = `docker_git_branch() { git rev-parse --abbrev-ref HEAD 2>/dev/null; }\ndocker_git_terminal_sanitize() {\n # Recover interactive TTY settings after abrupt exits from fullscreen/raw-mode tools.\n if [ -t 0 ]; then\n stty sane 2>/dev/null || true\n fi\n if [ -t 1 ]; then\n printf \"\\\\033[0m\\\\033[?25h\\\\033[?1l\\\\033>\\\\033[?1000l\\\\033[?1002l\\\\033[?1003l\\\\033[?1005l\\\\033[?1006l\\\\033[?1015l\\\\033[?1007l\\\\033[?1004l\\\\033[?2004l\\\\033[>4;0m\\\\033[>4m\\\\033[<u\"\n fi\n}\ndocker_git_short_pwd() {\n local full_path\n full_path=\"\\${PWD:-}\"\n if [[ -z \"$full_path\" ]]; then\n printf \"%s\" \"?\"\n return\n fi\n\n local display=\"$full_path\"\n if [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME\" ]]; then\n display=\"~\"\n elif [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME/\"* ]]; then\n display=\"~/\\${full_path#$HOME/}\"\n fi\n\n if [[ \"$display\" == \"~\" || \"$display\" == \"/\" ]]; then\n printf \"%s\" \"$display\"\n return\n fi\n\n local prefix=\"\"\n local body=\"$display\"\n if [[ \"$body\" == \"~/\"* ]]; then\n prefix=\"~/\"\n body=\"\\${body#~/}\"\n elif [[ \"$body\" == /* ]]; then\n prefix=\"/\"\n body=\"\\${body#/}\"\n fi\n\n local result=\"$prefix\"\n local segment=\"\"\n local rest=\"$body\"\n while [[ \"$rest\" == */* ]]; do\n segment=\"\\${rest%%/*}\"\n rest=\"\\${rest#*/}\"\n if [[ -n \"$segment\" ]]; then\n result+=\"\\${segment:0:1}/\"\n fi\n done\n\n if [[ -n \"$rest\" ]]; then\n result+=\"$rest\"\n elif [[ \"$result\" == \"~/\" ]]; then\n result=\"~\"\n elif [[ -z \"$result\" ]]; then\n result=\"/\"\n fi\n\n printf \"%s\" \"$result\"\n}\ndocker_git_prompt_apply() {\n docker_git_terminal_sanitize\n local b\n b=\"$(docker_git_branch)\"\n local short_pwd\n short_pwd=\"$(docker_git_short_pwd)\"\n local base=\"[\\\\t] $short_pwd\"\n if [ -n \"$b\" ]; then\n PS1=\"\\${base} (\\${b})> \"\n else\n PS1=\"\\${base}> \"\n fi\n}\nif [ -n \"$PROMPT_COMMAND\" ]; then\n PROMPT_COMMAND=\"docker_git_prompt_apply;$PROMPT_COMMAND\"\nelse\n PROMPT_COMMAND=\"docker_git_prompt_apply\"\nfi`\n\nexport const renderPromptScript = (): string => dockerGitPromptScript\n\n// CHANGE: enable bash completion for interactive shells\n// WHY: allow tab completion for CLI tools in SSH terminals\n// QUOTE(ТЗ): \"А почему у меня не работает автодополенние в терминале?\"\n// REF: user-request-2026-02-05-bash-completion\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: completion(s) -> enabled(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: only runs when bash completion files exist\n// COMPLEXITY: O(1)\nexport const renderBashCompletionScript = (): string =>\n `if ! shopt -oq posix; then\n if [ -f /usr/share/bash-completion/bash_completion ]; then\n . /usr/share/bash-completion/bash_completion\n elif [ -f /etc/bash_completion ]; then\n . /etc/bash_completion\n fi\nfi`\n\n// CHANGE: enable bash history persistence and prefix search\n// WHY: keep command history between sessions and allow prefix-based navigation\n// QUOTE(ТЗ): \"Он не помнит прошлый вывод команд\"\n// REF: user-request-2026-02-05-bash-history\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: history(s) -> persisted(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: PROMPT_COMMAND preserves existing prompt logic\n// COMPLEXITY: O(1)\nexport const renderBashHistoryScript = (): string =>\n `if [ -n \"$BASH_VERSION\" ]; then\n case \"$-\" in\n *i*)\n HISTFILE=\"\\${HISTFILE:-$HOME/.bash_history}\"\n HISTSIZE=\"\\${HISTSIZE:-10000}\"\n HISTFILESIZE=\"\\${HISTFILESIZE:-20000}\"\n HISTCONTROL=\"\\${HISTCONTROL:-ignoredups:erasedups}\"\n export HISTFILE HISTSIZE HISTFILESIZE HISTCONTROL\n shopt -s histappend\n if [ -n \"\\${PROMPT_COMMAND-}\" ]; then\n PROMPT_COMMAND=\"history -a; \\${PROMPT_COMMAND}\"\n else\n PROMPT_COMMAND=\"history -a\"\n fi\n ;;\n esac\nfi`\n\n// CHANGE: add readline bindings for prefix history search\n// WHY: allow up/down arrows to search history by current prefix\n// QUOTE(ТЗ): \"если я писал cd ... то он должен запомнить и когда я напишу cd он мне предложит\"\n// REF: user-request-2026-02-05-inputrc\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: prefix(p) -> history_search(p)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: does not override user inputrc when already present\n// COMPLEXITY: O(1)\nexport const renderInputRc = (): string =>\n String.raw`set show-all-if-ambiguous on\nset completion-ignore-case on\n\"\\e[A\": history-search-backward\n\"\\e[B\": history-search-forward`\n\n// CHANGE: configure zsh with autosuggestions, history search, and non-noisy completion UX\n// WHY: avoid dumping completion candidates into the terminal scrollback on ambiguous prefixes\n// QUOTE(ТЗ): \"пусть будет zzh если он сделате то что я хочу\" | \"Почему при наборе текста он пишет в моём терминале какую-то билиберду?\"\n// REF: user-request-2026-02-05-zsh-autosuggest | user-request-2026-02-10-zsh-completion-noise\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in ZshInteractive: autosuggest(s) -> enabled(s) ∧ completion(s) -> non_noisy(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: zsh config does not depend on user dotfiles\n// COMPLEXITY: O(1)\nconst dockerGitZshConfig = `setopt PROMPT_SUBST\n\n# Terminal compatibility: if terminfo for $TERM is missing (common over SSH),\n# fall back to xterm-256color so ZLE doesn't garble the display.\nif command -v infocmp >/dev/null 2>&1; then\n if ! infocmp \"$TERM\" >/dev/null 2>&1; then\n export TERM=xterm-256color\n fi\nfi\n\nautoload -Uz compinit\ncompinit\n\n# Completion UX: cycle matches instead of listing them into scrollback.\nsetopt AUTO_MENU\nsetopt MENU_COMPLETE\nunsetopt AUTO_LIST\nunsetopt LIST_BEEP\n\n# Command completion ordering: prefer real commands/builtins over internal helper functions.\nzstyle ':completion:*' tag-order builtins commands aliases reserved-words functions\n\nautoload -Uz add-zsh-hook\ndocker_git_branch() { git rev-parse --abbrev-ref HEAD 2>/dev/null; }\ndocker_git_terminal_sanitize() {\n # Recover interactive TTY settings after abrupt exits from fullscreen/raw-mode tools.\n if [[ -t 0 ]]; then\n stty sane 2>/dev/null || true\n fi\n if [[ -t 1 ]]; then\n printf \"\\\\033[0m\\\\033[?25h\\\\033[?1l\\\\033>\\\\033[?1000l\\\\033[?1002l\\\\033[?1003l\\\\033[?1005l\\\\033[?1006l\\\\033[?1015l\\\\033[?1007l\\\\033[?1004l\\\\033[?2004l\\\\033[>4;0m\\\\033[>4m\\\\033[<u\"\n fi\n}\ndocker_git_short_pwd() {\n local full_path=\"\\${PWD:-}\"\n if [[ -z \"$full_path\" ]]; then\n print -r -- \"?\"\n return\n fi\n\n local display=\"$full_path\"\n if [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME\" ]]; then\n display=\"~\"\n elif [[ -n \"\\${HOME:-}\" && \"$full_path\" == \"$HOME/\"* ]]; then\n display=\"~/\\${full_path#$HOME/}\"\n fi\n\n if [[ \"$display\" == \"~\" || \"$display\" == \"/\" ]]; then\n print -r -- \"$display\"\n return\n fi\n\n local prefix=\"\"\n local body=\"$display\"\n if [[ \"$body\" == \"~/\"* ]]; then\n prefix=\"~/\"\n body=\"\\${body#~/}\"\n elif [[ \"$body\" == /* ]]; then\n prefix=\"/\"\n body=\"\\${body#/}\"\n fi\n\n local -a parts\n local result=\"$prefix\"\n parts=(\\${(s:/:)body})\n local total=\\${#parts[@]}\n local idx=1\n local part=\"\"\n for part in \"\\${parts[@]}\"; do\n if [[ -z \"$part\" ]]; then\n ((idx++))\n continue\n fi\n if (( idx < total )); then\n result+=\"\\${part[1,1]}/\"\n else\n result+=\"$part\"\n fi\n ((idx++))\n done\n\n if [[ -z \"$result\" ]]; then\n result=\"/\"\n elif [[ \"$result\" == \"~/\" ]]; then\n result=\"~\"\n fi\n\n print -r -- \"$result\"\n}\ndocker_git_prompt_apply() {\n docker_git_terminal_sanitize\n local b\n b=\"$(docker_git_branch)\"\n local short_pwd\n short_pwd=\"$(docker_git_short_pwd)\"\n local base=\"[%*] $short_pwd\"\n if [[ -n \"$b\" ]]; then\n PROMPT=\"$base ($b)> \"\n else\n PROMPT=\"$base> \"\n fi\n}\nadd-zsh-hook precmd docker_git_prompt_apply\n\nHISTFILE=\"\\${HISTFILE:-$HOME/.zsh_history}\"\nHISTSIZE=\"\\${HISTSIZE:-10000}\"\nSAVEHIST=\"\\${SAVEHIST:-20000}\"\nsetopt HIST_IGNORE_ALL_DUPS\nsetopt SHARE_HISTORY\nsetopt INC_APPEND_HISTORY\n\nif [ -f \"$HISTFILE\" ]; then\n fc -R \"$HISTFILE\" 2>/dev/null || true\nfi\nif [ -f \"$HOME/.bash_history\" ] && [ \"$HISTFILE\" != \"$HOME/.bash_history\" ]; then\n fc -R \"$HOME/.bash_history\" 2>/dev/null || true\nfi\n\nbindkey '^[[A' history-search-backward\nbindkey '^[[B' history-search-forward\n\nif [[ \"\\${DOCKER_GIT_ZSH_AUTOSUGGEST:-1}\" == \"1\" ]] && [ -f /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh ]; then\n # Suggest from history first, then fall back to completion (commands + paths).\n # This gives \"ghost text\" suggestions without needing to press <Tab>.\n ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE=\"\\${DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE:-fg=8,italic}\"\n if [[ -n \"\\${DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY-}\" ]]; then\n ZSH_AUTOSUGGEST_STRATEGY=(\\${=DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY})\n else\n ZSH_AUTOSUGGEST_STRATEGY=(history completion)\n fi\n source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh\nfi`\n\nexport const renderZshConfig = (): string => dockerGitZshConfig\n\n// CHANGE: add git branch info to interactive shell prompt\n// WHY: restore docker-git prompt with time + path + branch\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: only interactive shells source /etc/profile.d/zz-prompt.sh\n// COMPLEXITY: O(1)\nexport const renderDockerfilePrompt = (): string =>\n String.raw`# Shell prompt: show git branch for interactive sessions\nRUN cat <<'EOF' > /etc/profile.d/zz-prompt.sh\n${renderPromptScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-prompt.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-prompt.sh ]; then . /etc/profile.d/zz-prompt.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN cat <<'EOF' > /etc/profile.d/zz-bash-completion.sh\n${renderBashCompletionScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-bash-completion.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-bash-completion.sh ]; then . /etc/profile.d/zz-bash-completion.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN cat <<'EOF' > /etc/profile.d/zz-bash-history.sh\n${renderBashHistoryScript()}\nEOF\nRUN chmod 0644 /etc/profile.d/zz-bash-history.sh\nRUN printf \"%s\\n\" \\\n \"if [ -f /etc/profile.d/zz-bash-history.sh ]; then . /etc/profile.d/zz-bash-history.sh; fi\" \\\n >> /etc/bash.bashrc\nRUN mkdir -p /etc/zsh\nRUN cat <<'EOF' > /etc/zsh/zshrc\n${renderZshConfig()}\nEOF`\n\n// CHANGE: ensure the docker-git prompt is always available at runtime\n// WHY: --force rebuilds can reuse cached layers that left an empty prompt file\n// QUOTE(ТЗ): \"Промт должен создаваться нашим docker-git тулой\"\n// REF: user-request-2026-02-05-restore-prompt\n// SOURCE: n/a\n// FORMAT THEOREM: forall s in InteractiveShells: prompt(s) -> includes(time, path, branch|empty)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: /etc/profile.d/zz-prompt.sh is non-empty after entrypoint\n// COMPLEXITY: O(1)\nexport const renderEntrypointPrompt = (): string =>\n String.raw`# Ensure docker-git prompt is configured for interactive shells\nPROMPT_PATH=\"/etc/profile.d/zz-prompt.sh\"\nif [[ ! -s \"$PROMPT_PATH\" ]]; then\n cat <<'EOF' > \"$PROMPT_PATH\"\n${renderPromptScript()}\nEOF\n chmod 0644 \"$PROMPT_PATH\"\nfi\nif ! grep -q \"zz-prompt.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-prompt.sh ]; then . /etc/profile.d/zz-prompt.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointBashCompletion = (): string =>\n String.raw`# Ensure bash completion is configured for interactive shells\nCOMPLETION_PATH=\"/etc/profile.d/zz-bash-completion.sh\"\nif [[ ! -s \"$COMPLETION_PATH\" ]]; then\n cat <<'EOF' > \"$COMPLETION_PATH\"\n${renderBashCompletionScript()}\nEOF\n chmod 0644 \"$COMPLETION_PATH\"\nfi\nif ! grep -q \"zz-bash-completion.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-bash-completion.sh ]; then . /etc/profile.d/zz-bash-completion.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointBashHistory = (): string =>\n String.raw`# Ensure bash history is configured for interactive shells\nHISTORY_PATH=\"/etc/profile.d/zz-bash-history.sh\"\nif [[ ! -s \"$HISTORY_PATH\" ]]; then\n cat <<'EOF' > \"$HISTORY_PATH\"\n${renderBashHistoryScript()}\nEOF\n chmod 0644 \"$HISTORY_PATH\"\nfi\nif ! grep -q \"zz-bash-history.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\n\" \"if [ -f /etc/profile.d/zz-bash-history.sh ]; then . /etc/profile.d/zz-bash-history.sh; fi\" >> /etc/bash.bashrc\nfi`\n\nexport const renderEntrypointZshConfig = (): string =>\n String.raw`# Ensure zsh config exists for autosuggestions\nZSHRC_PATH=\"/etc/zsh/zshrc\"\nif [[ ! -s \"$ZSHRC_PATH\" ]]; then\n mkdir -p /etc/zsh\n cat <<'EOF' > \"$ZSHRC_PATH\"\n${renderZshConfig()}\nEOF\nfi`\n","import type { TemplateConfig } from \"../domain.js\"\nimport { renderInputRc } from \"../templates-prompt.js\"\n\nexport const renderEntrypointHeader = (config: TemplateConfig): string =>\n `#!/usr/bin/env bash\nset -euo pipefail\n\nREPO_URL=\"\\${REPO_URL:-}\"\nREPO_REF=\"\\${REPO_REF:-}\"\nFORK_REPO_URL=\"\\${FORK_REPO_URL:-}\"\nTARGET_DIR=\"\\${TARGET_DIR:-${config.targetDir}}\"\nif [[ \"$TARGET_DIR\" == \"~\" ]]; then\n TARGET_DIR=\"$HOME\"\nelif [[ \"$TARGET_DIR\" == \"~/\"* ]]; then\n TARGET_DIR=\"$HOME\\${TARGET_DIR:1}\"\nfi\nCLAUDE_AUTH_LABEL=\"\\${CLAUDE_AUTH_LABEL:-}\"\nCODEX_AUTH_LABEL=\"\\${CODEX_AUTH_LABEL:-}\"\nGIT_AUTH_USER=\"\\${GIT_AUTH_USER:-\\${GITHUB_USER:-x-access-token}}\"\nGIT_AUTH_TOKEN=\"\\${GIT_AUTH_TOKEN:-\\${GITHUB_TOKEN:-\\${GH_TOKEN:-}}}\"\nGH_TOKEN=\"\\${GH_TOKEN:-\\${GIT_AUTH_TOKEN:-}}\"\nGITHUB_TOKEN=\"\\${GITHUB_TOKEN:-\\${GH_TOKEN:-}}\"\nGIT_USER_NAME=\"\\${GIT_USER_NAME:-}\"\nGIT_USER_EMAIL=\"\\${GIT_USER_EMAIL:-}\"\nCODEX_AUTO_UPDATE=\"\\${CODEX_AUTO_UPDATE:-1}\"\nMCP_PLAYWRIGHT_ENABLE=\"\\${MCP_PLAYWRIGHT_ENABLE:-${config.enableMcpPlaywright ? \"1\" : \"0\"}}\"\nMCP_PLAYWRIGHT_CDP_ENDPOINT=\"\\${MCP_PLAYWRIGHT_CDP_ENDPOINT:-}\"\nMCP_PLAYWRIGHT_ISOLATED=\"\\${MCP_PLAYWRIGHT_ISOLATED:-1}\"\n\nSSH_ENV_PATH=\"/home/${config.sshUser}/.ssh/environment\"\n\ndocker_git_upsert_ssh_env() {\n local key=\"$1\"\n local value=\"$2\"\n\n if [[ -d \"$SSH_ENV_PATH\" ]]; then\n mv \"$SSH_ENV_PATH\" \"$SSH_ENV_PATH.bak-$(date +%s)\" || true\n fi\n\n mkdir -p \"$(dirname \"$SSH_ENV_PATH\")\"\n touch \"$SSH_ENV_PATH\"\n\n awk -v k=\"$key\" -F= '$1 != k { print }' \"$SSH_ENV_PATH\" > \"$SSH_ENV_PATH.tmp\"\n mv \"$SSH_ENV_PATH.tmp\" \"$SSH_ENV_PATH\"\n\n printf \"%s\\n\" \"$key=$value\" >> \"$SSH_ENV_PATH\"\n chmod 600 \"$SSH_ENV_PATH\" || true\n chown 1000:1000 \"$SSH_ENV_PATH\" || true\n}`\n\nexport const renderEntrypointPackageCache = (config: TemplateConfig): string =>\n `# Share package manager caches across all docker-git containers\nPACKAGE_CACHE_ROOT=\"/home/${config.sshUser}/.docker-git/.cache/packages\"\nPACKAGE_PNPM_STORE=\"\\${npm_config_store_dir:-\\${PNPM_STORE_DIR:-$PACKAGE_CACHE_ROOT/pnpm/store}}\"\nPACKAGE_NPM_CACHE=\"\\${npm_config_cache:-\\${NPM_CONFIG_CACHE:-$PACKAGE_CACHE_ROOT/npm}}\"\nPACKAGE_YARN_CACHE=\"\\${YARN_CACHE_FOLDER:-$PACKAGE_CACHE_ROOT/yarn}\"\n\nmkdir -p \"$PACKAGE_PNPM_STORE\" \"$PACKAGE_NPM_CACHE\" \"$PACKAGE_YARN_CACHE\"\nchown -R 1000:1000 \"$PACKAGE_CACHE_ROOT\" || true\n\ncat <<EOF > /etc/profile.d/docker-git-package-cache.sh\nexport PNPM_STORE_DIR=\"$PACKAGE_PNPM_STORE\"\nexport npm_config_store_dir=\"$PACKAGE_PNPM_STORE\"\nexport NPM_CONFIG_CACHE=\"$PACKAGE_NPM_CACHE\"\nexport npm_config_cache=\"$PACKAGE_NPM_CACHE\"\nexport YARN_CACHE_FOLDER=\"$PACKAGE_YARN_CACHE\"\nEOF\nchmod 0644 /etc/profile.d/docker-git-package-cache.sh\n\ndocker_git_upsert_ssh_env \"PNPM_STORE_DIR\" \"$PACKAGE_PNPM_STORE\"\ndocker_git_upsert_ssh_env \"npm_config_store_dir\" \"$PACKAGE_PNPM_STORE\"\ndocker_git_upsert_ssh_env \"NPM_CONFIG_CACHE\" \"$PACKAGE_NPM_CACHE\"\ndocker_git_upsert_ssh_env \"npm_config_cache\" \"$PACKAGE_NPM_CACHE\"\ndocker_git_upsert_ssh_env \"YARN_CACHE_FOLDER\" \"$PACKAGE_YARN_CACHE\"`\n\nexport const renderEntrypointAuthorizedKeys = (config: TemplateConfig): string =>\n `# 1) Authorized keys are mounted from host at /authorized_keys\nmkdir -p /home/${config.sshUser}/.ssh\nchmod 700 /home/${config.sshUser}/.ssh\n\nif [[ -f /authorized_keys ]]; then\n cp /authorized_keys /home/${config.sshUser}/.ssh/authorized_keys\n chmod 600 /home/${config.sshUser}/.ssh/authorized_keys\nfi\n\nchown -R 1000:1000 /home/${config.sshUser}/.ssh`\n\nexport const renderEntrypointDockerSocket = (config: TemplateConfig): string =>\n `# Ensure docker socket access for ${config.sshUser}\nif [[ -S /var/run/docker.sock ]]; then\n DOCKER_SOCK_GID=\"$(stat -c \"%g\" /var/run/docker.sock)\"\n DOCKER_GROUP=\"$(getent group \"$DOCKER_SOCK_GID\" | cut -d: -f1 || true)\"\n if [[ -z \"$DOCKER_GROUP\" ]]; then\n DOCKER_GROUP=\"docker\"\n groupadd -g \"$DOCKER_SOCK_GID\" \"$DOCKER_GROUP\" || true\n fi\n usermod -aG \"$DOCKER_GROUP\" ${config.sshUser} || true\n printf \"export DOCKER_HOST=unix:///var/run/docker.sock\\n\" > /etc/profile.d/docker-host.sh\nfi`\n\nexport const renderEntrypointZshShell = (config: TemplateConfig): string =>\n String.raw`# Prefer zsh for ${config.sshUser} when available\nif command -v zsh >/dev/null 2>&1; then\n usermod -s /usr/bin/zsh ${config.sshUser} || true\nfi`\n\nexport const renderEntrypointZshUserRc = (config: TemplateConfig): string =>\n String.raw`# Ensure ${config.sshUser} has a zshrc and disable newuser wizard\nZSHENV_PATH=\"/etc/zsh/zshenv\"\nif [[ -f \"$ZSHENV_PATH\" ]]; then\n if ! grep -q \"ZSH_DISABLE_NEWUSER_INSTALL\" \"$ZSHENV_PATH\"; then\n printf \"%s\\n\" \"export ZSH_DISABLE_NEWUSER_INSTALL=1\" >> \"$ZSHENV_PATH\"\n fi\nelse\n printf \"%s\\n\" \"export ZSH_DISABLE_NEWUSER_INSTALL=1\" > \"$ZSHENV_PATH\"\nfi\nUSER_ZSHRC=\"/home/${config.sshUser}/.zshrc\"\nif [[ ! -f \"$USER_ZSHRC\" ]]; then\n cat <<'EOF' > \"$USER_ZSHRC\"\n# docker-git default zshrc\nif [ -f /etc/zsh/zshrc ]; then\n source /etc/zsh/zshrc\nfi\nEOF\n chown 1000:1000 \"$USER_ZSHRC\" || true\nfi`\n\nexport const renderEntrypointInputRc = (config: TemplateConfig): string =>\n String.raw`# Ensure readline history search bindings for ${config.sshUser}\nINPUTRC_PATH=\"/home/${config.sshUser}/.inputrc\"\nif [[ ! -f \"$INPUTRC_PATH\" ]]; then\n cat <<'EOF' > \"$INPUTRC_PATH\"\n${renderInputRc()}\nEOF\n chown 1000:1000 \"$INPUTRC_PATH\" || true\nfi`\n\nexport const renderEntrypointBaseline = (): string =>\n `# 4.5) Snapshot baseline processes for terminal session filtering\nmkdir -p /run/docker-git\nBASELINE_PATH=\"/run/docker-git/terminal-baseline.pids\"\nif [[ ! -f \"$BASELINE_PATH\" ]]; then\n ps -eo pid= > \"$BASELINE_PATH\" || true\nfi`\n\nexport const renderEntrypointDisableMotd = (): string =>\n String.raw`# 4.75) Disable Ubuntu MOTD noise for SSH sessions\nPAM_SSHD=\"/etc/pam.d/sshd\"\nif [[ -f \"$PAM_SSHD\" ]]; then\n sed -i 's/^[[:space:]]*session[[:space:]]\\+optional[[:space:]]\\+pam_motd\\.so/#&/' \"$PAM_SSHD\" || true\n sed -i 's/^[[:space:]]*session[[:space:]]\\+optional[[:space:]]\\+pam_lastlog\\.so/#&/' \"$PAM_SSHD\" || true\nfi\n\n# Also disable sshd's own banners (e.g. \"Last login\")\nmkdir -p /etc/ssh/sshd_config.d || true\nDOCKER_GIT_SSHD_CONF=\"/etc/ssh/sshd_config.d/zz-docker-git-clean.conf\"\ncat <<'EOF' > \"$DOCKER_GIT_SSHD_CONF\"\nPrintMotd no\nPrintLastLog no\nEOF\nchmod 0644 \"$DOCKER_GIT_SSHD_CONF\" || true`\n\nexport const renderEntrypointSshd = (): string => `# 5) Run sshd in foreground\\nexec /usr/sbin/sshd -D`\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst claudeAuthRootContainerPath = (sshUser: string): string => `/home/${sshUser}/.docker-git/.orch/auth/claude`\n\nconst claudeAuthConfigTemplate = String\n .raw`# Claude Code: expose CLAUDE_CONFIG_DIR for SSH sessions (OAuth cache lives under ~/.docker-git/.orch/auth/claude)\nCLAUDE_LABEL_RAW=\"$CLAUDE_AUTH_LABEL\"\nif [[ -z \"$CLAUDE_LABEL_RAW\" ]]; then\n CLAUDE_LABEL_RAW=\"default\"\nfi\n\nCLAUDE_LABEL_NORM=\"$(printf \"%s\" \"$CLAUDE_LABEL_RAW\" \\\n | tr '[:upper:]' '[:lower:]' \\\n | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//')\"\nif [[ -z \"$CLAUDE_LABEL_NORM\" ]]; then\n CLAUDE_LABEL_NORM=\"default\"\nfi\n\nCLAUDE_AUTH_ROOT=\"__CLAUDE_AUTH_ROOT__\"\nCLAUDE_CONFIG_DIR=\"$CLAUDE_AUTH_ROOT/$CLAUDE_LABEL_NORM\"\n\n# Backward compatibility: if default auth is stored directly under claude root, reuse it.\nif [[ \"$CLAUDE_LABEL_NORM\" == \"default\" ]]; then\n CLAUDE_ROOT_TOKEN_FILE=\"$CLAUDE_AUTH_ROOT/.oauth-token\"\n CLAUDE_ROOT_CONFIG_FILE=\"$CLAUDE_AUTH_ROOT/.config.json\"\n if [[ -f \"$CLAUDE_ROOT_TOKEN_FILE\" ]] || [[ -f \"$CLAUDE_ROOT_CONFIG_FILE\" ]]; then\n CLAUDE_CONFIG_DIR=\"$CLAUDE_AUTH_ROOT\"\n fi\nfi\n\nexport CLAUDE_CONFIG_DIR\n\nmkdir -p \"$CLAUDE_CONFIG_DIR\" || true\nCLAUDE_HOME_DIR=\"__CLAUDE_HOME_DIR__\"\nCLAUDE_HOME_JSON=\"__CLAUDE_HOME_JSON__\"\nmkdir -p \"$CLAUDE_HOME_DIR\" || true\n\ndocker_git_link_claude_file() {\n local source_path=\"$1\"\n local link_path=\"$2\"\n\n # Preserve user-created regular files and seed config dir once.\n if [[ -e \"$link_path\" && ! -L \"$link_path\" ]]; then\n if [[ -f \"$link_path\" && ! -e \"$source_path\" ]]; then\n cp \"$link_path\" \"$source_path\" || true\n chmod 0600 \"$source_path\" || true\n fi\n return 0\n fi\n\n ln -sfn \"$source_path\" \"$link_path\" || true\n}\n\ndocker_git_link_claude_home_file() {\n local relative_path=\"$1\"\n local source_path=\"$CLAUDE_CONFIG_DIR/$relative_path\"\n local link_path=\"$CLAUDE_HOME_DIR/$relative_path\"\n docker_git_link_claude_file \"$source_path\" \"$link_path\"\n}\n\ndocker_git_link_claude_home_file \".oauth-token\"\ndocker_git_link_claude_home_file \".config.json\"\ndocker_git_link_claude_home_file \".claude.json\"\ndocker_git_link_claude_home_file \".credentials.json\"\ndocker_git_link_claude_file \"$CLAUDE_CONFIG_DIR/.claude.json\" \"$CLAUDE_HOME_JSON\"\n\nCLAUDE_TOKEN_FILE=\"$CLAUDE_CONFIG_DIR/.oauth-token\"\nCLAUDE_CREDENTIALS_FILE=\"$CLAUDE_CONFIG_DIR/.credentials.json\"\ndocker_git_refresh_claude_oauth_token() {\n local token=\"\"\n if [[ -s \"$CLAUDE_CREDENTIALS_FILE\" ]]; then\n unset CLAUDE_CODE_OAUTH_TOKEN || true\n return 0\n fi\n if [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n token=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\n fi\n if [[ -n \"$token\" ]]; then\n export CLAUDE_CODE_OAUTH_TOKEN=\"$token\"\n else\n unset CLAUDE_CODE_OAUTH_TOKEN || true\n fi\n}\n\ndocker_git_refresh_claude_oauth_token`\n\nconst renderClaudeAuthConfig = (config: TemplateConfig): string =>\n claudeAuthConfigTemplate\n .replaceAll(\"__CLAUDE_AUTH_ROOT__\", claudeAuthRootContainerPath(config.sshUser))\n .replaceAll(\"__CLAUDE_HOME_DIR__\", `/home/${config.sshUser}/.claude`)\n .replaceAll(\"__CLAUDE_HOME_JSON__\", `/home/${config.sshUser}/.claude.json`)\n\nconst renderClaudeCliInstall = (): string =>\n String.raw`# Claude Code: ensure CLI command exists (non-blocking startup self-heal)\ndocker_git_ensure_claude_cli() {\n if command -v claude >/dev/null 2>&1; then\n return 0\n fi\n\n if ! command -v npm >/dev/null 2>&1; then\n return 0\n fi\n\n NPM_ROOT=\"$(npm root -g 2>/dev/null || true)\"\n CLAUDE_CLI_JS=\"$NPM_ROOT/@anthropic-ai/claude-code/cli.js\"\n if [[ -z \"$NPM_ROOT\" || ! -f \"$CLAUDE_CLI_JS\" ]]; then\n echo \"docker-git: claude cli.js not found under npm global root; skip shim restore\" >&2\n return 0\n fi\n\n # Rebuild a minimal shim when npm package exists but binary link is missing.\n cat <<'EOF' > /usr/local/bin/claude\n#!/usr/bin/env bash\nset -euo pipefail\n\nif ! command -v npm >/dev/null 2>&1; then\n echo \"claude: npm is required but missing\" >&2\n exit 127\nfi\n\nNPM_ROOT=\"$(npm root -g 2>/dev/null || true)\"\nCLAUDE_CLI_JS=\"$NPM_ROOT/@anthropic-ai/claude-code/cli.js\"\nif [[ -z \"$NPM_ROOT\" || ! -f \"$CLAUDE_CLI_JS\" ]]; then\n echo \"claude: cli.js not found under npm global root\" >&2\n exit 127\nfi\n\nexec node \"$CLAUDE_CLI_JS\" \"$@\"\nEOF\n chmod 0755 /usr/local/bin/claude || true\n ln -sf /usr/local/bin/claude /usr/bin/claude || true\n}\n\ndocker_git_ensure_claude_cli`\n\nconst renderClaudeMcpPlaywrightConfig = (): string =>\n String.raw`# Claude Code: keep Playwright MCP config in sync with container settings\nCLAUDE_SETTINGS_FILE=\"${\"$\"}{CLAUDE_HOME_JSON:-$CLAUDE_CONFIG_DIR/.claude.json}\"\ndocker_git_sync_claude_playwright_mcp() {\n CLAUDE_SETTINGS_FILE=\"$CLAUDE_SETTINGS_FILE\" MCP_PLAYWRIGHT_ENABLE=\"$MCP_PLAYWRIGHT_ENABLE\" node - <<'NODE'\nconst fs = require(\"node:fs\")\nconst path = require(\"node:path\")\n\nconst settingsPath = process.env.CLAUDE_SETTINGS_FILE\nif (typeof settingsPath !== \"string\" || settingsPath.length === 0) {\n process.exit(0)\n}\n\nconst enablePlaywright = process.env.MCP_PLAYWRIGHT_ENABLE === \"1\"\nconst isRecord = (value) => typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nlet settings = {}\ntry {\n const raw = fs.readFileSync(settingsPath, \"utf8\")\n const parsed = JSON.parse(raw)\n settings = isRecord(parsed) ? parsed : {}\n} catch {\n settings = {}\n}\n\nconst currentServers = isRecord(settings.mcpServers) ? settings.mcpServers : {}\nconst nextServers = { ...currentServers }\nif (enablePlaywright) {\n nextServers.playwright = {\n type: \"stdio\",\n command: \"docker-git-playwright-mcp\",\n args: [],\n env: {}\n }\n} else {\n delete nextServers.playwright\n}\n\nconst nextSettings = { ...settings }\nif (Object.keys(nextServers).length > 0) {\n nextSettings.mcpServers = nextServers\n} else {\n delete nextSettings.mcpServers\n}\n\nif (JSON.stringify(settings) === JSON.stringify(nextSettings)) {\n process.exit(0)\n}\n\nfs.mkdirSync(path.dirname(settingsPath), { recursive: true })\nfs.writeFileSync(settingsPath, JSON.stringify(nextSettings, null, 2) + \"\\n\", { mode: 0o600 })\nNODE\n}\n\ndocker_git_sync_claude_playwright_mcp\nchown 1000:1000 \"$CLAUDE_SETTINGS_FILE\" 2>/dev/null || true`\n\nconst entrypointClaudeGlobalPromptTemplate = String\n .raw`# Claude Code: managed global memory (CLAUDE.md is auto-loaded by Claude Code)\nCLAUDE_GLOBAL_PROMPT_FILE=\"/home/__SSH_USER__/.claude/CLAUDE.md\"\nCLAUDE_AUTO_SYSTEM_PROMPT=\"${\"$\"}{CLAUDE_AUTO_SYSTEM_PROMPT:-1}\"\nCLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: repository\"\nREPO_REF_VALUE=\"${\"$\"}{REPO_REF:-__REPO_REF_DEFAULT__}\"\nREPO_URL_VALUE=\"${\"$\"}{REPO_URL:-__REPO_URL_DEFAULT__}\"\n\nif [[ \"$REPO_REF_VALUE\" == issue-* ]]; then\n ISSUE_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -E 's#^issue-##')\"\n ISSUE_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* ]]; then\n ISSUE_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$ISSUE_REPO_VALUE\" ]]; then\n ISSUE_URL_VALUE=\"https://github.com/$ISSUE_REPO_VALUE/issues/$ISSUE_ID_VALUE\"\n fi\n fi\n if [[ -n \"$ISSUE_URL_VALUE\" ]]; then\n CLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: issue #$ISSUE_ID_VALUE ($ISSUE_URL_VALUE)\"\n else\n CLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: issue #$ISSUE_ID_VALUE\"\n fi\nelif [[ \"$REPO_REF_VALUE\" == refs/pull/*/head ]]; then\n PR_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -nE 's#^refs/pull/([0-9]+)/head$#\\1#p')\"\n PR_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* && -n \"$PR_ID_VALUE\" ]]; then\n PR_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$PR_REPO_VALUE\" ]]; then\n PR_URL_VALUE=\"https://github.com/$PR_REPO_VALUE/pull/$PR_ID_VALUE\"\n fi\n fi\n if [[ -n \"$PR_ID_VALUE\" && -n \"$PR_URL_VALUE\" ]]; then\n CLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: PR #$PR_ID_VALUE ($PR_URL_VALUE)\"\n elif [[ -n \"$PR_ID_VALUE\" ]]; then\n CLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: PR #$PR_ID_VALUE\"\n else\n CLAUDE_WORKSPACE_CONTEXT=\"Контекст workspace: pull request ($REPO_REF_VALUE)\"\n fi\nfi\n\nif [[ \"$CLAUDE_AUTO_SYSTEM_PROMPT\" == \"1\" ]]; then\n mkdir -p \"$(dirname \"$CLAUDE_GLOBAL_PROMPT_FILE\")\"\n chown 1000:1000 \"$(dirname \"$CLAUDE_GLOBAL_PROMPT_FILE\")\" 2>/dev/null || true\n if [[ ! -f \"$CLAUDE_GLOBAL_PROMPT_FILE\" ]] || grep -q \"^<!-- docker-git-managed:claude-md -->$\" \"$CLAUDE_GLOBAL_PROMPT_FILE\"; then\n cat <<EOF > \"$CLAUDE_GLOBAL_PROMPT_FILE\"\n<!-- docker-git-managed:claude-md -->\nТы автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, claude, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~\nРабочая папка проекта (git clone): __TARGET_DIR__\nДоступные workspace пути: __TARGET_DIR__\n$CLAUDE_WORKSPACE_CONTEXT\nФокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__\nДоступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.\nЕсли ты видишь файлы AGENTS.md или CLAUDE.md внутри проекта, ты обязан их читать и соблюдать инструкции.\n<!-- /docker-git-managed:claude-md -->\nEOF\n chmod 0644 \"$CLAUDE_GLOBAL_PROMPT_FILE\" || true\n chown 1000:1000 \"$CLAUDE_GLOBAL_PROMPT_FILE\" || true\n fi\nfi\n\nexport CLAUDE_AUTO_SYSTEM_PROMPT`\n\nconst escapeForDoubleQuotes = (value: string): string => {\n const backslash = String.fromCodePoint(92)\n const quote = String.fromCodePoint(34)\n const escapedBackslash = `${backslash}${backslash}`\n const escapedQuote = `${backslash}${quote}`\n return value\n .replaceAll(backslash, escapedBackslash)\n .replaceAll(quote, escapedQuote)\n}\n\nconst renderClaudeGlobalPromptSetup = (config: TemplateConfig): string =>\n entrypointClaudeGlobalPromptTemplate\n .replaceAll(\"__TARGET_DIR__\", config.targetDir)\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__REPO_REF_DEFAULT__\", escapeForDoubleQuotes(config.repoRef))\n .replaceAll(\"__REPO_URL_DEFAULT__\", escapeForDoubleQuotes(config.repoUrl))\n\nconst renderClaudeWrapperSetup = (): string =>\n String.raw`CLAUDE_WRAPPER_BIN=\"/usr/local/bin/claude\"\nif command -v claude >/dev/null 2>&1; then\n CURRENT_CLAUDE_BIN=\"$(command -v claude)\"\n CLAUDE_REAL_DIR=\"$(dirname \"$CURRENT_CLAUDE_BIN\")\"\n CLAUDE_REAL_BIN=\"$CLAUDE_REAL_DIR/.docker-git-claude-real\"\n\n # If a wrapper already exists but points to a missing real binary, recover from /usr/bin.\n if [[ \"$CURRENT_CLAUDE_BIN\" == \"$CLAUDE_WRAPPER_BIN\" && ! -e \"$CLAUDE_REAL_BIN\" && -x \"/usr/bin/claude\" ]]; then\n CURRENT_CLAUDE_BIN=\"/usr/bin/claude\"\n CLAUDE_REAL_DIR=\"/usr/bin\"\n CLAUDE_REAL_BIN=\"$CLAUDE_REAL_DIR/.docker-git-claude-real\"\n fi\n\n # Keep the \"real\" binary in the same directory as the original command to preserve relative symlinks.\n if [[ \"$CURRENT_CLAUDE_BIN\" != \"$CLAUDE_REAL_BIN\" && ! -e \"$CLAUDE_REAL_BIN\" ]]; then\n mv \"$CURRENT_CLAUDE_BIN\" \"$CLAUDE_REAL_BIN\"\n fi\n if [[ -e \"$CLAUDE_REAL_BIN\" ]]; then\n cat <<'EOF' > \"$CLAUDE_WRAPPER_BIN\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nCLAUDE_REAL_BIN=\"__CLAUDE_REAL_BIN__\"\nCLAUDE_CONFIG_DIR=\"${\"$\"}{CLAUDE_CONFIG_DIR:-$HOME/.claude}\"\nCLAUDE_TOKEN_FILE=\"$CLAUDE_CONFIG_DIR/.oauth-token\"\nCLAUDE_CREDENTIALS_FILE=\"$CLAUDE_CONFIG_DIR/.credentials.json\"\n\nif [[ -s \"$CLAUDE_CREDENTIALS_FILE\" ]]; then\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nelif [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n CLAUDE_CODE_OAUTH_TOKEN=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\n export CLAUDE_CODE_OAUTH_TOKEN\nelse\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nfi\n\nexec \"$CLAUDE_REAL_BIN\" \"$@\"\nEOF\n sed -i \"s#__CLAUDE_REAL_BIN__#$CLAUDE_REAL_BIN#g\" \"$CLAUDE_WRAPPER_BIN\" || true\n chmod 0755 \"$CLAUDE_WRAPPER_BIN\" || true\n fi\nfi`\n\nconst renderClaudeProfileSetup = (): string =>\n String.raw`CLAUDE_PROFILE=\"/etc/profile.d/claude-config.sh\"\nprintf \"export CLAUDE_AUTH_LABEL=%q\\n\" \"$CLAUDE_AUTH_LABEL\" > \"$CLAUDE_PROFILE\"\nprintf \"export CLAUDE_CONFIG_DIR=%q\\n\" \"$CLAUDE_CONFIG_DIR\" >> \"$CLAUDE_PROFILE\"\nprintf \"export CLAUDE_AUTO_SYSTEM_PROMPT=%q\\n\" \"$CLAUDE_AUTO_SYSTEM_PROMPT\" >> \"$CLAUDE_PROFILE\"\ncat <<'EOF' >> \"$CLAUDE_PROFILE\"\nCLAUDE_TOKEN_FILE=\"${\"$\"}{CLAUDE_CONFIG_DIR:-$HOME/.claude}/.oauth-token\"\nCLAUDE_CREDENTIALS_FILE=\"${\"$\"}{CLAUDE_CONFIG_DIR:-$HOME/.claude}/.credentials.json\"\nif [[ -s \"$CLAUDE_CREDENTIALS_FILE\" ]]; then\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nelif [[ -f \"$CLAUDE_TOKEN_FILE\" ]]; then\n export CLAUDE_CODE_OAUTH_TOKEN=\"$(tr -d '\\r\\n' < \"$CLAUDE_TOKEN_FILE\")\"\nelse\n unset CLAUDE_CODE_OAUTH_TOKEN || true\nfi\nEOF\nchmod 0644 \"$CLAUDE_PROFILE\" || true\n\ndocker_git_upsert_ssh_env \"CLAUDE_AUTH_LABEL\" \"$CLAUDE_AUTH_LABEL\"\ndocker_git_upsert_ssh_env \"CLAUDE_CONFIG_DIR\" \"$CLAUDE_CONFIG_DIR\"\ndocker_git_upsert_ssh_env \"CLAUDE_CODE_OAUTH_TOKEN\" \"${\"$\"}{CLAUDE_CODE_OAUTH_TOKEN:-}\"\ndocker_git_upsert_ssh_env \"CLAUDE_AUTO_SYSTEM_PROMPT\" \"$CLAUDE_AUTO_SYSTEM_PROMPT\"`\n\nexport const renderEntrypointClaudeConfig = (config: TemplateConfig): string =>\n [\n renderClaudeAuthConfig(config),\n renderClaudeCliInstall(),\n renderClaudeMcpPlaywrightConfig(),\n renderClaudeGlobalPromptSetup(config),\n renderClaudeWrapperSetup(),\n renderClaudeProfileSetup()\n ].join(\"\\n\\n\")\n","import type { TemplateConfig } from \"../domain.js\"\n\nexport const renderEntrypointCodexHome = (config: TemplateConfig): string =>\n `# Ensure Codex home exists if mounted\nmkdir -p ${config.codexHome}\nchown -R 1000:1000 ${config.codexHome}\n\n# Ensure home ownership matches the dev UID/GID (volumes may be stale)\nHOME_OWNER=\"$(stat -c \"%u:%g\" /home/${config.sshUser} 2>/dev/null || echo \"\")\"\nif [[ \"$HOME_OWNER\" != \"1000:1000\" ]]; then\n chown -R 1000:1000 /home/${config.sshUser} || true\nfi`\n\nexport const renderEntrypointCodexSharedAuth = (config: TemplateConfig): string =>\n `# Share Codex auth.json across projects (avoids refresh_token_reused)\nCODEX_SHARE_AUTH=\"\\${CODEX_SHARE_AUTH:-1}\"\nif [[ \"$CODEX_SHARE_AUTH\" == \"1\" ]]; then\n CODEX_LABEL_RAW=\"$CODEX_AUTH_LABEL\"\n if [[ -z \"$CODEX_LABEL_RAW\" ]]; then CODEX_LABEL_RAW=\"default\"; fi\n CODEX_LABEL_NORM=\"$(printf \"%s\" \"$CODEX_LABEL_RAW\" \\\n | tr '[:upper:]' '[:lower:]' \\\n | sed -E 's/[^a-z0-9]+/-/g; s/^-+//; s/-+$//')\"\n if [[ -z \"$CODEX_LABEL_NORM\" ]]; then CODEX_LABEL_NORM=\"default\"; fi\n CODEX_AUTH_LABEL=\"$CODEX_LABEL_NORM\"\n CODEX_SHARED_HOME=\"${config.codexHome}-shared\"\n mkdir -p \"$CODEX_SHARED_HOME\"\n chown -R 1000:1000 \"$CODEX_SHARED_HOME\" || true\n AUTH_FILE=\"${config.codexHome}/auth.json\"\n SHARED_AUTH_FILE=\"$CODEX_SHARED_HOME/auth.json\"\n if [[ \"$CODEX_LABEL_NORM\" != \"default\" ]]; then\n SHARED_AUTH_FILE=\"$CODEX_SHARED_HOME/$CODEX_LABEL_NORM/auth.json\"\n mkdir -p \"$(dirname \"$SHARED_AUTH_FILE\")\"\n fi\n # Guard against a bad bind mount creating a directory at auth.json.\n if [[ -d \"$AUTH_FILE\" ]]; then\n mv \"$AUTH_FILE\" \"$AUTH_FILE.bak-$(date +%s)\" || true\n fi\n if [[ -e \"$AUTH_FILE\" && ! -L \"$AUTH_FILE\" ]]; then\n rm -f \"$AUTH_FILE\" || true\n fi\n ln -sf \"$SHARED_AUTH_FILE\" \"$AUTH_FILE\"\n docker_git_upsert_ssh_env \"CODEX_AUTH_LABEL\" \"$CODEX_AUTH_LABEL\"\nfi`\n\nconst entrypointMcpPlaywrightTemplate = String.raw`# Optional: configure Playwright MCP for Codex (browser automation)\nCODEX_CONFIG_FILE=\"__CODEX_HOME__/config.toml\"\n\n# Keep config.toml consistent with the container build.\n# If Playwright MCP is disabled for this container, remove the block so Codex\n# doesn't try (and fail) to spawn docker-git-playwright-mcp.\nif [[ \"$MCP_PLAYWRIGHT_ENABLE\" != \"1\" ]]; then\n if [[ -f \"$CODEX_CONFIG_FILE\" ]] && grep -q \"^\\[mcp_servers\\.playwright\" \"$CODEX_CONFIG_FILE\" 2>/dev/null; then\n awk '\n BEGIN { skip=0 }\n /^# docker-git: Playwright MCP/ { next }\n /^\\[mcp_servers[.]playwright([.]|\\])/ { skip=1; next }\n skip==1 && /^\\[/ { skip=0 }\n skip==0 { print }\n ' \"$CODEX_CONFIG_FILE\" > \"$CODEX_CONFIG_FILE.tmp\"\n mv \"$CODEX_CONFIG_FILE.tmp\" \"$CODEX_CONFIG_FILE\"\n fi\nelse\n if [[ ! -f \"$CODEX_CONFIG_FILE\" ]]; then\n mkdir -p \"$(dirname \"$CODEX_CONFIG_FILE\")\" || true\n cat <<'EOF' > \"$CODEX_CONFIG_FILE\"\n# docker-git codex config\nmodel = \"gpt-5.3-codex\"\nmodel_reasoning_effort = \"xhigh\"\npersonality = \"pragmatic\"\n\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\nweb_search = \"live\"\n\n[features]\nshell_snapshot = true\nmulti_agent = true\napps = true\nshell_tool = true\nEOF\n chown 1000:1000 \"$CODEX_CONFIG_FILE\" || true\n fi\n\n if [[ -z \"$MCP_PLAYWRIGHT_CDP_ENDPOINT\" ]]; then\n MCP_PLAYWRIGHT_CDP_ENDPOINT=\"http://__SERVICE_NAME__-browser:9223\"\n fi\n\n # Replace the docker-git Playwright block to allow upgrades via --force without manual edits.\n if grep -q \"^\\[mcp_servers\\.playwright\" \"$CODEX_CONFIG_FILE\" 2>/dev/null; then\n awk '\n BEGIN { skip=0 }\n /^# docker-git: Playwright MCP/ { next }\n /^\\[mcp_servers[.]playwright([.]|\\])/ { skip=1; next }\n skip==1 && /^\\[/ { skip=0 }\n skip==0 { print }\n ' \"$CODEX_CONFIG_FILE\" > \"$CODEX_CONFIG_FILE.tmp\"\n mv \"$CODEX_CONFIG_FILE.tmp\" \"$CODEX_CONFIG_FILE\"\n fi\n\n cat <<EOF >> \"$CODEX_CONFIG_FILE\"\n\n# docker-git: Playwright MCP (connects to Chromium via CDP)\n[mcp_servers.playwright]\ncommand = \"docker-git-playwright-mcp\"\nargs = []\nEOF\nfi`\n\nexport const renderEntrypointMcpPlaywright = (config: TemplateConfig): string =>\n entrypointMcpPlaywrightTemplate\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n .replaceAll(\"__SERVICE_NAME__\", config.serviceName)\n\nconst entrypointCodexResumeHintTemplate = `# Ensure codex resume hint is shown for interactive shells\nCODEX_HINT_PATH=\"/etc/profile.d/zz-codex-resume.sh\"\nif [[ ! -s \"$CODEX_HINT_PATH\" ]]; then\n cat <<'EOF' > \"$CODEX_HINT_PATH\"\ndocker_git_workspace_context_line() {\n REPO_REF_VALUE=\"\\${REPO_REF:-__REPO_REF_DEFAULT__}\"\n REPO_URL_VALUE=\"\\${REPO_URL:-__REPO_URL_DEFAULT__}\"\n\n if [[ \"$REPO_REF_VALUE\" == issue-* ]]; then\n ISSUE_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -E 's#^issue-##')\"\n ISSUE_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* ]]; then\n ISSUE_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$ISSUE_REPO_VALUE\" ]]; then\n ISSUE_URL_VALUE=\"https://github.com/$ISSUE_REPO_VALUE/issues/$ISSUE_ID_VALUE\"\n fi\n fi\n if [[ -n \"$ISSUE_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: issue #$ISSUE_ID_VALUE ($ISSUE_URL_VALUE)\"\n else\n printf \"%s\\n\" \"Контекст workspace: issue #$ISSUE_ID_VALUE\"\n fi\n return\n fi\n\n if [[ \"$REPO_REF_VALUE\" == refs/pull/*/head ]]; then\n PR_ID_VALUE=\"$(printf \"%s\" \"$REPO_REF_VALUE\" | sed -nE 's#^refs/pull/([0-9]+)/head$#\\\\1#p')\"\n PR_URL_VALUE=\"\"\n if [[ \"$REPO_URL_VALUE\" == https://github.com/* && -n \"$PR_ID_VALUE\" ]]; then\n PR_REPO_VALUE=\"$(printf \"%s\" \"$REPO_URL_VALUE\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$PR_REPO_VALUE\" ]]; then\n PR_URL_VALUE=\"https://github.com/$PR_REPO_VALUE/pull/$PR_ID_VALUE\"\n fi\n fi\n if [[ -n \"$PR_ID_VALUE\" && -n \"$PR_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: PR #$PR_ID_VALUE ($PR_URL_VALUE)\"\n elif [[ -n \"$PR_ID_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: PR #$PR_ID_VALUE\"\n elif [[ -n \"$REPO_REF_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: pull request ($REPO_REF_VALUE)\"\n fi\n return\n fi\n\n if [[ -n \"$REPO_URL_VALUE\" ]]; then\n printf \"%s\\n\" \"Контекст workspace: $REPO_URL_VALUE\"\n fi\n}\n\ndocker_git_print_codex_resume_hint() {\n if [ -z \"\\${CODEX_RESUME_HINT_SHOWN-}\" ]; then\n DOCKER_GIT_CONTEXT_LINE=\"$(docker_git_workspace_context_line)\"\n if [[ -n \"$DOCKER_GIT_CONTEXT_LINE\" ]]; then\n echo \"$DOCKER_GIT_CONTEXT_LINE\"\n fi\n echo \"Старые сессии можно запустить с помощью codex resume или codex resume <id>, если знаешь айди.\"\n export CODEX_RESUME_HINT_SHOWN=1\n fi\n}\n\nif [ -n \"$BASH_VERSION\" ]; then\n case \"$-\" in\n *i*)\n docker_git_print_codex_resume_hint\n ;;\n esac\nfi\nif [ -n \"$ZSH_VERSION\" ]; then\n if [[ \"$-\" == *i* ]]; then\n docker_git_print_codex_resume_hint\n fi\nfi\nEOF\n chmod 0644 \"$CODEX_HINT_PATH\"\nfi\nif ! grep -q \"zz-codex-resume.sh\" /etc/bash.bashrc 2>/dev/null; then\n printf \"%s\\\\n\" \"if [ -f /etc/profile.d/zz-codex-resume.sh ]; then . /etc/profile.d/zz-codex-resume.sh; fi\" >> /etc/bash.bashrc\nfi\nif [[ -s /etc/zsh/zshrc ]] && ! grep -q \"zz-codex-resume.sh\" /etc/zsh/zshrc 2>/dev/null; then\n printf \"%s\\\\n\" \"if [ -f /etc/profile.d/zz-codex-resume.sh ]; then source /etc/profile.d/zz-codex-resume.sh; fi\" >> /etc/zsh/zshrc\nfi`\n\nconst escapeForDoubleQuotes = (value: string): string => {\n const backslash = String.fromCodePoint(92)\n const quote = String.fromCodePoint(34)\n const escapedBackslash = `${backslash}${backslash}`\n const escapedQuote = `${backslash}${quote}`\n return value\n .replaceAll(backslash, escapedBackslash)\n .replaceAll(quote, escapedQuote)\n}\n\nexport const renderEntrypointCodexResumeHint = (config: TemplateConfig): string =>\n entrypointCodexResumeHintTemplate\n .replaceAll(\"__REPO_REF_DEFAULT__\", escapeForDoubleQuotes(config.repoRef))\n .replaceAll(\"__REPO_URL_DEFAULT__\", escapeForDoubleQuotes(config.repoUrl))\n\nconst entrypointAgentsNoticeTemplate = String.raw`# Ensure global AGENTS.md exists for container context\nAGENTS_PATH=\"__CODEX_HOME__/AGENTS.md\"\nLEGACY_AGENTS_PATH=\"/home/__SSH_USER__/AGENTS.md\"\nPROJECT_LINE=\"Рабочая папка проекта (git clone): __TARGET_DIR__\"\nWORKSPACES_LINE=\"Доступные workspace пути: __TARGET_DIR__\"\nWORKSPACE_INFO_LINE=\"Контекст workspace: repository\"\nFOCUS_LINE=\"Фокус задачи: работай только в workspace, который запрашивает пользователь. Текущий workspace: __TARGET_DIR__\"\nINTERNET_LINE=\"Доступ к интернету: есть. Если чего-то не знаешь — ищи в интернете или по кодовой базе.\"\nif [[ \"$REPO_REF\" == issue-* ]]; then\n ISSUE_ID=\"$(printf \"%s\" \"$REPO_REF\" | sed -E 's#^issue-##')\"\n ISSUE_URL=\"\"\n if [[ \"$REPO_URL\" == https://github.com/* ]]; then\n ISSUE_REPO=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$ISSUE_REPO\" ]]; then\n ISSUE_URL=\"https://github.com/$ISSUE_REPO/issues/$ISSUE_ID\"\n fi\n fi\n if [[ -n \"$ISSUE_URL\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: issue #$ISSUE_ID ($ISSUE_URL)\"\n else\n WORKSPACE_INFO_LINE=\"Контекст workspace: issue #$ISSUE_ID\"\n fi\nelif [[ \"$REPO_REF\" == refs/pull/*/head ]]; then\n PR_ID=\"$(printf \"%s\" \"$REPO_REF\" | sed -nE 's#^refs/pull/([0-9]+)/head$#\\1#p')\"\n PR_URL=\"\"\n if [[ \"$REPO_URL\" == https://github.com/* && -n \"$PR_ID\" ]]; then\n PR_REPO=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##')\"\n if [[ -n \"$PR_REPO\" ]]; then\n PR_URL=\"https://github.com/$PR_REPO/pull/$PR_ID\"\n fi\n fi\n if [[ -n \"$PR_ID\" && -n \"$PR_URL\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: PR #$PR_ID ($PR_URL)\"\n elif [[ -n \"$PR_ID\" ]]; then\n WORKSPACE_INFO_LINE=\"Контекст workspace: PR #$PR_ID\"\n else\n WORKSPACE_INFO_LINE=\"Контекст workspace: pull request ($REPO_REF)\"\n fi\nfi\nif [[ ! -f \"$AGENTS_PATH\" ]]; then\n MANAGED_START=\"<!-- docker-git:managed:start -->\"\n MANAGED_END=\"<!-- docker-git:managed:end -->\"\n MANAGED_BLOCK=\"$(cat <<EOF\n$MANAGED_START\n$PROJECT_LINE\n$WORKSPACES_LINE\n$WORKSPACE_INFO_LINE\n$FOCUS_LINE\n$INTERNET_LINE\n$MANAGED_END\nEOF\n)\"\n cat <<EOF > \"$AGENTS_PATH\"\nТы автономный агент, который имеет полностью все права управления контейнером. У тебя есть доступ к командам sudo, gh, codex, opencode, oh-my-opencode, git, node, pnpm и всем остальным другим. Проекты с которыми идёт работа лежат по пути ~\n$MANAGED_BLOCK\nЕсли ты видишь файлы AGENTS.md внутри проекта, ты обязан их читать и соблюдать инструкции.\nEOF\n chown 1000:1000 \"$AGENTS_PATH\" || true\nfi\nif [[ -f \"$AGENTS_PATH\" ]]; then\n MANAGED_START=\"<!-- docker-git:managed:start -->\"\n MANAGED_END=\"<!-- docker-git:managed:end -->\"\n MANAGED_BLOCK=\"$(cat <<EOF\n$MANAGED_START\n$PROJECT_LINE\n$WORKSPACES_LINE\n$WORKSPACE_INFO_LINE\n$FOCUS_LINE\n$INTERNET_LINE\n$MANAGED_END\nEOF\n)\"\n TMP_AGENTS_PATH=\"$(mktemp)\"\n if grep -qF \"$MANAGED_START\" \"$AGENTS_PATH\" && grep -qF \"$MANAGED_END\" \"$AGENTS_PATH\"; then\n awk -v start=\"$MANAGED_START\" -v end=\"$MANAGED_END\" -v repl=\"$MANAGED_BLOCK\" '\n BEGIN { in_block = 0 }\n $0 == start { print repl; in_block = 1; next }\n $0 == end { in_block = 0; next }\n in_block == 0 { print }\n ' \"$AGENTS_PATH\" > \"$TMP_AGENTS_PATH\"\n else\n sed \\\n -e '/^Рабочая папка проекта (git clone):/d' \\\n -e '/^Доступные workspace пути:/d' \\\n -e '/^Контекст workspace:/d' \\\n -e '/^Фокус задачи:/d' \\\n -e '/^Issue AGENTS.md:/d' \\\n -e '/^Доступ к интернету:/d' \\\n \"$AGENTS_PATH\" > \"$TMP_AGENTS_PATH\"\n if [[ -s \"$TMP_AGENTS_PATH\" ]]; then\n printf \"\\n\" >> \"$TMP_AGENTS_PATH\"\n fi\n printf \"%s\\n\" \"$MANAGED_BLOCK\" >> \"$TMP_AGENTS_PATH\"\n fi\n mv \"$TMP_AGENTS_PATH\" \"$AGENTS_PATH\"\n chown 1000:1000 \"$AGENTS_PATH\" || true\nfi\nif [[ -f \"$LEGACY_AGENTS_PATH\" && -f \"$AGENTS_PATH\" ]]; then\n LEGACY_SUM=\"$(cksum \"$LEGACY_AGENTS_PATH\" 2>/dev/null | awk '{print $1 \\\":\\\" $2}')\"\n CODEX_SUM=\"$(cksum \"$AGENTS_PATH\" 2>/dev/null | awk '{print $1 \\\":\\\" $2}')\"\n if [[ -n \"$LEGACY_SUM\" && \"$LEGACY_SUM\" == \"$CODEX_SUM\" ]]; then\n rm -f \"$LEGACY_AGENTS_PATH\"\n fi\nfi`\n\nexport const renderEntrypointAgentsNotice = (config: TemplateConfig): string =>\n entrypointAgentsNoticeTemplate\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__TARGET_DIR__\", config.targetDir)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst renderAuthLabelResolution = (): string =>\n String.raw`# 2) Ensure GitHub auth vars are available for SSH sessions.\n# Prefer a label-selected token (same selection model as clone/create) when present.\nRESOLVED_AUTH_LABEL=\"\"\nAUTH_LABEL_RAW=\"${\"${\"}GIT_AUTH_LABEL:-${\"${\"}GITHUB_AUTH_LABEL:-}}\"\n\nif [[ -z \"$AUTH_LABEL_RAW\" && \"$REPO_URL\" == https://github.com/* ]]; then\n AUTH_LABEL_RAW=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##' | cut -d/ -f1)\"\nfi\n\nif [[ -n \"$AUTH_LABEL_RAW\" ]]; then\n RESOLVED_AUTH_LABEL=\"$(printf \"%s\" \"$AUTH_LABEL_RAW\" | tr '[:lower:]' '[:upper:]' | sed -E 's/[^A-Z0-9]+/_/g; s/^_+//; s/_+$//')\"\n if [[ \"$RESOLVED_AUTH_LABEL\" == \"DEFAULT\" ]]; then\n RESOLVED_AUTH_LABEL=\"\"\n fi\nfi`\n\nconst renderEffectiveTokenResolution = (): string =>\n String.raw`EFFECTIVE_GITHUB_TOKEN=\"$GITHUB_TOKEN\"\nif [[ -z \"$EFFECTIVE_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$GH_TOKEN\"\nfi\nif [[ -z \"$EFFECTIVE_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$GIT_AUTH_TOKEN\"\nfi\n\nif [[ -n \"$RESOLVED_AUTH_LABEL\" ]]; then\n LABELED_GIT_TOKEN_KEY=\"GIT_AUTH_TOKEN__$RESOLVED_AUTH_LABEL\"\n LABELED_GITHUB_TOKEN_KEY=\"GITHUB_TOKEN__$RESOLVED_AUTH_LABEL\"\n LABELED_GH_TOKEN_KEY=\"GH_TOKEN__$RESOLVED_AUTH_LABEL\"\n\n LABELED_GIT_TOKEN=\"${\"${\"}!LABELED_GIT_TOKEN_KEY-}\"\n LABELED_GITHUB_TOKEN=\"${\"${\"}!LABELED_GITHUB_TOKEN_KEY-}\"\n LABELED_GH_TOKEN=\"${\"${\"}!LABELED_GH_TOKEN_KEY-}\"\n\n if [[ -n \"$LABELED_GIT_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GIT_TOKEN\"\n elif [[ -n \"$LABELED_GITHUB_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GITHUB_TOKEN\"\n elif [[ -n \"$LABELED_GH_TOKEN\" ]]; then\n EFFECTIVE_GITHUB_TOKEN=\"$LABELED_GH_TOKEN\"\n fi\nfi`\n\nconst renderAuthBridgeFinalize = (config: TemplateConfig): string =>\n String.raw`EFFECTIVE_GH_TOKEN=\"$EFFECTIVE_GITHUB_TOKEN\"\n\nif [[ -n \"$EFFECTIVE_GH_TOKEN\" ]]; then\n printf \"export GH_TOKEN=%q\\n\" \"$EFFECTIVE_GH_TOKEN\" > /etc/profile.d/gh-token.sh\n printf \"export GITHUB_TOKEN=%q\\n\" \"$EFFECTIVE_GITHUB_TOKEN\" >> /etc/profile.d/gh-token.sh\n printf \"export GIT_AUTH_TOKEN=%q\\n\" \"$EFFECTIVE_GITHUB_TOKEN\" >> /etc/profile.d/gh-token.sh\n chmod 0644 /etc/profile.d/gh-token.sh\n docker_git_upsert_ssh_env \"GH_TOKEN\" \"$EFFECTIVE_GH_TOKEN\"\n docker_git_upsert_ssh_env \"GITHUB_TOKEN\" \"$EFFECTIVE_GITHUB_TOKEN\"\n docker_git_upsert_ssh_env \"GIT_AUTH_TOKEN\" \"$EFFECTIVE_GITHUB_TOKEN\"\n\n SAFE_GH_TOKEN=\"$(printf \"%q\" \"$EFFECTIVE_GH_TOKEN\")\"\n # Keep git+https auth in sync with gh auth so push/pull works without manual setup.\n su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh auth setup-git --hostname github.com --force\" || true\n\n GH_LOGIN=\"$(su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh api user --jq .login\" 2>/dev/null || true)\"\n GH_ID=\"$(su - ${config.sshUser} -c \"GH_TOKEN=$SAFE_GH_TOKEN gh api user --jq .id\" 2>/dev/null || true)\"\n GH_LOGIN=\"$(printf \"%s\" \"$GH_LOGIN\" | tr -d '\\r\\n')\"\n GH_ID=\"$(printf \"%s\" \"$GH_ID\" | tr -d '\\r\\n')\"\n\n if [[ -z \"$GIT_USER_NAME\" && -n \"$GH_LOGIN\" ]]; then\n GIT_USER_NAME=\"$GH_LOGIN\"\n fi\n if [[ -z \"$GIT_USER_EMAIL\" && -n \"$GH_LOGIN\" && -n \"$GH_ID\" ]]; then\n GIT_USER_EMAIL=\"${\"${\"}GH_ID}+${\"${\"}GH_LOGIN}@users.noreply.github.com\"\n fi\nfi`\n\nconst renderEntrypointAuthEnvBridge = (config: TemplateConfig): string =>\n [\n renderAuthLabelResolution(),\n renderEffectiveTokenResolution(),\n renderAuthBridgeFinalize(config)\n ].join(\"\\n\\n\")\n\nconst renderEntrypointGitCredentialHelper = (config: TemplateConfig): string =>\n String.raw`# 3) Configure git credential helper for HTTPS remotes\nGIT_CREDENTIAL_HELPER_PATH=\"/usr/local/bin/docker-git-credential-helper\"\ncat <<'EOF' > \"$GIT_CREDENTIAL_HELPER_PATH\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nif [[ \"$#\" -lt 1 || \"$1\" != \"get\" ]]; then\n exit 0\nfi\n\ntoken=\"${\"${\"}GITHUB_TOKEN:-}\"\nif [[ -z \"$token\" ]]; then\n token=\"${\"${\"}GH_TOKEN:-}\"\nfi\n\nif [[ -z \"$token\" ]]; then\n exit 0\nfi\n\nprintf \"%s\\n\" \"username=x-access-token\"\nprintf \"%s\\n\" \"password=$token\"\nEOF\nchmod 0755 \"$GIT_CREDENTIAL_HELPER_PATH\"\nsu - ${config.sshUser} -c \"git config --global credential.helper '$GIT_CREDENTIAL_HELPER_PATH'\"`\n\nconst renderEntrypointGitIdentity = (config: TemplateConfig): string =>\n String.raw`# 4) Configure git identity for the dev user if provided\nif [[ -n \"$GIT_USER_NAME\" ]]; then\n SAFE_GIT_USER_NAME=\"$(printf \"%q\" \"$GIT_USER_NAME\")\"\n su - ${config.sshUser} -c \"git config --global user.name $SAFE_GIT_USER_NAME\"\nfi\n\nif [[ -n \"$GIT_USER_EMAIL\" ]]; then\n SAFE_GIT_USER_EMAIL=\"$(printf \"%q\" \"$GIT_USER_EMAIL\")\"\n su - ${config.sshUser} -c \"git config --global user.email $SAFE_GIT_USER_EMAIL\"\nfi`\n\nexport const renderEntrypointGitConfig = (config: TemplateConfig): string =>\n [\n renderEntrypointAuthEnvBridge(config),\n renderEntrypointGitCredentialHelper(config),\n renderEntrypointGitIdentity(config)\n ].join(\"\\n\\n\")\n\nconst entrypointGitHooksTemplate = String\n .raw`# 3) Install global git hooks to protect main/master + managed AGENTS context\nHOOKS_DIR=\"/opt/docker-git/hooks\"\nPRE_PUSH_HOOK=\"$HOOKS_DIR/pre-push\"\nmkdir -p \"$HOOKS_DIR\"\n\ncat <<'EOF' > \"$PRE_PUSH_HOOK\"\n#!/usr/bin/env bash\nset -euo pipefail\n\nprotected_branches=(\"refs/heads/main\" \"refs/heads/master\")\nallow_delete=\"${\"${\"}DOCKER_GIT_ALLOW_DELETE:-}\"\nzero_sha=\"0000000000000000000000000000000000000000\"\nissue_managed_start='<!-- docker-git:issue-managed:start -->'\nissue_managed_end='<!-- docker-git:issue-managed:end -->'\n\nextract_issue_block() {\n local ref=\"$1\"\n\n if ! git cat-file -e \"$ref\" 2>/dev/null; then\n return 0\n fi\n\n local awk_status=0\n if ! git cat-file -p \"$ref\" | awk -v start=\"$issue_managed_start\" -v end=\"$issue_managed_end\" '\n BEGIN { in_block = 0; found = 0 }\n $0 == start { in_block = 1; found = 1 }\n in_block == 1 { print }\n $0 == end && in_block == 1 { in_block = 0; exit }\n END {\n if (found == 0) exit 3\n if (in_block == 1) exit 2\n }\n '; then\n awk_status=$?\n if [[ \"$awk_status\" -eq 3 ]]; then\n return 0\n fi\n return \"$awk_status\"\n fi\n}\n\ncommit_changes_issue_block() {\n local commit=\"$1\"\n local parent=\"\"\n local commit_block=\"\"\n local parent_block=\"\"\n\n if ! git diff-tree --no-commit-id --name-only -r \"$commit\" -- AGENTS.md | grep -qx \"AGENTS.md\"; then\n return 1\n fi\n\n if ! commit_block=\"$(extract_issue_block \"$commit:AGENTS.md\")\"; then\n return 2\n fi\n\n parent=\"$(git rev-list --parents -n 1 \"$commit\" | awk '{print $2}')\"\n if [[ -n \"$parent\" ]]; then\n if ! parent_block=\"$(extract_issue_block \"$parent:AGENTS.md\")\"; then\n return 2\n fi\n fi\n\n if [[ \"$commit_block\" != \"$parent_block\" ]]; then\n return 0\n fi\n return 1\n}\n\ncheck_issue_managed_block_range() {\n local local_sha=\"$1\"\n local remote_sha=\"$2\"\n local commits=\"\"\n local commit=\"\"\n local guard_status=0\n\n if [[ \"$local_sha\" == \"$zero_sha\" ]]; then\n return 0\n fi\n\n if [[ \"$remote_sha\" == \"$zero_sha\" ]]; then\n commits=\"$(git rev-list \"$local_sha\" --not --remotes 2>/dev/null || true)\"\n if [[ -z \"$commits\" ]]; then\n commits=\"$local_sha\"\n fi\n else\n commits=\"$(git rev-list \"$remote_sha..$local_sha\" 2>/dev/null || true)\"\n fi\n\n for commit in $commits; do\n commit_changes_issue_block \"$commit\"\n guard_status=$?\n if [[ \"$guard_status\" -eq 0 ]]; then\n echo \"docker-git: push contains commit updating managed issue block in AGENTS.md: $commit\"\n echo \"docker-git: this block is runtime context and must stay outside repository history.\"\n return 1\n fi\n if [[ \"$guard_status\" -eq 2 ]]; then\n echo \"docker-git: failed to parse managed issue block in AGENTS.md for commit $commit\"\n echo \"docker-git: push blocked to prevent committing runtime workspace metadata.\"\n return 1\n fi\n done\n\n return 0\n}\n\nwhile read -r local_ref local_sha remote_ref remote_sha; do\n if [[ -z \"$remote_ref\" ]]; then\n continue\n fi\n for protected in \"${\"${\"}protected_branches[@]}\"; do\n if [[ \"$remote_ref\" == \"$protected\" || \"$local_ref\" == \"$protected\" ]]; then\n echo \"docker-git: push to protected branch '${\"${\"}protected##*/}' is disabled.\"\n echo \"docker-git: create a new branch: git checkout -b <name>\"\n exit 1\n fi\n done\n if ! check_issue_managed_block_range \"$local_sha\" \"$remote_sha\"; then\n exit 1\n fi\n if [[ \"$local_sha\" == \"$zero_sha\" && \"$remote_ref\" == refs/heads/* ]]; then\n if [[ \"$allow_delete\" != \"1\" ]]; then\n echo \"docker-git: deleting remote branches is disabled (set DOCKER_GIT_ALLOW_DELETE=1 to override).\"\n exit 1\n fi\n fi\ndone\nEOF\nchmod 0755 \"$PRE_PUSH_HOOK\"\ngit config --system core.hooksPath \"$HOOKS_DIR\" || true\ngit config --global core.hooksPath \"$HOOKS_DIR\" || true`\n\nexport const renderEntrypointGitHooks = (): string => entrypointGitHooksTemplate\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst entrypointDockerGitBootstrapTemplate = String\n .raw`# Bootstrap ~/.docker-git for nested docker-git usage inside this container.\nDOCKER_GIT_HOME=\"/home/__SSH_USER__/.docker-git\"\nDOCKER_GIT_AUTH_DIR=\"$DOCKER_GIT_HOME/.orch/auth/codex\"\nDOCKER_GIT_ENV_DIR=\"$DOCKER_GIT_HOME/.orch/env\"\nDOCKER_GIT_ENV_GLOBAL=\"$DOCKER_GIT_ENV_DIR/global.env\"\nDOCKER_GIT_ENV_PROJECT=\"$DOCKER_GIT_ENV_DIR/project.env\"\nDOCKER_GIT_AUTH_KEYS=\"$DOCKER_GIT_HOME/authorized_keys\"\n\nmkdir -p \"$DOCKER_GIT_AUTH_DIR\" \"$DOCKER_GIT_ENV_DIR\" \"$DOCKER_GIT_HOME/.orch/auth/gh\"\n\nif [[ -f \"/home/__SSH_USER__/.ssh/authorized_keys\" ]]; then\n cp \"/home/__SSH_USER__/.ssh/authorized_keys\" \"$DOCKER_GIT_AUTH_KEYS\"\nelif [[ -f /authorized_keys ]]; then\n cp /authorized_keys \"$DOCKER_GIT_AUTH_KEYS\"\nfi\nif [[ -f \"$DOCKER_GIT_AUTH_KEYS\" ]]; then\n chmod 600 \"$DOCKER_GIT_AUTH_KEYS\" || true\nfi\n\nif [[ ! -f \"$DOCKER_GIT_ENV_GLOBAL\" ]]; then\n cat <<'EOF' > \"$DOCKER_GIT_ENV_GLOBAL\"\n# docker-git env\n# KEY=value\nEOF\nfi\nif [[ ! -f \"$DOCKER_GIT_ENV_PROJECT\" ]]; then\n cat <<'EOF' > \"$DOCKER_GIT_ENV_PROJECT\"\n# docker-git project env defaults\nCODEX_SHARE_AUTH=1\nCODEX_AUTO_UPDATE=1\nDOCKER_GIT_ZSH_AUTOSUGGEST=1\nDOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=fg=8,italic\nDOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=history completion\nMCP_PLAYWRIGHT_ISOLATED=1\nEOF\nfi\n\nupsert_env_var() {\n local file=\"$1\"\n local key=\"$2\"\n local value=\"$3\"\n local tmp\n tmp=\"$(mktemp)\"\n awk -v key=\"$key\" 'index($0, key \"=\") != 1 { print }' \"$file\" > \"$tmp\"\n printf \"%s=%s\\n\" \"$key\" \"$value\" >> \"$tmp\"\n mv \"$tmp\" \"$file\"\n}\n\ncopy_if_distinct_file() {\n local source=\"$1\"\n local target=\"$2\"\n if [[ ! -f \"$source\" ]]; then\n return 1\n fi\n local source_real=\"\"\n local target_real=\"\"\n source_real=\"$(readlink -f \"$source\" 2>/dev/null || true)\"\n target_real=\"$(readlink -f \"$target\" 2>/dev/null || true)\"\n if [[ -n \"$source_real\" && -n \"$target_real\" && \"$source_real\" == \"$target_real\" ]]; then\n return 0\n fi\n cp \"$source\" \"$target\"\n return 0\n}\n\nif [[ -n \"$GH_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GH_TOKEN\" \"$GH_TOKEN\"\nfi\nif [[ -n \"$GITHUB_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GITHUB_TOKEN\" \"$GITHUB_TOKEN\"\nelif [[ -n \"$GH_TOKEN\" ]]; then\n upsert_env_var \"$DOCKER_GIT_ENV_GLOBAL\" \"GITHUB_TOKEN\" \"$GH_TOKEN\"\nfi\n\nSOURCE_CODEX_CONFIG=\"__CODEX_HOME__/config.toml\"\ncopy_if_distinct_file \"$SOURCE_CODEX_CONFIG\" \"$DOCKER_GIT_AUTH_DIR/config.toml\" || true\n\nSOURCE_SHARED_AUTH=\"__CODEX_HOME__-shared/auth.json\"\nSOURCE_LOCAL_AUTH=\"__CODEX_HOME__/auth.json\"\nif [[ -f \"$SOURCE_SHARED_AUTH\" ]]; then\n copy_if_distinct_file \"$SOURCE_SHARED_AUTH\" \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nelif [[ -f \"$SOURCE_LOCAL_AUTH\" ]]; then\n copy_if_distinct_file \"$SOURCE_LOCAL_AUTH\" \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nfi\nif [[ -f \"$DOCKER_GIT_AUTH_DIR/auth.json\" ]]; then\n chmod 600 \"$DOCKER_GIT_AUTH_DIR/auth.json\" || true\nfi\n\nchown -R 1000:1000 \"$DOCKER_GIT_HOME\" || true`\n\nexport const renderEntrypointDockerGitBootstrap = (config: TemplateConfig): string =>\n entrypointDockerGitBootstrapTemplate\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst entrypointOpenCodeTemplate = `OPENCODE_DATA_DIR=\"/home/__SSH_USER__/.local/share/opencode\"\nOPENCODE_AUTH_FILE=\"$OPENCODE_DATA_DIR/auth.json\"\nOPENCODE_SHARED_HOME=\"__CODEX_HOME__-shared/opencode\"\nOPENCODE_SHARED_AUTH_FILE=\"$OPENCODE_SHARED_HOME/auth.json\"\n\n# OpenCode: share auth.json across projects (so /connect is one-time)\nOPENCODE_SHARE_AUTH=\"\\${OPENCODE_SHARE_AUTH:-1}\"\nif [[ \"$OPENCODE_SHARE_AUTH\" == \"1\" ]]; then\n # Store in the shared auth volume to persist across projects/containers.\n mkdir -p \"$OPENCODE_DATA_DIR\" \"$OPENCODE_SHARED_HOME\"\n chown -R 1000:1000 \"$OPENCODE_DATA_DIR\" \"$OPENCODE_SHARED_HOME\" || true\n\n # Guard against a bad bind mount creating a directory at auth.json.\n if [[ -d \"$OPENCODE_AUTH_FILE\" ]]; then\n mv \"$OPENCODE_AUTH_FILE\" \"$OPENCODE_AUTH_FILE.bak-$(date +%s)\" || true\n fi\n\n # Migrate existing per-project auth into the shared location once.\n if [[ -f \"$OPENCODE_AUTH_FILE\" && ! -L \"$OPENCODE_AUTH_FILE\" ]]; then\n if [[ -f \"$OPENCODE_SHARED_AUTH_FILE\" ]]; then\n LOCAL_AUTH=\"$OPENCODE_AUTH_FILE\" SHARED_AUTH=\"$OPENCODE_SHARED_AUTH_FILE\" node - <<'NODE'\nconst fs = require(\"fs\")\nconst localPath = process.env.LOCAL_AUTH\nconst sharedPath = process.env.SHARED_AUTH\nconst readJson = (p) => {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\"))\n } catch {\n return {}\n }\n}\nconst local = readJson(localPath)\nconst shared = readJson(sharedPath)\nconst merged = { ...local, ...shared } // shared wins on conflicts\nfs.writeFileSync(sharedPath, JSON.stringify(merged, null, 2), { mode: 0o600 })\nNODE\n else\n cp \"$OPENCODE_AUTH_FILE\" \"$OPENCODE_SHARED_AUTH_FILE\" || true\n chmod 600 \"$OPENCODE_SHARED_AUTH_FILE\" || true\n fi\n chown 1000:1000 \"$OPENCODE_SHARED_AUTH_FILE\" || true\n rm -f \"$OPENCODE_AUTH_FILE\" || true\n fi\n\n ln -sf \"$OPENCODE_SHARED_AUTH_FILE\" \"$OPENCODE_AUTH_FILE\"\nfi\n\n# OpenCode: auto-seed auth from Codex (so /connect is automatic)\nOPENCODE_AUTO_CONNECT=\"\\${OPENCODE_AUTO_CONNECT:-1}\"\nif [[ \"$OPENCODE_AUTO_CONNECT\" == \"1\" ]]; then\n CODEX_AUTH_FILE=\"__CODEX_HOME__/auth.json\"\n OPENCODE_SEED_AUTH=\"$OPENCODE_AUTH_FILE\"\n if [[ \"$OPENCODE_SHARE_AUTH\" == \"1\" ]]; then\n OPENCODE_SEED_AUTH=\"$OPENCODE_SHARED_AUTH_FILE\"\n fi\n CODEX_AUTH=\"$CODEX_AUTH_FILE\" OPENCODE_AUTH=\"$OPENCODE_SEED_AUTH\" node - <<'NODE'\nconst fs = require(\"fs\")\nconst path = require(\"path\")\n\nconst codexPath = process.env.CODEX_AUTH\nconst opencodePath = process.env.OPENCODE_AUTH\n\nif (!codexPath || !opencodePath) {\n process.exit(0)\n}\n\nconst readJson = (p) => {\n try {\n return JSON.parse(fs.readFileSync(p, \"utf8\"))\n } catch {\n return undefined\n }\n}\n\nconst writeJsonAtomic = (p, value) => {\n const dir = path.dirname(p)\n fs.mkdirSync(dir, { recursive: true })\n const tmp = path.join(dir, \".tmp-\" + path.basename(p) + \"-\" + process.pid + \"-\" + Date.now())\n fs.writeFileSync(tmp, JSON.stringify(value, null, 2), { mode: 0o600 })\n fs.renameSync(tmp, p)\n}\n\nconst isRecord = (value) => typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst decodeJwtClaims = (jwt) => {\n if (typeof jwt !== \"string\") return undefined\n const parts = jwt.split(\".\")\n if (parts.length !== 3) return undefined\n try {\n const payload = Buffer.from(parts[1], \"base64url\").toString(\"utf8\")\n return JSON.parse(payload)\n } catch {\n return undefined\n }\n}\n\nconst extractAccountIdFromClaims = (claims) => {\n if (!isRecord(claims)) return undefined\n if (typeof claims.chatgpt_account_id === \"string\") return claims.chatgpt_account_id\n const openaiAuth = claims[\"https://api.openai.com/auth\"]\n if (isRecord(openaiAuth) && typeof openaiAuth.chatgpt_account_id === \"string\") {\n return openaiAuth.chatgpt_account_id\n }\n const orgs = claims.organizations\n if (Array.isArray(orgs) && orgs.length > 0) {\n const first = orgs[0]\n if (isRecord(first) && typeof first.id === \"string\") return first.id\n }\n return undefined\n}\n\nconst extractJwtExpiryMs = (claims) => {\n if (!isRecord(claims)) return undefined\n if (typeof claims.exp !== \"number\") return undefined\n return claims.exp * 1000\n}\n\nconst codex = readJson(codexPath)\nif (!isRecord(codex)) process.exit(0)\n\nlet opencode = readJson(opencodePath)\nif (!isRecord(opencode)) opencode = {}\n\nif (opencode.openai) {\n process.exit(0)\n}\n\nconst apiKey = codex.OPENAI_API_KEY\nif (typeof apiKey === \"string\" && apiKey.trim().length > 0) {\n opencode.openai = { type: \"api\", key: apiKey.trim() }\n writeJsonAtomic(opencodePath, opencode)\n process.exit(0)\n}\n\nconst tokens = codex.tokens\nif (!isRecord(tokens)) process.exit(0)\n\nconst access = tokens.access_token\nconst refresh = tokens.refresh_token\nif (typeof access !== \"string\" || access.length === 0) process.exit(0)\nif (typeof refresh !== \"string\" || refresh.length === 0) process.exit(0)\n\nconst accessClaims = decodeJwtClaims(access)\nconst expires = extractJwtExpiryMs(accessClaims)\nif (typeof expires !== \"number\") process.exit(0)\n\nlet accountId = undefined\nif (typeof tokens.account_id === \"string\" && tokens.account_id.length > 0) {\n accountId = tokens.account_id\n} else {\n const idClaims = decodeJwtClaims(tokens.id_token)\n accountId =\n extractAccountIdFromClaims(idClaims) ||\n extractAccountIdFromClaims(accessClaims)\n}\n\nconst entry = {\n type: \"oauth\",\n refresh,\n access,\n expires,\n ...(typeof accountId === \"string\" && accountId.length > 0 ? { accountId } : {})\n}\n\nopencode.openai = entry\nwriteJsonAtomic(opencodePath, opencode)\nNODE\n chown 1000:1000 \"$OPENCODE_SEED_AUTH\" 2>/dev/null || true\nfi\n\n# OpenCode: ensure global config exists (plugins + permissions)\nOPENCODE_CONFIG_DIR=\"/home/__SSH_USER__/.config/opencode\"\nOPENCODE_CONFIG_JSON=\"$OPENCODE_CONFIG_DIR/opencode.json\"\nOPENCODE_CONFIG_JSONC=\"$OPENCODE_CONFIG_DIR/opencode.jsonc\"\n\nmkdir -p \"$OPENCODE_CONFIG_DIR\"\nchown -R 1000:1000 \"$OPENCODE_CONFIG_DIR\" || true\n\nif [[ ! -f \"$OPENCODE_CONFIG_JSON\" && ! -f \"$OPENCODE_CONFIG_JSONC\" ]]; then\n cat <<'EOF' > \"$OPENCODE_CONFIG_JSON\"\n{\n \"$schema\": \"https://opencode.ai/config.json\",\n \"plugin\": [\"oh-my-opencode\"],\n \"permission\": {\n \"doom_loop\": \"allow\",\n \"external_directory\": \"allow\",\n \"read\": {\n \"*\": \"allow\",\n \"*.env\": \"allow\",\n \"*.env.*\": \"allow\",\n \"*.env.example\": \"allow\"\n }\n }\n}\nEOF\n chown 1000:1000 \"$OPENCODE_CONFIG_JSON\" || true\nfi`\n\n// CHANGE: bootstrap OpenCode config (permissions + plugins) and share OpenCode auth.json across projects\n// WHY: make OpenCode usable out-of-the-box inside disposable docker-git containers\n// QUOTE(ТЗ): \"Preinstall OpenCode and oh-my-opencode with full authorization of existing tools\"\n// REF: issue-34\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: start(s) -> config_exists(s)\n// PURITY: CORE\n// INVARIANT: never overwrites an existing opencode.json/opencode.jsonc\n// COMPLEXITY: O(1)\nexport const renderEntrypointOpenCodeConfig = (config: TemplateConfig): string =>\n entrypointOpenCodeTemplate\n .replaceAll(\"__SSH_USER__\", config.sshUser)\n .replaceAll(\"__CODEX_HOME__\", config.codexHome)\n","import type { TemplateConfig } from \"../domain.js\"\n\nconst renderEntrypointAutoUpdate = (): string =>\n `# 1) Keep Codex CLI up to date if requested (bun only)\nif [[ \"$CODEX_AUTO_UPDATE\" == \"1\" ]]; then\n if command -v bun >/dev/null 2>&1; then\n echo \"[codex] updating via bun...\"\n BUN_INSTALL=/usr/local/bun script -q -e -c \"bun add -g @openai/codex@latest\" /dev/null || true\n else\n echo \"[codex] bun not found, skipping auto-update\"\n fi\nfi`\n\nconst renderClonePreamble = (): string =>\n `# 2) Auto-clone repo if not already present\nmkdir -p /run/docker-git\nCLONE_DONE_PATH=\"/run/docker-git/clone.done\"\nCLONE_FAIL_PATH=\"/run/docker-git/clone.failed\"\nrm -f \"$CLONE_DONE_PATH\" \"$CLONE_FAIL_PATH\"\n\nCLONE_OK=1`\n\nconst renderCloneRemotes = (config: TemplateConfig): string =>\n `if [[ \"$CLONE_OK\" -eq 1 && -d \"$TARGET_DIR/.git\" ]]; then\n if [[ -n \"$FORK_REPO_URL\" && \"$FORK_REPO_URL\" != \"$REPO_URL\" ]]; then\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote set-url origin '$FORK_REPO_URL'\" || true\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote add upstream '$REPO_URL' 2>/dev/null || git remote set-url upstream '$REPO_URL'\" || true\n else\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote set-url origin '$REPO_URL'\" || true\n su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git remote remove upstream >/dev/null 2>&1 || true\" || true\n fi\nfi`\n\nconst renderCloneGuard = (config: TemplateConfig): string =>\n `if [[ -z \"$REPO_URL\" ]]; then\n echo \"[clone] skip (no repo url)\"\nelif [[ -d \"$TARGET_DIR/.git\" ]]; then\n echo \"[clone] skip (already cloned)\"\nelse\n mkdir -p \"$TARGET_DIR\"\n if [[ \"$TARGET_DIR\" != \"/\" ]]; then\n chown -R 1000:1000 \"$TARGET_DIR\"\n fi\n chown -R 1000:1000 /home/${config.sshUser}`\n\nconst renderCloneAuthSelection = (): string =>\n ` RESOLVED_GIT_AUTH_USER=\"$GIT_AUTH_USER\"\n RESOLVED_GIT_AUTH_TOKEN=\"$GIT_AUTH_TOKEN\"\n RESOLVED_GIT_AUTH_LABEL=\"\"\n GIT_TOKEN_LABEL_RAW=\"\\${GIT_AUTH_LABEL:-\\${GITHUB_AUTH_LABEL:-}}\"\n\n if [[ -z \"$GIT_TOKEN_LABEL_RAW\" && \"$REPO_URL\" == https://github.com/* ]]; then\n GIT_TOKEN_LABEL_RAW=\"$(printf \"%s\" \"$REPO_URL\" | sed -E 's#^https://github.com/##; s#[.]git$##; s#/*$##' | cut -d/ -f1)\"\n fi\n\n if [[ -n \"$GIT_TOKEN_LABEL_RAW\" ]]; then\n RESOLVED_GIT_AUTH_LABEL=\"$(printf \"%s\" \"$GIT_TOKEN_LABEL_RAW\" | tr '[:lower:]' '[:upper:]' | sed -E 's/[^A-Z0-9]+/_/g; s/^_+//; s/_+$//')\"\n if [[ \"$RESOLVED_GIT_AUTH_LABEL\" == \"DEFAULT\" ]]; then\n RESOLVED_GIT_AUTH_LABEL=\"\"\n fi\n fi\n\n if [[ -n \"$RESOLVED_GIT_AUTH_LABEL\" ]]; then\n LABELED_GIT_TOKEN_KEY=\"GIT_AUTH_TOKEN__$RESOLVED_GIT_AUTH_LABEL\"\n LABELED_GITHUB_TOKEN_KEY=\"GITHUB_TOKEN__$RESOLVED_GIT_AUTH_LABEL\"\n LABELED_GIT_USER_KEY=\"GIT_AUTH_USER__$RESOLVED_GIT_AUTH_LABEL\"\n\n LABELED_GIT_TOKEN=\"\\${!LABELED_GIT_TOKEN_KEY-}\"\n LABELED_GITHUB_TOKEN=\"\\${!LABELED_GITHUB_TOKEN_KEY-}\"\n LABELED_GIT_USER=\"\\${!LABELED_GIT_USER_KEY-}\"\n\n if [[ -n \"$LABELED_GIT_TOKEN\" ]]; then\n RESOLVED_GIT_AUTH_TOKEN=\"$LABELED_GIT_TOKEN\"\n elif [[ -n \"$LABELED_GITHUB_TOKEN\" ]]; then\n RESOLVED_GIT_AUTH_TOKEN=\"$LABELED_GITHUB_TOKEN\"\n fi\n\n if [[ -n \"$LABELED_GIT_USER\" ]]; then\n RESOLVED_GIT_AUTH_USER=\"$LABELED_GIT_USER\"\n fi\n fi`\n\nconst renderCloneAuthRepoUrl = (): string =>\n ` AUTH_REPO_URL=\"$REPO_URL\"\n if [[ -n \"$RESOLVED_GIT_AUTH_TOKEN\" && \"$REPO_URL\" == https://* ]]; then\n AUTH_REPO_URL=\"$(printf \"%s\" \"$REPO_URL\" | sed \"s#^https://#https://\\${RESOLVED_GIT_AUTH_USER}:\\${RESOLVED_GIT_AUTH_TOKEN}@#\")\"\n fi`\n\nconst renderCloneCacheInit = (config: TemplateConfig): string =>\n ` CLONE_CACHE_ARGS=\"\"\n CACHE_REPO_DIR=\"\"\n CACHE_ROOT=\"/home/${config.sshUser}/.docker-git/.cache/git-mirrors\"\n if command -v sha256sum >/dev/null 2>&1; then\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | sha256sum | awk '{print $1}')\"\n elif command -v shasum >/dev/null 2>&1; then\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | shasum -a 256 | awk '{print $1}')\"\n else\n REPO_CACHE_KEY=\"$(printf \"%s\" \"$REPO_URL\" | tr '/:@' '_' | tr -cd '[:alnum:]_.-')\"\n fi\n\n if [[ -n \"$REPO_CACHE_KEY\" ]]; then\n CACHE_REPO_DIR=\"$CACHE_ROOT/$REPO_CACHE_KEY.git\"\n mkdir -p \"$CACHE_ROOT\"\n chown 1000:1000 \"$CACHE_ROOT\" || true\n if [[ -d \"$CACHE_REPO_DIR\" ]]; then\n if su - ${config.sshUser} -c \"git --git-dir '$CACHE_REPO_DIR' rev-parse --is-bare-repository >/dev/null 2>&1\"; then\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git --git-dir '$CACHE_REPO_DIR' fetch --progress --prune '$AUTH_REPO_URL' '+refs/*:refs/*'\"; then\n echo \"[clone-cache] mirror refresh failed for $REPO_URL\"\n fi\n CLONE_CACHE_ARGS=\"--reference-if-able '$CACHE_REPO_DIR' --dissociate\"\n echo \"[clone-cache] using mirror: $CACHE_REPO_DIR\"\n else\n echo \"[clone-cache] invalid mirror removed: $CACHE_REPO_DIR\"\n rm -rf \"$CACHE_REPO_DIR\"\n fi\n fi\n fi`\n\nconst renderCloneBodyStart = (config: TemplateConfig): string =>\n [\n renderCloneGuard(config),\n renderCloneAuthSelection(),\n renderCloneAuthRepoUrl(),\n renderCloneCacheInit(config)\n ].join(\"\\n\\n\")\n\nconst renderCloneBodyRef = (config: TemplateConfig): string =>\n ` if [[ -n \"$REPO_REF\" ]]; then\n if [[ \"$REPO_REF\" == refs/pull/* ]]; then\n REF_BRANCH=\"pr-$(printf \"%s\" \"$REPO_REF\" | tr '/:' '--')\"\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n else\n if ! su - ${config.sshUser} -c \"cd '$TARGET_DIR' && GIT_TERMINAL_PROMPT=0 git fetch --progress origin '$REPO_REF':'$REF_BRANCH' && git checkout '$REF_BRANCH'\"; then\n echo \"[clone] git fetch failed for $REPO_REF\"\n CLONE_OK=0\n fi\n fi\n else\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS --branch '$REPO_REF' '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] branch '$REPO_REF' missing; retrying without --branch\"\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n elif [[ \"$REPO_REF\" == issue-* ]]; then\n if ! su - ${config.sshUser} -c \"cd '$TARGET_DIR' && git checkout -B '$REPO_REF'\"; then\n echo \"[clone] failed to create local branch '$REPO_REF'\"\n CLONE_OK=0\n fi\n fi\n fi\n fi\n else\n if ! su - ${config.sshUser} -c \"GIT_TERMINAL_PROMPT=0 git clone --progress $CLONE_CACHE_ARGS '$AUTH_REPO_URL' '$TARGET_DIR'\"; then\n echo \"[clone] git clone failed for $REPO_URL\"\n CLONE_OK=0\n fi\n fi`\n\nconst renderCloneCacheFinalize = (config: TemplateConfig): string =>\n `CACHE_REPO_DIR=\"\\${CACHE_REPO_DIR:-}\"\nif [[ \"$CLONE_OK\" -eq 1 && -d \"$TARGET_DIR/.git\" && -n \"$CACHE_REPO_DIR\" && ! -d \"$CACHE_REPO_DIR\" ]]; then\n CACHE_TMP_DIR=\"$CACHE_REPO_DIR.tmp-$$\"\n if su - ${config.sshUser} -c \"rm -rf '$CACHE_TMP_DIR' && GIT_TERMINAL_PROMPT=0 git clone --mirror --progress '$TARGET_DIR/.git' '$CACHE_TMP_DIR'\"; then\n if mv \"$CACHE_TMP_DIR\" \"$CACHE_REPO_DIR\" 2>/dev/null; then\n echo \"[clone-cache] mirror created: $CACHE_REPO_DIR\"\n else\n rm -rf \"$CACHE_TMP_DIR\"\n fi\n else\n echo \"[clone-cache] mirror bootstrap failed for $REPO_URL\"\n rm -rf \"$CACHE_TMP_DIR\"\n fi\nfi`\n\nconst renderCloneBody = (config: TemplateConfig): string =>\n [\n renderCloneBodyStart(config),\n renderCloneBodyRef(config),\n \"fi\",\n \"\",\n renderCloneRemotes(config),\n \"\",\n renderCloneCacheFinalize(config)\n ].join(\"\\n\")\n\nconst renderCloneFinalize = (): string =>\n `if [[ \"$CLONE_OK\" -eq 1 ]]; then\n echo \"[clone] done\"\n touch \"$CLONE_DONE_PATH\"\nelse\n echo \"[clone] failed\"\n touch \"$CLONE_FAIL_PATH\"\nfi`\n\nconst renderEntrypointClone = (config: TemplateConfig): string =>\n [renderClonePreamble(), renderCloneBody(config), renderCloneFinalize()].join(\"\\n\\n\")\n\nexport const renderEntrypointBackgroundTasks = (config: TemplateConfig): string =>\n `# 4) Start background tasks so SSH can come up immediately\n(\n${renderEntrypointAutoUpdate()}\n\n${renderEntrypointClone(config)}\n) &`\n","import type { TemplateConfig } from \"./domain.js\"\nimport {\n renderEntrypointAuthorizedKeys,\n renderEntrypointBaseline,\n renderEntrypointDisableMotd,\n renderEntrypointDockerSocket,\n renderEntrypointHeader,\n renderEntrypointInputRc,\n renderEntrypointPackageCache,\n renderEntrypointSshd,\n renderEntrypointZshShell,\n renderEntrypointZshUserRc\n} from \"./templates-entrypoint/base.js\"\nimport { renderEntrypointClaudeConfig } from \"./templates-entrypoint/claude.js\"\nimport {\n renderEntrypointAgentsNotice,\n renderEntrypointCodexHome,\n renderEntrypointCodexResumeHint,\n renderEntrypointCodexSharedAuth,\n renderEntrypointMcpPlaywright\n} from \"./templates-entrypoint/codex.js\"\nimport { renderEntrypointGitConfig, renderEntrypointGitHooks } from \"./templates-entrypoint/git.js\"\nimport { renderEntrypointDockerGitBootstrap } from \"./templates-entrypoint/nested-docker-git.js\"\nimport { renderEntrypointOpenCodeConfig } from \"./templates-entrypoint/opencode.js\"\nimport { renderEntrypointBackgroundTasks } from \"./templates-entrypoint/tasks.js\"\nimport {\n renderEntrypointBashCompletion,\n renderEntrypointBashHistory,\n renderEntrypointPrompt,\n renderEntrypointZshConfig\n} from \"./templates-prompt.js\"\n\nexport const renderEntrypoint = (config: TemplateConfig): string =>\n [\n renderEntrypointHeader(config),\n renderEntrypointPackageCache(config),\n renderEntrypointAuthorizedKeys(config),\n renderEntrypointCodexHome(config),\n renderEntrypointCodexSharedAuth(config),\n renderEntrypointOpenCodeConfig(config),\n renderEntrypointDockerGitBootstrap(config),\n renderEntrypointMcpPlaywright(config),\n renderEntrypointZshShell(config),\n renderEntrypointZshUserRc(config),\n renderEntrypointPrompt(),\n renderEntrypointBashCompletion(),\n renderEntrypointBashHistory(),\n renderEntrypointInputRc(config),\n renderEntrypointZshConfig(),\n renderEntrypointCodexResumeHint(config),\n renderEntrypointAgentsNotice(config),\n renderEntrypointDockerSocket(config),\n renderEntrypointGitConfig(config),\n renderEntrypointClaudeConfig(config),\n renderEntrypointGitHooks(),\n renderEntrypointBackgroundTasks(config),\n renderEntrypointBaseline(),\n renderEntrypointDisableMotd(),\n renderEntrypointSshd()\n ].join(\"\\n\\n\")\n","import { resolveComposeNetworkName, type TemplateConfig } from \"../domain.js\"\n\ntype ComposeFragments = {\n readonly networkMode: TemplateConfig[\"dockerNetworkMode\"]\n readonly networkName: string\n readonly maybeGitTokenLabelEnv: string\n readonly maybeCodexAuthLabelEnv: string\n readonly maybeClaudeAuthLabelEnv: string\n readonly maybeDependsOn: string\n readonly maybePlaywrightEnv: string\n readonly maybeBrowserService: string\n readonly maybeBrowserVolume: string\n readonly forkRepoUrl: string\n}\n\ntype PlaywrightFragments = Pick<\n ComposeFragments,\n \"maybeDependsOn\" | \"maybePlaywrightEnv\" | \"maybeBrowserService\" | \"maybeBrowserVolume\"\n>\n\nconst renderGitTokenLabelEnv = (gitTokenLabel: string): string =>\n gitTokenLabel.length > 0\n ? ` GITHUB_AUTH_LABEL: \"${gitTokenLabel}\"\\n GIT_AUTH_LABEL: \"${gitTokenLabel}\"\\n`\n : \"\"\n\nconst renderCodexAuthLabelEnv = (codexAuthLabel: string): string =>\n codexAuthLabel.length > 0\n ? ` CODEX_AUTH_LABEL: \"${codexAuthLabel}\"\\n`\n : \"\"\n\nconst renderClaudeAuthLabelEnv = (claudeAuthLabel: string): string =>\n claudeAuthLabel.length > 0\n ? ` CLAUDE_AUTH_LABEL: \"${claudeAuthLabel}\"\\n`\n : \"\"\n\nconst buildPlaywrightFragments = (\n config: TemplateConfig,\n networkName: string\n): PlaywrightFragments => {\n if (!config.enableMcpPlaywright) {\n return {\n maybeDependsOn: \"\",\n maybePlaywrightEnv: \"\",\n maybeBrowserService: \"\",\n maybeBrowserVolume: \"\"\n }\n }\n\n const browserServiceName = `${config.serviceName}-browser`\n const browserContainerName = `${config.containerName}-browser`\n const browserVolumeName = `${config.volumeName}-browser`\n const browserDockerfile = \"Dockerfile.browser\"\n const browserCdpEndpoint = `http://${browserServiceName}:9223`\n\n return {\n maybeDependsOn: ` depends_on:\\n - ${browserServiceName}\\n`,\n maybePlaywrightEnv:\n ` MCP_PLAYWRIGHT_ENABLE: \"1\"\\n MCP_PLAYWRIGHT_CDP_ENDPOINT: \"${browserCdpEndpoint}\"\\n`,\n maybeBrowserService:\n `\\n ${browserServiceName}:\\n build:\\n context: .\\n dockerfile: ${browserDockerfile}\\n container_name: ${browserContainerName}\\n restart: unless-stopped\\n environment:\\n VNC_NOPW: \"1\"\\n shm_size: \"2gb\"\\n expose:\\n - \"9223\"\\n volumes:\\n - ${browserVolumeName}:/data\\n networks:\\n - ${networkName}\\n`,\n maybeBrowserVolume: ` ${browserVolumeName}:\\n`\n }\n}\n\nconst buildComposeFragments = (config: TemplateConfig): ComposeFragments => {\n const networkMode = config.dockerNetworkMode\n const networkName = resolveComposeNetworkName(config)\n const forkRepoUrl = config.forkRepoUrl ?? \"\"\n const gitTokenLabel = config.gitTokenLabel?.trim() ?? \"\"\n const codexAuthLabel = config.codexAuthLabel?.trim() ?? \"\"\n const claudeAuthLabel = config.claudeAuthLabel?.trim() ?? \"\"\n const maybeGitTokenLabelEnv = renderGitTokenLabelEnv(gitTokenLabel)\n const maybeCodexAuthLabelEnv = renderCodexAuthLabelEnv(codexAuthLabel)\n const maybeClaudeAuthLabelEnv = renderClaudeAuthLabelEnv(claudeAuthLabel)\n const playwright = buildPlaywrightFragments(config, networkName)\n\n return {\n networkMode,\n networkName,\n maybeGitTokenLabelEnv,\n maybeCodexAuthLabelEnv,\n maybeClaudeAuthLabelEnv,\n maybeDependsOn: playwright.maybeDependsOn,\n maybePlaywrightEnv: playwright.maybePlaywrightEnv,\n maybeBrowserService: playwright.maybeBrowserService,\n maybeBrowserVolume: playwright.maybeBrowserVolume,\n forkRepoUrl\n }\n}\n\nconst renderComposeServices = (config: TemplateConfig, fragments: ComposeFragments): string =>\n `services:\n ${config.serviceName}:\n build: .\n container_name: ${config.containerName}\n restart: unless-stopped\n environment:\n REPO_URL: \"${config.repoUrl}\"\n REPO_REF: \"${config.repoRef}\"\n FORK_REPO_URL: \"${fragments.forkRepoUrl}\"\n${fragments.maybeGitTokenLabelEnv} # Optional token label selector (maps to GITHUB_TOKEN__<LABEL>/GIT_AUTH_TOKEN__<LABEL>)\n${fragments.maybeCodexAuthLabelEnv} # Optional Codex account label selector (maps to CODEX_AUTH_LABEL)\n${fragments.maybeClaudeAuthLabelEnv} # Optional Claude account label selector (maps to CLAUDE_AUTH_LABEL)\n TARGET_DIR: \"${config.targetDir}\"\n CODEX_HOME: \"${config.codexHome}\"\n${fragments.maybePlaywrightEnv}${fragments.maybeDependsOn} env_file:\n - ${config.envGlobalPath}\n - ${config.envProjectPath}\n ports:\n - \"127.0.0.1:${config.sshPort}:22\"\n volumes:\n - ${config.volumeName}:/home/${config.sshUser}\n - ${config.dockerGitPath}:/home/${config.sshUser}/.docker-git\n - ${config.authorizedKeysPath}:/authorized_keys:ro\n - ${config.codexAuthPath}:${config.codexHome}\n - ${config.codexSharedAuthPath}:${config.codexHome}-shared\n - /var/run/docker.sock:/var/run/docker.sock\n networks:\n - ${fragments.networkName}\n${fragments.maybeBrowserService}`\n\nconst renderComposeNetworks = (\n networkMode: TemplateConfig[\"dockerNetworkMode\"],\n networkName: string\n): string =>\n networkMode === \"shared\"\n ? `networks:\n ${networkName}:\n external: true`\n : `networks:\n ${networkName}:\n driver: bridge`\n\nconst renderComposeVolumes = (config: TemplateConfig, maybeBrowserVolume: string): string =>\n `volumes:\n ${config.volumeName}:\n${maybeBrowserVolume}`\n\nexport const renderDockerCompose = (config: TemplateConfig): string => {\n const fragments = buildComposeFragments(config)\n return [\n renderComposeServices(config, fragments),\n renderComposeNetworks(fragments.networkMode, fragments.networkName),\n renderComposeVolumes(config, fragments.maybeBrowserVolume)\n ].join(\"\\n\\n\")\n}\n","import type { TemplateConfig } from \"../domain.js\"\nimport { renderDockerfilePrompt } from \"../templates-prompt.js\"\n\nconst renderDockerfilePrelude = (): string =>\n `FROM ubuntu:24.04\n\nENV DEBIAN_FRONTEND=noninteractive\nENV NVM_DIR=/usr/local/nvm\n\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n openssh-server git gh ca-certificates curl unzip bsdutils sudo \\\n make docker.io docker-compose-v2 bash-completion zsh zsh-autosuggestions xauth \\\n ncurses-term \\\n && rm -rf /var/lib/apt/lists/*\n\n# Passwordless sudo for all users (container is disposable)\nRUN printf \"%s\\\\n\" \"ALL ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/zz-all \\\n && chmod 0440 /etc/sudoers.d/zz-all`\n\nconst renderDockerfileNode = (): string =>\n `# Tooling: Node 24 (NodeSource) + nvm\nRUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \\\n && apt-get install -y --no-install-recommends nodejs \\\n && node -v \\\n && npm -v \\\n && corepack --version \\\n && rm -rf /var/lib/apt/lists/*\nRUN mkdir -p /usr/local/nvm \\\n && curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash\nRUN printf \"export NVM_DIR=/usr/local/nvm\\\\n[ -s /usr/local/nvm/nvm.sh ] && . /usr/local/nvm/nvm.sh\\\\n\" \\\n > /etc/profile.d/nvm.sh && chmod 0644 /etc/profile.d/nvm.sh`\n\nconst renderDockerfileBunPrelude = (config: TemplateConfig): string =>\n `# Tooling: pnpm + Codex CLI (bun) + oh-my-opencode (npm + platform binary) + Claude Code CLI (npm)\nRUN corepack enable && corepack prepare pnpm@${config.pnpmVersion} --activate\nENV TERM=xterm-256color\nRUN set -eu; \\\n for attempt in 1 2 3 4 5; do \\\n if curl -fsSL --retry 5 --retry-all-errors --retry-delay 2 https://bun.sh/install -o /tmp/bun-install.sh \\\n && BUN_INSTALL=/usr/local/bun bash /tmp/bun-install.sh; then \\\n rm -f /tmp/bun-install.sh; \\\n exit 0; \\\n fi; \\\n echo \"bun install attempt \\${attempt} failed; retrying...\" >&2; \\\n rm -f /tmp/bun-install.sh; \\\n sleep $((attempt * 2)); \\\n done; \\\n echo \"bun install failed after retries\" >&2; \\\n exit 1\nRUN ln -sf /usr/local/bun/bin/bun /usr/local/bin/bun\nRUN BUN_INSTALL=/usr/local/bun script -q -e -c \"bun add -g @openai/codex@latest\" /dev/null\nRUN ln -sf /usr/local/bun/bin/codex /usr/local/bin/codex\nRUN set -eu; \\\n ARCH=\"$(uname -m)\"; \\\n case \"$ARCH\" in \\\n x86_64|amd64) OH_MY_OPENCODE_ARCH=\"x64\" ;; \\\n aarch64|arm64) OH_MY_OPENCODE_ARCH=\"arm64\" ;; \\\n *) echo \"Unsupported arch for oh-my-opencode: $ARCH\" >&2; exit 1 ;; \\\n esac; \\\n npm install -g oh-my-opencode@latest \"oh-my-opencode-linux-\\${OH_MY_OPENCODE_ARCH}@latest\"\nRUN oh-my-opencode --version\nRUN npm install -g @anthropic-ai/claude-code@latest\nRUN claude --version`\n\nconst renderDockerfileOpenCode = (): string =>\n `# Tooling: OpenCode (binary)\nRUN curl -fsSL https://opencode.ai/install | HOME=/usr/local bash -s -- --no-modify-path\nRUN ln -sf /usr/local/.opencode/bin/opencode /usr/local/bin/opencode\nRUN opencode --version`\n\nconst gitleaksVersion = \"8.28.0\"\n\nconst renderDockerfileGitleaks = (): string =>\n `# Tooling: gitleaks (secret scanner for .knowledge/.knowlenge hooks)\nRUN ARCH=\"$(uname -m)\" \\\n && case \"$ARCH\" in \\\n x86_64|amd64) GITLEAKS_ARCH=\"x64\" ;; \\\n aarch64|arm64) GITLEAKS_ARCH=\"arm64\" ;; \\\n *) echo \"Unsupported arch for gitleaks: $ARCH\" >&2; exit 1 ;; \\\n esac \\\n && curl -fsSL \"https://github.com/gitleaks/gitleaks/releases/download/v${gitleaksVersion}/gitleaks_${gitleaksVersion}_linux_$GITLEAKS_ARCH.tar.gz\" \\\n | tar -xz -C /usr/local/bin gitleaks \\\n && chmod +x /usr/local/bin/gitleaks \\\n && gitleaks version`\n\nconst dockerfilePlaywrightMcpBlock = String.raw`RUN npm install -g @playwright/mcp@latest\n\n# docker-git: wrapper that converts a CDP HTTP endpoint into a usable WS endpoint\n# Some Chromium images return webSocketDebuggerUrl pointing at 127.0.0.1 (container-local).\nRUN cat <<'EOF' > /usr/local/bin/docker-git-playwright-mcp\n#!/usr/bin/env bash\nset -euo pipefail\n\n# Fast-path for help/version (avoid waiting for the browser sidecar).\nfor arg in \"$@\"; do\n case \"$arg\" in\n -h|--help|-V|--version)\n exec playwright-mcp \"$@\"\n ;;\n esac\ndone\n\nCDP_ENDPOINT=\"\\${MCP_PLAYWRIGHT_CDP_ENDPOINT:-}\"\nif [[ -z \"$CDP_ENDPOINT\" ]]; then\n CDP_ENDPOINT=\"http://__SERVICE_NAME__-browser:9223\"\nfi\n\n# kechangdev/browser-vnc binds Chromium CDP on 127.0.0.1:9222; it also host-checks HTTP requests.\nJSON=\"$(curl -sSf --connect-timeout 3 --max-time 10 -H 'Host: 127.0.0.1:9222' \"\\${CDP_ENDPOINT%/}/json/version\")\"\nWS_URL=\"$(printf \"%s\" \"$JSON\" | node -e 'const fs=require(\"fs\"); const j=JSON.parse(fs.readFileSync(0,\"utf8\")); process.stdout.write(j.webSocketDebuggerUrl || \"\")')\"\nif [[ -z \"$WS_URL\" ]]; then\n echo \"docker-git-playwright-mcp: webSocketDebuggerUrl missing\" >&2\n exit 1\nfi\n\n# Rewrite ws origin to match the CDP endpoint origin (docker DNS).\nBASE_WS=\"$(CDP_ENDPOINT=\"$CDP_ENDPOINT\" node -e 'const { URL } = require(\"url\"); const u=new URL(process.env.CDP_ENDPOINT); const proto=u.protocol===\"https:\"?\"wss:\":\"ws:\"; process.stdout.write(proto + \"//\" + u.host)')\"\nWS_REWRITTEN=\"$(BASE_WS=\"$BASE_WS\" WS_URL=\"$WS_URL\" node -e 'const { URL } = require(\"url\"); const base=new URL(process.env.BASE_WS); const ws=new URL(process.env.WS_URL); ws.protocol=base.protocol; ws.host=base.host; process.stdout.write(ws.toString())')\"\n\nEXTRA_ARGS=()\nif [[ \"\\${MCP_PLAYWRIGHT_ISOLATED:-1}\" == \"1\" ]]; then\n EXTRA_ARGS+=(--isolated)\nfi\n\nexec playwright-mcp --cdp-endpoint \"$WS_REWRITTEN\" \"\\${EXTRA_ARGS[@]}\" \"$@\"\nEOF\nRUN chmod +x /usr/local/bin/docker-git-playwright-mcp`\n\nconst renderDockerfileBunProfile = (): string =>\n `RUN printf \"export PATH=/usr/local/bun/bin:$PATH\\\\n\" \\\n > /etc/profile.d/bun.sh && chmod 0644 /etc/profile.d/bun.sh`\n\nconst renderDockerfileBun = (config: TemplateConfig): string =>\n [\n renderDockerfileBunPrelude(config),\n config.enableMcpPlaywright\n ? dockerfilePlaywrightMcpBlock\n .replaceAll(\"\\\\${\", \"${\")\n .replaceAll(\"__SERVICE_NAME__\", config.serviceName)\n : \"\",\n renderDockerfileBunProfile()\n ]\n .filter((chunk) => chunk.trim().length > 0)\n .join(\"\\n\")\n\nconst renderDockerfileUsers = (config: TemplateConfig): string =>\n `# Create non-root user for SSH (align UID/GID with host user 1000)\nRUN if id -u ubuntu >/dev/null 2>&1; then \\\n if getent group 1000 >/dev/null 2>&1; then \\\n EXISTING_GROUP=\"$(getent group 1000 | cut -d: -f1)\"; \\\n if [ \"$EXISTING_GROUP\" != \"${config.sshUser}\" ]; then groupmod -n ${config.sshUser} \"$EXISTING_GROUP\" || true; fi; \\\n fi; \\\n usermod -l ${config.sshUser} -d /home/${config.sshUser} -m -s /usr/bin/zsh ubuntu || true; \\\n fi\nRUN if id -u ${config.sshUser} >/dev/null 2>&1; then \\\n usermod -u 1000 -g 1000 -o ${config.sshUser}; \\\n else \\\n groupadd -g 1000 ${config.sshUser} || true; \\\n useradd -m -s /usr/bin/zsh -u 1000 -g 1000 -o ${config.sshUser}; \\\n fi\nRUN printf \"%s\\\\n\" \"${config.sshUser} ALL=(ALL) NOPASSWD:ALL\" > /etc/sudoers.d/${config.sshUser} \\\n && chmod 0440 /etc/sudoers.d/${config.sshUser}\n\n# sshd runtime dir\nRUN mkdir -p /run/sshd\n\n# Harden sshd: disable password auth and root login\nRUN printf \"%s\\\\n\" \\\n \"PasswordAuthentication no\" \\\n \"PermitRootLogin no\" \\\n \"PubkeyAuthentication yes\" \\\n \"X11Forwarding yes\" \\\n \"X11UseLocalhost yes\" \\\n \"PermitUserEnvironment yes\" \\\n \"AllowUsers ${config.sshUser}\" \\\n > /etc/ssh/sshd_config.d/${config.sshUser}.conf`\n\nconst renderDockerfileWorkspace = (config: TemplateConfig): string =>\n `# Workspace path (supports root-level dirs like /repo)\nRUN mkdir -p ${config.targetDir} \\\n && chown -R 1000:1000 /home/${config.sshUser} \\\n && if [ \"${config.targetDir}\" != \"/\" ]; then chown -R 1000:1000 \"${config.targetDir}\"; fi\n\nCOPY entrypoint.sh /entrypoint.sh\nRUN chmod +x /entrypoint.sh\n\nEXPOSE 22\nENTRYPOINT [\"/entrypoint.sh\"]`\n\nexport const renderDockerfile = (config: TemplateConfig): string =>\n [\n renderDockerfilePrelude(),\n renderDockerfilePrompt(),\n renderDockerfileNode(),\n renderDockerfileBun(config),\n renderDockerfileOpenCode(),\n renderDockerfileGitleaks(),\n renderDockerfileUsers(config),\n renderDockerfileWorkspace(config)\n ].join(\"\\n\\n\")\n","export const renderPlaywrightBrowserDockerfile = (): string =>\n `FROM kechangdev/browser-vnc:latest\n\n# bash for noVNC startup, procps for ps -p used by novnc_proxy, socat for CDP proxy\n# python3/net-tools for diagnostics\nRUN apk add --no-cache bash procps socat python3 net-tools\n\nCOPY mcp-playwright-start-extra.sh /usr/local/bin/mcp-playwright-start-extra.sh\nRUN chmod +x /usr/local/bin/mcp-playwright-start-extra.sh\n\n# Start extra services in background, keep base stack in foreground\n# Clear stale Chromium profile locks before boot\nENTRYPOINT [\"/bin/sh\", \"-lc\", \"rm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true; /usr/local/bin/mcp-playwright-start-extra.sh & exec /start.sh\"]`\n\nexport const renderPlaywrightStartExtra = (): string =>\n `#!/bin/sh\nset -eu\n\n# Clear stale Chromium locks from previous container runs\nrm -f /data/SingletonLock /data/SingletonCookie /data/SingletonSocket || true\n\n# Wait for chromium/x11vnc/noVNC to come up\nsleep 2\n\n# CDP proxy: expose 9223 on the docker network, forward to 127.0.0.1:9222 inside the browser container\nsocat TCP-LISTEN:9223,fork,reuseaddr TCP:127.0.0.1:9222 >/var/log/socat-9223.log 2>&1 &\n\n# Optional VNC password disabling (useful if you publish VNC/noVNC ports)\nif [ \"\\${VNC_NOPW:-1}\" = \"1\" ]; then\n pkill x11vnc || true\n x11vnc -display :99 -rfbport 5900 -nopw -forever -shared -bg -o /var/log/x11vnc-nopw.log\nfi\n\necho \"extra services started\"\nexit 0\n`\n","import type { TemplateConfig } from \"./domain.js\"\nimport { renderEntrypoint } from \"./templates-entrypoint.js\"\nimport { renderDockerCompose } from \"./templates/docker-compose.js\"\nimport { renderDockerfile } from \"./templates/dockerfile.js\"\nimport { renderPlaywrightBrowserDockerfile, renderPlaywrightStartExtra } from \"./templates/playwright.js\"\n\nexport type FileSpec =\n | { readonly _tag: \"File\"; readonly relativePath: string; readonly contents: string; readonly mode?: number }\n | { readonly _tag: \"Dir\"; readonly relativePath: string }\n\nconst renderGitignore = (): string =>\n `# docker-git project files\n# NOTE: this directory is intended to be committed to the docker-git state repository.\n# It intentionally does not ignore .orch/ or auth files; keep the state repo private.\n\n# Volatile Codex artifacts (do not commit)\n.orch/auth/codex/log/\n.orch/auth/codex/tmp/\n.orch/auth/codex/sessions/\n.orch/auth/codex/models_cache.json\n`\n\nconst renderDockerignore = (): string =>\n `# docker-git build context\n.orch/\nauthorized_keys\n`\n\nconst renderConfigJson = (config: TemplateConfig): string =>\n `${JSON.stringify({ schemaVersion: 1, template: config }, null, 2)}\n`\n\nexport const planFiles = (config: TemplateConfig): ReadonlyArray<FileSpec> => {\n const maybePlaywrightFiles = config.enableMcpPlaywright\n ? ([\n { _tag: \"File\", relativePath: \"Dockerfile.browser\", contents: renderPlaywrightBrowserDockerfile() },\n {\n _tag: \"File\",\n relativePath: \"mcp-playwright-start-extra.sh\",\n contents: renderPlaywrightStartExtra(),\n mode: 0o755\n }\n ] satisfies ReadonlyArray<FileSpec>)\n : ([] satisfies ReadonlyArray<FileSpec>)\n\n return [\n { _tag: \"File\", relativePath: \"Dockerfile\", contents: renderDockerfile(config) },\n { _tag: \"File\", relativePath: \"entrypoint.sh\", contents: renderEntrypoint(config), mode: 0o755 },\n { _tag: \"File\", relativePath: \"docker-compose.yml\", contents: renderDockerCompose(config) },\n { _tag: \"File\", relativePath: \".dockerignore\", contents: renderDockerignore() },\n { _tag: \"File\", relativePath: \"docker-git.json\", contents: renderConfigJson(config) },\n { _tag: \"File\", relativePath: \".gitignore\", contents: renderGitignore() },\n ...maybePlaywrightFiles,\n { _tag: \"Dir\", relativePath: \".orch/auth/codex\" },\n { _tag: \"Dir\", relativePath: \".orch/env\" }\n ]\n}\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, Match } from \"effect\"\n\nimport { type TemplateConfig } from \"../core/domain.js\"\nimport { type FileSpec, planFiles } from \"../core/templates.js\"\nimport { FileExistsError } from \"./errors.js\"\nimport { resolveBaseDir } from \"./paths.js\"\n\nconst ensureParentDir = (path: Path.Path, fs: FileSystem.FileSystem, filePath: string) =>\n fs.makeDirectory(path.dirname(filePath), { recursive: true })\n\nconst isFileSpec = (spec: FileSpec): spec is Extract<FileSpec, { readonly _tag: \"File\" }> => spec._tag === \"File\"\n\nconst resolveSpecPath = (\n path: Path.Path,\n baseDir: string,\n spec: Extract<FileSpec, { readonly _tag: \"File\" }>\n): string => path.join(baseDir, spec.relativePath)\n\nconst writeSpec = (\n path: Path.Path,\n fs: FileSystem.FileSystem,\n baseDir: string,\n spec: FileSpec\n) => {\n const fullPath = path.join(baseDir, spec.relativePath)\n\n return Match.value(spec).pipe(\n Match.when({ _tag: \"Dir\" }, () => fs.makeDirectory(fullPath, { recursive: true })),\n Match.when({ _tag: \"File\" }, (file) =>\n Effect.gen(function*(_) {\n yield* _(ensureParentDir(path, fs, fullPath))\n yield* _(\n fs.writeFileString(\n fullPath,\n file.contents,\n file.mode === undefined ? undefined : { mode: file.mode }\n )\n )\n })),\n Match.exhaustive\n )\n}\n\nconst collectExistingFilePaths = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n baseDir: string,\n specs: ReadonlyArray<FileSpec>\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const existingPaths: Array<string> = []\n for (const spec of specs) {\n if (!isFileSpec(spec)) {\n continue\n }\n const filePath = resolveSpecPath(path, baseDir, spec)\n const exists = yield* _(fs.exists(filePath))\n if (exists) {\n existingPaths.push(filePath)\n }\n }\n return existingPaths\n })\n\nconst failOnExistingFiles = (\n existingFilePaths: ReadonlyArray<string>,\n skipExistingFiles: boolean\n): Effect.Effect<void, FileExistsError> => {\n if (skipExistingFiles || existingFilePaths.length === 0) {\n return Effect.void\n }\n const firstPath = existingFilePaths[0]\n if (!firstPath) {\n return Effect.void\n }\n return Effect.fail(new FileExistsError({ path: firstPath }))\n}\n\n// CHANGE: write generated docker-git files to disk\n// WHY: isolate all filesystem effects in a thin shell\n// QUOTE(ТЗ): \"создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall cfg, dir: write(plan(cfg), dir) -> files(dir, cfg)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: does not overwrite files unless force=true\n// COMPLEXITY: O(n) where n = |files|\nexport const writeProjectFiles = (\n outDir: string,\n config: TemplateConfig,\n force: boolean,\n skipExistingFiles: boolean = false\n): Effect.Effect<\n ReadonlyArray<string>,\n FileExistsError | PlatformError,\n FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved: baseDir } = yield* _(resolveBaseDir(outDir))\n\n yield* _(fs.makeDirectory(baseDir, { recursive: true }))\n\n const specs = planFiles(config)\n const created: Array<string> = []\n const existingFilePaths = force ? [] : yield* _(collectExistingFilePaths(fs, path, baseDir, specs))\n const existingSet = new Set(existingFilePaths)\n\n yield* _(failOnExistingFiles(existingFilePaths, skipExistingFiles))\n\n for (const spec of specs) {\n if (!force && skipExistingFiles && isFileSpec(spec)) {\n const filePath = resolveSpecPath(path, baseDir, spec)\n if (existingSet.has(filePath)) {\n continue\n }\n }\n yield* _(writeSpec(path, fs, baseDir, spec))\n if (isFileSpec(spec)) {\n created.push(resolveSpecPath(path, baseDir, spec))\n }\n }\n\n return created\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\n\nconst toPosixPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nconst isLegacyDockerGitRelativePath = (value: string): boolean => {\n const normalized = value.replaceAll(\"\\\\\", \"/\").trim()\n return normalized === \".docker-git\" ||\n normalized === \"./.docker-git\" ||\n normalized.startsWith(\".docker-git/\") ||\n normalized.startsWith(\"./.docker-git/\")\n}\n\nconst shouldNormalizePath = (path: Path.Path, value: string): boolean =>\n path.isAbsolute(value) || isLegacyDockerGitRelativePath(value)\n\nconst withFallback = (value: string, fallback: string): string => value.length > 0 ? value : fallback\n\nconst pathFieldsForNormalization = (template: TemplateConfig): ReadonlyArray<string> => [\n template.dockerGitPath,\n template.authorizedKeysPath,\n template.envGlobalPath,\n template.envProjectPath,\n template.codexAuthPath,\n template.codexSharedAuthPath\n]\n\nconst hasLegacyTemplatePaths = (path: Path.Path, template: TemplateConfig): boolean =>\n pathFieldsForNormalization(template).some((value) => shouldNormalizePath(path, value))\n\nconst normalizeTemplateConfig = (\n path: Path.Path,\n projectsRoot: string,\n projectDir: string,\n template: TemplateConfig\n): TemplateConfig | null => {\n if (!hasLegacyTemplatePaths(path, template)) {\n return null\n }\n\n // The state repo is shared across machines, so never persist absolute host paths in tracked files.\n const authorizedKeysAbs = path.join(projectsRoot, \"authorized_keys\")\n const authorizedKeysRel = toPosixPath(path.relative(projectDir, authorizedKeysAbs))\n const dockerGitRel = toPosixPath(path.relative(projectDir, projectsRoot))\n\n const envGlobalPath = \"./.orch/env/global.env\"\n const envProjectPath = \"./.orch/env/project.env\"\n const codexAuthPath = \"./.orch/auth/codex\"\n const codexSharedAbs = path.join(projectsRoot, \".orch\", \"auth\", \"codex\")\n const codexSharedRel = toPosixPath(path.relative(projectDir, codexSharedAbs))\n\n return {\n ...template,\n dockerGitPath: withFallback(dockerGitRel, \"./.docker-git\"),\n authorizedKeysPath: withFallback(authorizedKeysRel, \"./authorized_keys\"),\n envGlobalPath,\n envProjectPath,\n codexAuthPath,\n codexSharedAuthPath: withFallback(codexSharedRel, \"./.orch/auth/codex\")\n }\n}\n\n// CHANGE: normalize legacy docker-git project files inside the git-synced state repo\n// WHY: state is stored in git and must be portable across machines/OSes (no absolute host paths)\n// QUOTE(ТЗ): \"в них не должно быть зарадкожено полных путей типо /home/dev\" / \"контейнеры должны одинаково ставится на разные ОС\"\n// REF: user-request-2026-02-09-state-normalize-paths\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: normalize(p) -> portable(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: preserves repo identity (repoUrl/repoRef/containerName/ports); only rewrites host-path fields\n// COMPLEXITY: O(n) where n = |projects|\nexport const normalizeLegacyStateProjects = (\n projectsRoot: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const root = path.resolve(projectsRoot)\n const configPaths = yield* _(findDockerGitConfigPaths(fs, path, root))\n if (configPaths.length === 0) {\n return\n }\n\n let updated = 0\n for (const configPath of configPaths) {\n const projectDir = path.dirname(configPath)\n const config = yield* _(\n readProjectConfig(projectDir).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed(null),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (config === null) {\n continue\n }\n\n const normalized = normalizeTemplateConfig(path, root, projectDir, config.template)\n if (normalized === null) {\n continue\n }\n\n yield* _(\n writeProjectFiles(projectDir, normalized, true).pipe(\n Effect.catchTag(\n \"FileExistsError\",\n (error) =>\n Effect.logWarning(\n `Skipping normalization for ${projectDir}: ${error.path} already exists`\n ).pipe(Effect.zipRight(Effect.succeed<ReadonlyArray<string>>([])))\n ),\n Effect.asVoid\n )\n )\n updated += 1\n }\n\n if (updated > 0) {\n yield* _(Effect.log(`Normalized ${updated} docker-git project(s) in state repo.`))\n }\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\nimport { normalizeLegacyStateProjects } from \"../state-normalize.js\"\nimport { defaultSyncMessage } from \"./env.js\"\nimport { git, gitCapture, gitExitCode, successExitCode } from \"./git-commands.js\"\nimport type { GitAuthEnv } from \"./github-auth.js\"\nimport { tryBuildGithubCompareUrl, withGithubAskpassEnv } from \"./github-auth.js\"\n\ntype StateRepoEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveOriginPushTarget = (originUrl: string | null): string => {\n const trimmed = originUrl?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : \"origin\"\n}\n\nconst resolveSyncMessage = (value: string | null): string => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length > 0 ? trimmed : defaultSyncMessage\n}\n\nconst logOpenPr = (originUrl: string, baseBranch: string, prBranch: string, compareUrl: string | null) =>\n compareUrl\n ? Effect.log(`Open PR: ${compareUrl}`)\n : Effect.log(`Open PR from '${prBranch}' into '${baseBranch}' (origin: ${originUrl}).`)\n\nconst commitAllIfNeeded = (\n root: string,\n message: string,\n env: GitAuthEnv\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(git(root, [\"add\", \"-A\"], env))\n const diffExit = yield* _(gitExitCode(root, [\"diff\", \"--cached\", \"--quiet\"], env))\n if (diffExit === successExitCode) {\n return\n }\n yield* _(git(root, [\"commit\", \"-m\", message], env))\n })\n\nconst sanitizeBranchComponent = (value: string): string =>\n value\n .trim()\n .replaceAll(\" \", \"-\")\n .replaceAll(\":\", \"-\")\n .replaceAll(\"..\", \"-\")\n .replaceAll(\"@{\", \"-\")\n .replaceAll(\"\\\\\", \"-\")\n .replaceAll(\"^\", \"-\")\n .replaceAll(\"~\", \"-\")\n\nconst rebaseOntoOriginIfPossible = (\n root: string,\n baseBranch: string,\n env: GitAuthEnv\n): Effect.Effect<\"ok\" | \"skipped\" | \"conflict\", CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n // Ensure we see the latest remote branch tip before attempting to rebase.\n const fetchExit = yield* _(gitExitCode(root, [\"fetch\", \"origin\", \"--prune\"], env))\n if (fetchExit !== successExitCode) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"git fetch origin --prune\", exitCode: fetchExit })))\n }\n\n const remoteRef = `refs/remotes/origin/${baseBranch}`\n const hasRemoteBranchExit = yield* _(gitExitCode(root, [\"show-ref\", \"--verify\", \"--quiet\", remoteRef], env))\n if (hasRemoteBranchExit !== successExitCode) {\n return \"skipped\"\n }\n\n const rebaseExit = yield* _(gitExitCode(root, [\"rebase\", `origin/${baseBranch}`], env))\n if (rebaseExit === successExitCode) {\n return \"ok\"\n }\n\n // Best-effort: avoid leaving the repo in a rebase-in-progress state.\n yield* _(gitExitCode(root, [\"rebase\", \"--abort\"], env))\n return \"conflict\"\n })\n\nconst pushToNewBranch = (\n root: string,\n baseBranch: string,\n originPushTarget: string,\n env: GitAuthEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const headShort = yield* _(\n gitCapture(root, [\"rev-parse\", \"--short\", \"HEAD\"], env).pipe(Effect.map((value) => value.trim()))\n )\n const timestamp = yield* _(Effect.sync(() => new Date().toISOString().replaceAll(\":\", \"-\").replaceAll(\".\", \"-\")))\n const branch = sanitizeBranchComponent(`state-sync/${baseBranch}/${timestamp}-${headShort}`)\n\n yield* _(git(root, [\"push\", \"--no-verify\", originPushTarget, `HEAD:refs/heads/${branch}`], env))\n return branch\n })\n\nconst resolveBaseBranch = (value: string): string => (value === \"HEAD\" ? \"main\" : value)\n\nconst getCurrentBranch = (\n root: string,\n env: GitAuthEnv\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n gitCapture(root, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], env).pipe(Effect.map((value) => value.trim()))\n\nexport const runStateSyncOps = (\n root: string,\n originUrl: string,\n message: string | null,\n env: GitAuthEnv,\n options?: { readonly originPushUrlOverride?: string | null }\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const originPushUrlOverride = options?.originPushUrlOverride ?? null\n const originPushTarget = resolveOriginPushTarget(originPushUrlOverride)\n yield* _(normalizeLegacyStateProjects(root))\n yield* _(commitAllIfNeeded(root, resolveSyncMessage(message), env))\n\n const branch = yield* _(getCurrentBranch(root, env))\n const baseBranch = resolveBaseBranch(branch)\n\n const rebaseResult = yield* _(rebaseOntoOriginIfPossible(root, baseBranch, env))\n if (rebaseResult === \"conflict\") {\n const prBranch = yield* _(pushToNewBranch(root, baseBranch, originPushTarget, env))\n const compareUrl = tryBuildGithubCompareUrl(originUrl, baseBranch, prBranch)\n\n yield* _(Effect.logWarning(`State sync needs manual merge: pushed changes to branch '${prBranch}'.`))\n yield* _(logOpenPr(originUrl, baseBranch, prBranch, compareUrl))\n return\n }\n\n const pushExit = yield* _(\n gitExitCode(root, [\"push\", \"--no-verify\", originPushTarget, `HEAD:refs/heads/${baseBranch}`], env)\n )\n if (pushExit === successExitCode) {\n return\n }\n\n const prBranch = yield* _(pushToNewBranch(root, baseBranch, originPushTarget, env))\n const compareUrl = tryBuildGithubCompareUrl(originUrl, baseBranch, prBranch)\n yield* _(Effect.logWarning(`State push failed (exit ${pushExit}); pushed changes to branch '${prBranch}'.`))\n yield* _(logOpenPr(originUrl, baseBranch, prBranch, compareUrl))\n }).pipe(Effect.asVoid)\n\nexport const runStateSyncWithToken = (\n token: string,\n root: string,\n originUrl: string,\n message: string | null\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n withGithubAskpassEnv(\n token,\n (env) => runStateSyncOps(root, originUrl, message, env, { originPushUrlOverride: originUrl })\n )\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\nimport { runCommandExitCode } from \"../shell/command-runner.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { defaultProjectsRoot } from \"./menu-helpers.js\"\nimport { autoSyncEnvKey, autoSyncStrictEnvKey, isAutoSyncEnabled, isTruthyEnv } from \"./state-repo/env.js\"\nimport {\n git,\n gitBaseEnv,\n gitCapture,\n gitExitCode,\n hasOriginRemote,\n isGitRepo,\n successExitCode\n} from \"./state-repo/git-commands.js\"\nimport { isGithubHttpsRemote, resolveGithubToken, withGithubAskpassEnv } from \"./state-repo/github-auth.js\"\nimport { ensureStateGitignore } from \"./state-repo/gitignore.js\"\nimport { runStateSyncOps, runStateSyncWithToken } from \"./state-repo/sync-ops.js\"\n\ntype StateRepoEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nconst resolveStateRoot = (path: Path.Path, cwd: string): string => path.resolve(defaultProjectsRoot(cwd))\n\nconst managedRepositoryCachePaths: ReadonlyArray<string> = [\".cache/git-mirrors\", \".cache/packages\"]\n\nconst ensureStateIgnoreAndUntrackCaches = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n yield* _(ensureStateGitignore(fs, path, root))\n // Best-effort idempotent cleanup: keep cache artifacts out of git history.\n yield* _(git(root, [\"rm\", \"-r\", \"--cached\", \"--ignore-unmatch\", ...managedRepositoryCachePaths], gitBaseEnv))\n }).pipe(Effect.asVoid)\n\nexport const statePath: Effect.Effect<void, PlatformError, Path.Path> = Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const cwd = process.cwd()\n const root = resolveStateRoot(path, cwd)\n yield* _(Effect.log(root))\n}).pipe(Effect.asVoid)\n\nexport const stateSync = (\n message: string | null\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n const repoExit = yield* _(gitExitCode(root, [\"rev-parse\", \"--is-inside-work-tree\"], gitBaseEnv))\n if (repoExit !== successExitCode) {\n yield* _(Effect.logWarning(`State dir is not a git repository: ${root}`))\n yield* _(Effect.logWarning(`Run: docker-git state init --repo-url <url>`))\n return yield* _(\n Effect.fail(new CommandFailedError({ command: \"git rev-parse --is-inside-work-tree\", exitCode: repoExit }))\n )\n }\n\n yield* _(ensureStateIgnoreAndUntrackCaches(fs, path, root))\n\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(Effect.logWarning(`State dir has no origin remote: ${root}`))\n yield* _(Effect.logWarning(`Run: docker-git state init --repo-url <url>`))\n return yield* _(\n Effect.fail(new CommandFailedError({ command: \"git remote get-url origin\", exitCode: originUrlExit }))\n )\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const syncEffect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? runStateSyncWithToken(token, root, originUrl, message)\n : runStateSyncOps(root, originUrl, message, gitBaseEnv)\n\n yield* _(syncEffect)\n }).pipe(Effect.asVoid)\n\nexport const autoSyncState = (message: string): Effect.Effect<void, never, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n const repoOk = yield* _(isGitRepo(root))\n if (!repoOk) {\n return\n }\n\n const originOk = yield* _(hasOriginRemote(root))\n const enabled = isAutoSyncEnabled(process.env[autoSyncEnvKey], originOk)\n if (!enabled) {\n return\n }\n\n const strictValue = process.env[autoSyncStrictEnvKey]\n const strict = strictValue !== undefined && strictValue.trim().length > 0 ? isTruthyEnv(strictValue) : false\n const effect = stateSync(message)\n if (strict) {\n yield* _(effect)\n return\n }\n yield* _(\n effect.pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `State auto-sync failed: ${\n error._tag === \"CommandFailedError\"\n ? `${error.command} (exit ${error.exitCode})`\n : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n )\n }).pipe(\n Effect.matchEffect({\n onFailure: (error) => Effect.logWarning(`State auto-sync failed: ${String(error)}`),\n onSuccess: () => Effect.void\n }),\n Effect.asVoid\n )\n\ntype StateInitInput = {\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nconst cloneStateRepo = (\n root: string,\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const cloneWithBranch = [\"clone\", \"--branch\", input.repoRef, input.repoUrl, root]\n const cloneBranchExit = yield* _(\n runCommandExitCode({ cwd: root, command: \"git\", args: cloneWithBranch, env: gitBaseEnv })\n )\n if (cloneBranchExit === successExitCode) {\n return\n }\n\n // Empty remotes (no branch yet) and remotes without the requested branch can fail here.\n // Fall back to cloning the default branch so we can still set up the repo and create the branch locally.\n yield* _(\n Effect.logWarning(\n `git clone --branch ${input.repoRef} failed (exit ${cloneBranchExit}); retrying without --branch`\n )\n )\n const cloneDefault = [\"clone\", input.repoUrl, root]\n const cloneDefaultExit = yield* _(\n runCommandExitCode({ cwd: root, command: \"git\", args: cloneDefault, env: gitBaseEnv })\n )\n if (cloneDefaultExit !== successExitCode) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"git clone\", exitCode: cloneDefaultExit })))\n }\n }).pipe(Effect.asVoid)\n\nconst initRepoIfNeeded = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string,\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n yield* _(fs.makeDirectory(root, { recursive: true }))\n\n const gitDir = path.join(root, \".git\")\n const hasGit = yield* _(fs.exists(gitDir))\n if (hasGit) {\n return\n }\n\n const entries = yield* _(fs.readDirectory(root))\n if (entries.length === 0) {\n yield* _(cloneStateRepo(root, input))\n yield* _(Effect.log(`State dir cloned: ${root}`))\n return\n }\n\n yield* _(git(root, [\"init\"], gitBaseEnv))\n }).pipe(Effect.asVoid)\n\nconst ensureOriginRemote = (\n root: string,\n repoUrl: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const setUrlExit = yield* _(gitExitCode(root, [\"remote\", \"set-url\", \"origin\", repoUrl], gitBaseEnv))\n if (setUrlExit === successExitCode) {\n return\n }\n yield* _(git(root, [\"remote\", \"add\", \"origin\", repoUrl], gitBaseEnv))\n })\n\nconst checkoutBranchBestEffort = (\n root: string,\n repoRef: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const checkoutExit = yield* _(gitExitCode(root, [\"checkout\", \"-B\", repoRef], gitBaseEnv))\n if (checkoutExit === successExitCode) {\n return\n }\n yield* _(Effect.logWarning(`git checkout -B ${repoRef} failed (exit ${checkoutExit})`))\n })\n\nexport const stateInit = (\n input: StateInitInput\n): Effect.Effect<void, CommandFailedError | PlatformError, StateRepoEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n yield* _(initRepoIfNeeded(fs, path, root, input))\n yield* _(ensureOriginRemote(root, input.repoUrl))\n yield* _(checkoutBranchBestEffort(root, input.repoRef))\n yield* _(ensureStateGitignore(fs, path, root))\n\n yield* _(Effect.log(`State dir ready: ${root}`))\n yield* _(Effect.log(`Remote: ${input.repoUrl}`))\n }).pipe(Effect.asVoid)\n\nexport const stateStatus = Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const output = yield* _(gitCapture(root, [\"status\", \"-sb\", \"--porcelain=v1\"], gitBaseEnv))\n yield* _(Effect.log(output.trim().length > 0 ? output.trimEnd() : \"(clean)\"))\n}).pipe(Effect.asVoid)\n\nexport const statePull = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(git(root, [\"pull\", \"--rebase\"], gitBaseEnv))\n return\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const effect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? withGithubAskpassEnv(token, (env) => git(root, [\"pull\", \"--rebase\"], env))\n : git(root, [\"pull\", \"--rebase\"], gitBaseEnv)\n yield* _(effect)\n}).pipe(Effect.asVoid)\n\nexport const statePush = Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n const originUrlExit = yield* _(gitExitCode(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv))\n if (originUrlExit !== successExitCode) {\n yield* _(git(root, [\"push\", \"-u\", \"origin\", \"HEAD\"], gitBaseEnv))\n return\n }\n const originUrl = yield* _(\n gitCapture(root, [\"remote\", \"get-url\", \"origin\"], gitBaseEnv).pipe(Effect.map((value) => value.trim()))\n )\n const token = yield* _(resolveGithubToken(fs, path, root))\n const effect = token && token.length > 0 && isGithubHttpsRemote(originUrl)\n ? withGithubAskpassEnv(\n token,\n (env) =>\n pipe(\n gitCapture(root, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], env),\n Effect.map((value) => value.trim()),\n Effect.map((branch) => (branch === \"HEAD\" ? \"main\" : branch)),\n Effect.flatMap((branch) => git(root, [\"push\", \"--no-verify\", originUrl, `HEAD:refs/heads/${branch}`], env))\n )\n )\n : git(root, [\"push\", \"--no-verify\", \"-u\", \"origin\", \"HEAD\"], gitBaseEnv)\n yield* _(effect)\n}).pipe(Effect.asVoid)\n\nexport const stateCommit = (\n message: string\n): Effect.Effect<\n void,\n CommandFailedError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const root = resolveStateRoot(path, process.cwd())\n\n yield* _(ensureStateIgnoreAndUntrackCaches(fs, path, root))\n yield* _(git(root, [\"add\", \"-A\"], gitBaseEnv))\n const diffExit = yield* _(gitExitCode(root, [\"diff\", \"--cached\", \"--quiet\"], gitBaseEnv))\n\n if (diffExit === successExitCode) {\n yield* _(Effect.log(\"Nothing to commit.\"))\n return\n }\n\n yield* _(git(root, [\"commit\", \"-m\", message], gitBaseEnv))\n }).pipe(Effect.asVoid)\n","import { Effect } from \"effect\"\n\nconst terminalSaneEscape = \"\\u001B[0m\" + // reset rendition\n \"\\u001B[?25h\" + // show cursor\n \"\\u001B[?1l\" + // normal cursor keys mode\n \"\\u001B>\" + // normal keypad mode\n \"\\u001B[?1000l\" + // disable mouse click tracking\n \"\\u001B[?1002l\" + // disable mouse drag tracking\n \"\\u001B[?1003l\" + // disable any-event mouse tracking\n \"\\u001B[?1005l\" + // disable UTF-8 mouse mode\n \"\\u001B[?1006l\" + // disable SGR mouse mode\n \"\\u001B[?1015l\" + // disable urxvt mouse mode\n \"\\u001B[?1007l\" + // disable alternate scroll mode\n \"\\u001B[?1004l\" + // disable focus reporting\n \"\\u001B[?2004l\" + // disable bracketed paste\n \"\\u001B[>4;0m\" + // disable xterm modifyOtherKeys\n \"\\u001B[>4m\" + // reset xterm modifyOtherKeys\n \"\\u001B[<u\" // disable kitty keyboard protocol\n\nconst hasInteractiveTty = (): boolean => process.stdin.isTTY && process.stdout.isTTY\n\n// CHANGE: ensure the terminal cursor is visible before handing control to interactive SSH\n// WHY: Ink/TTY transitions can leave cursor hidden, which makes SSH shells look frozen\n// QUOTE(ТЗ): \"не виден курсор в SSH терминале\"\n// REF: issue-3\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: interactive(t) -> cursor_visible(t)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, never>\n// INVARIANT: escape sequence is emitted only in interactive tty mode\n// COMPLEXITY: O(1)\nexport const ensureTerminalCursorVisible = (): Effect.Effect<void> =>\n Effect.sync(() => {\n if (!hasInteractiveTty()) {\n return\n }\n if (typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(false)\n }\n process.stdout.write(terminalSaneEscape)\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect } from \"effect\"\n\nimport { defaultTemplateConfig, resolveComposeNetworkName, type TemplateConfig } from \"../core/domain.js\"\nimport {\n runDockerNetworkContainerCount,\n runDockerNetworkCreateBridge,\n runDockerNetworkCreateBridgeWithSubnet,\n runDockerNetworkExists,\n runDockerNetworkRemove\n} from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\n\nconst protectedNetworkNames = new Set([\"bridge\", \"host\", \"none\"])\n\nconst isProtectedNetwork = (networkName: string, sharedNetworkName: string): boolean =>\n protectedNetworkNames.has(networkName) || networkName === sharedNetworkName\n\ntype Subnet24Seed = readonly [number, number, number]\n\nconst sharedNetworkFallbackSubnetSeeds: ReadonlyArray<Subnet24Seed> = [\n [10, 250, 0],\n [10, 251, 0],\n [10, 252, 0],\n [10, 253, 0],\n [172, 31, 250],\n [172, 31, 251],\n [172, 31, 252],\n [172, 31, 253],\n [192, 168, 250],\n [192, 168, 251]\n]\n\nconst formatSubnet24 = ([a, b, c]: Subnet24Seed): string => `${[a, b, c, 0].join(\".\")}/24`\n\nconst sharedNetworkFallbackSubnets: ReadonlyArray<string> = sharedNetworkFallbackSubnetSeeds.map((seed) =>\n formatSubnet24(seed)\n)\n\nconst createSharedNetworkWithSubnetFallback = (\n cwd: string,\n networkName: string\n): Effect.Effect<boolean, PlatformError, CommandExecutor> =>\n Effect.gen(function*(_) {\n for (const subnet of sharedNetworkFallbackSubnets) {\n const created = yield* _(\n runDockerNetworkCreateBridgeWithSubnet(cwd, networkName, subnet).pipe(\n Effect.as(true),\n Effect.catchTag(\"DockerCommandError\", (error) =>\n Effect.logWarning(\n `Shared network create fallback failed (${networkName}, subnet ${subnet}, exit ${error.exitCode}); trying next subnet.`\n ).pipe(Effect.as(false)))\n )\n )\n if (created) {\n yield* _(Effect.log(`Created shared Docker network ${networkName} with subnet ${subnet}.`))\n return true\n }\n }\n return false\n })\n\nconst ensureSharedNetworkExists = (\n cwd: string,\n networkName: string\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor> =>\n runDockerNetworkCreateBridge(cwd, networkName).pipe(\n Effect.catchTag(\"DockerCommandError\", (error) =>\n createSharedNetworkWithSubnetFallback(cwd, networkName).pipe(\n Effect.flatMap((created) => (created ? Effect.void : Effect.fail(error)))\n ))\n )\n\n// CHANGE: ensure shared docker network exists before compose up\n// WHY: avoid compose failures when using `external: true` shared network mode\n// QUOTE(ТЗ): \"Что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-shared\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cfg: mode(cfg)=\"shared\" -> exists(network(cfg))\n// PURITY: SHELL\n// EFFECT: Effect<void, DockerCommandError | PlatformError, CommandExecutor>\n// INVARIANT: no-op for project-scoped network mode\n// COMPLEXITY: O(command)\nexport const ensureComposeNetworkReady = (\n cwd: string,\n template: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor> => {\n if (template.dockerNetworkMode !== \"shared\") {\n return Effect.void\n }\n\n const networkName = resolveComposeNetworkName(template)\n return runDockerNetworkExists(cwd, networkName).pipe(\n Effect.flatMap((exists) =>\n exists\n ? Effect.void\n : Effect.log(`Creating shared Docker network: ${networkName}`).pipe(\n Effect.zipRight(ensureSharedNetworkExists(cwd, networkName))\n )\n )\n )\n}\n\nconst gcNetworkByName = (\n cwd: string,\n networkName: string,\n sharedNetworkName: string\n): Effect.Effect<void, never, CommandExecutor> => {\n if (isProtectedNetwork(networkName, sharedNetworkName)) {\n return Effect.void\n }\n\n return runDockerNetworkContainerCount(cwd, networkName).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Skipping network GC for ${networkName}: ${error instanceof Error ? error.message : String(error)}`\n ),\n onSuccess: (containerCount) => {\n if (containerCount > 0) {\n return Effect.void\n }\n return runDockerNetworkRemove(cwd, networkName).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to remove detached network ${networkName}: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.log(`Removed detached docker-git network: ${networkName}`)\n })\n )\n }\n }),\n Effect.asVoid\n )\n}\n\n// CHANGE: garbage-collect detached project-scoped docker-git networks\n// WHY: prevent stale networks from exhausting Docker address pools\n// QUOTE(ТЗ): \"убирать мусорные сети автоматически\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀n: detached(n) -> eventually_removed(n)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, CommandExecutor>\n// INVARIANT: shared/system networks are never removed\n// COMPLEXITY: O(command)\nexport const gcProjectNetworkByTemplate = (\n cwd: string,\n template: Pick<TemplateConfig, \"serviceName\" | \"dockerNetworkMode\" | \"dockerSharedNetworkName\">\n): Effect.Effect<void, never, CommandExecutor> => {\n if (template.dockerNetworkMode !== \"project\") {\n return Effect.void\n }\n\n return gcNetworkByName(cwd, resolveComposeNetworkName(template), template.dockerSharedNetworkName)\n}\n\n// CHANGE: best-effort cleanup of legacy project-scoped network by service name\n// WHY: delete flow may run after project files are gone, so we fallback to naming convention\n// QUOTE(ТЗ): \"Только так что бы текущие проекты не ложились\"\n// REF: user-request-2026-02-20-network-gc\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: gc(service=s) -> removes_only(detached_network(s))\n// PURITY: SHELL\n// EFFECT: Effect<void, never, CommandExecutor>\n// INVARIANT: never removes bridge/host/none/shared network names\n// COMPLEXITY: O(command)\nexport const gcProjectNetworkByServiceName = (\n cwd: string,\n serviceName: string,\n sharedNetworkName: string = defaultTemplateConfig.dockerSharedNetworkName\n): Effect.Effect<void, never, CommandExecutor> => gcNetworkByName(cwd, `${serviceName}-net`, sharedNetworkName)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\nimport { deriveRepoPathParts } from \"../core/domain.js\"\nimport { runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { runDockerComposeDownVolumes } from \"../shell/docker.js\"\nimport { CommandFailedError, type DockerCommandError } from \"../shell/errors.js\"\nimport { gcProjectNetworkByServiceName } from \"./docker-network-gc.js\"\nimport { renderError } from \"./errors.js\"\nimport { defaultProjectsRoot } from \"./menu-helpers.js\"\nimport type { ProjectItem } from \"./projects-core.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\nconst isWithinProjectsRoot = (path: Path.Path, root: string, target: string): boolean => {\n const relative = path.relative(root, target)\n if (relative.length === 0) {\n return false\n }\n if (relative === \"..\") {\n return false\n }\n if (relative.startsWith(`..${path.sep}`)) {\n return false\n }\n return true\n}\n\nconst removeContainerByName = (\n cwd: string,\n containerName: string\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n {\n cwd,\n command: \"docker\",\n args: [\"rm\", \"-f\", containerName]\n },\n [0],\n (exitCode) => new CommandFailedError({ command: `docker rm -f ${containerName}`, exitCode })\n ).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(`docker rm -f fallback failed for ${containerName}: ${renderError(error)}`),\n onSuccess: () => Effect.log(`Removed container: ${containerName}`)\n }),\n Effect.asVoid\n )\n\nconst removeContainersFallback = (\n item: ProjectItem\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(removeContainerByName(item.projectDir, item.containerName))\n yield* _(removeContainerByName(item.projectDir, `${item.containerName}-browser`))\n })\n\n// CHANGE: delete a docker-git project directory (state) selected in the TUI\n// WHY: allow removing unwanted projects without rewriting git history (just delete the folder)\n// QUOTE(ТЗ): \"Сделай возможность так же удалять мусорный для меня контейнер... Не нужно чистить гит историю. Пусть просто папку с ним удалит\"\n// REF: user-request-2026-02-09-delete-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: delete(p) -> !exists(projectDir(p)) && !container_exists(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError | DockerCommandError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never deletes paths outside the projects root\n// COMPLEXITY: O(docker + fs)\nexport const deleteDockerGitProject = (\n item: ProjectItem\n): Effect.Effect<\n void,\n PlatformError | DockerCommandError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const root = path.resolve(defaultProjectsRoot(process.cwd()))\n const targetDir = path.resolve(item.projectDir)\n\n if (!isWithinProjectsRoot(path, root, targetDir)) {\n yield* _(Effect.logWarning(`Refusing to delete path outside projects root: ${targetDir}`))\n return\n }\n\n const exists = yield* _(fs.exists(targetDir))\n if (!exists) {\n yield* _(Effect.logWarning(`Project directory already missing: ${targetDir}`))\n return\n }\n\n // Best-effort: remove compose containers and volumes before deleting the project folder.\n yield* _(\n runDockerComposeDownVolumes(targetDir).pipe(\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.gen(function*(_) {\n yield* _(Effect.logWarning(`docker compose down -v failed before delete: ${renderError(error)}`))\n yield* _(removeContainersFallback(item))\n }),\n onSuccess: () => Effect.void\n })\n )\n )\n yield* _(gcProjectNetworkByServiceName(targetDir, item.serviceName))\n\n yield* _(fs.remove(targetDir, { recursive: true, force: true }))\n\n const repoParts = deriveRepoPathParts(item.repoUrl).pathParts\n const label = repoParts.length > 0 ? repoParts.join(\"/\") : item.repoUrl\n yield* _(autoSyncState(`chore(state): delete ${label}`))\n }).pipe(Effect.asVoid)\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runDockerComposeDown } from \"../shell/docker.js\"\nimport type { DockerCommandError } from \"../shell/errors.js\"\nimport { gcProjectNetworkByTemplate } from \"./docker-network-gc.js\"\nimport { renderError } from \"./errors.js\"\nimport { forEachProjectStatus, loadProjectIndex, renderProjectStatusHeader } from \"./projects-core.js\"\n\n// CHANGE: provide a \"stop all\" helper for docker-git managed projects\n// WHY: allow quickly stopping all running docker-git containers from the CLI/TUI\n// QUOTE(ТЗ): \"Выведи сюда возможность убивать все контейнеры\"\n// REF: user-request-2026-02-06-stop-all\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p ∈ Projects: downAll(p) → stopped(p) ∨ warned(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: continues stopping other projects when one docker compose down fails with DockerCommandError\n// COMPLEXITY: O(n) where n = |projects|\nexport const downAllDockerGitProjects: Effect.Effect<\n void,\n PlatformError,\n FileSystem | Path | CommandExecutor\n> = pipe(\n loadProjectIndex(),\n Effect.flatMap((index) =>\n index === null\n ? Effect.void\n : forEachProjectStatus(index.configPaths, (status) =>\n pipe(\n Effect.log(renderProjectStatusHeader(status)),\n Effect.zipRight(\n runDockerComposeDown(status.projectDir).pipe(\n Effect.catchTag(\"DockerCommandError\", (error: DockerCommandError) =>\n Effect.logWarning(\n `docker compose down failed for ${status.projectDir}: ${renderError(error)}`\n )),\n Effect.zipRight(gcProjectNetworkByTemplate(status.projectDir, status.config.template))\n )\n )\n ))\n ),\n Effect.asVoid\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport { runDockerPsNames } from \"../shell/docker.js\"\nimport type { CommandFailedError } from \"../shell/errors.js\"\nimport {\n loadProjectItem,\n loadProjectSummary,\n type ProjectItem,\n type ProjectSummary,\n renderProjectSummary,\n skipWithWarning,\n withProjectIndexAndSsh\n} from \"./projects-core.js\"\n\n// CHANGE: list docker-git projects with SSH connection info\n// WHY: provide a deterministic inventory of created environments\n// QUOTE(ТЗ): \"мне нужны мои... доступы к ним по SSH\"\n// REF: user-request-2026-01-27-list\n// SOURCE: n/a\n// FORMAT THEOREM: forall root: list(root) -> summaries(root)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: output is deterministic for a stable filesystem\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjects: Effect.Effect<\n void,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = pipe(\n withProjectIndexAndSsh((index, sshKey) =>\n Effect.gen(function*(_) {\n const available: Array<ProjectSummary> = []\n\n for (const configPath of index.configPaths) {\n const summary = yield* _(\n loadProjectSummary(configPath, sshKey).pipe(\n Effect.matchEffect({\n onFailure: skipWithWarning<ProjectSummary>(configPath),\n onSuccess: (value) => Effect.succeed(value)\n })\n )\n )\n if (summary !== null) {\n available.push(summary)\n }\n }\n if (available.length === 0) {\n yield* _(Effect.log(`No readable docker-git projects found in ${index.projectsRoot}`))\n return\n }\n\n yield* _(Effect.log(`Found ${available.length} docker-git project(s) in ${index.projectsRoot}`))\n for (const summary of available) {\n yield* _(Effect.log(renderProjectSummary(summary)))\n }\n })\n ),\n Effect.asVoid\n)\n\n// CHANGE: collect docker-git connection info lines without logging\n// WHY: allow TUI to render connection info inline\n// QUOTE(ТЗ): \"А кнопка \\\"Show connection info\\\" ничего не отображает\"\n// REF: user-request-2026-02-01-tui-info\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: summary(p) -> line(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<string>, PlatformError, FileSystem | Path>\n// INVARIANT: output order matches configPaths order\n// COMPLEXITY: O(n) where n = |projects|\nconst emptySummaries = (): ReadonlyArray<string> => []\nconst emptyItems = (): ReadonlyArray<ProjectItem> => []\n\nconst collectProjectValues = <A, B, E>(\n configPaths: ReadonlyArray<string>,\n sshKey: string | null,\n load: (configPath: string, sshKey: string | null) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path>,\n toValue: (value: A) => B\n): Effect.Effect<ReadonlyArray<B>, never, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const available: Array<B> = []\n\n for (const configPath of configPaths) {\n const value = yield* _(\n load(configPath, sshKey).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed(null),\n onSuccess: (item) => Effect.succeed(toValue(item))\n })\n )\n )\n if (value !== null) {\n available.push(value)\n }\n }\n\n return available\n })\n\nconst listProjectValues = <A, B, E>(\n load: (configPath: string, sshKey: string | null) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path>,\n toValue: (value: A) => B,\n empty: () => ReadonlyArray<B>\n): Effect.Effect<ReadonlyArray<B>, PlatformError, FileSystem.FileSystem | Path.Path> =>\n pipe(\n withProjectIndexAndSsh((index, sshKey) => collectProjectValues(index.configPaths, sshKey, load, toValue)),\n Effect.map((values) => values ?? empty())\n )\n\nexport const listProjectSummaries: Effect.Effect<\n ReadonlyArray<string>,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = listProjectValues(loadProjectSummary, renderProjectSummary, emptySummaries)\n\n// CHANGE: load docker-git projects for TUI selection\n// WHY: provide structured project data without noisy logs\n// QUOTE(ТЗ): \"А ты можешь сделать удобный выбор проектов?\"\n// REF: user-request-2026-02-02-select-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: item(p) -> selectable(p)\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ProjectItem>, PlatformError, FileSystem | Path>\n// INVARIANT: output order matches configPaths order\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjectItems: Effect.Effect<\n ReadonlyArray<ProjectItem>,\n PlatformError,\n FileSystem.FileSystem | Path.Path\n> = listProjectValues(loadProjectItem, (value) => value, emptyItems)\n\n// CHANGE: list only running docker-git projects (for \"Stop container\" UI)\n// WHY: stopping already-stopped projects is confusing and noisy\n// QUOTE(ТЗ): \"Смысл мне пытаться остановить тот контейнер который уже остановлен?\"\n// REF: user-request-2026-02-07-stop-only-running\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in result: running(container(p))\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ProjectItem>, PlatformError | CommandFailedError, FileSystem | Path | CommandExecutor>\n// INVARIANT: result order follows listProjectItems order\n// COMPLEXITY: O(n + command)\nexport const listRunningProjectItems: Effect.Effect<\n ReadonlyArray<ProjectItem>,\n PlatformError | CommandFailedError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> = pipe(\n Effect.all([listProjectItems, runDockerPsNames(process.cwd())]),\n Effect.map(([items, runningNames]) => items.filter((item) => runningNames.includes(item.containerName)))\n)\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nconst copyDirRecursive = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const sourceInfo = yield* _(fs.stat(sourcePath))\n if (sourceInfo.type !== \"Directory\") {\n return\n }\n yield* _(fs.makeDirectory(targetPath, { recursive: true }))\n const entries = yield* _(fs.readDirectory(sourcePath))\n for (const entry of entries) {\n const sourceEntry = path.join(sourcePath, entry)\n const targetEntry = path.join(targetPath, entry)\n const entryInfo = yield* _(fs.stat(sourceEntry))\n if (entryInfo.type === \"Directory\") {\n yield* _(copyDirRecursive(fs, path, sourceEntry, targetEntry))\n } else if (entryInfo.type === \"File\") {\n yield* _(fs.copyFile(sourceEntry, targetEntry))\n }\n }\n })\n\ntype CodexFileCopySpec = {\n readonly sourceDir: string\n readonly targetDir: string\n readonly fileName: string\n readonly label: string\n}\n\nexport const copyCodexFile = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n spec: CodexFileCopySpec\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const sourceFile = path.join(spec.sourceDir, spec.fileName)\n const targetFile = path.join(spec.targetDir, spec.fileName)\n const sourceExists = yield* _(fs.exists(sourceFile))\n if (!sourceExists) {\n return\n }\n const targetExists = yield* _(fs.exists(targetFile))\n if (targetExists) {\n return\n }\n yield* _(fs.copyFile(sourceFile, targetFile))\n yield* _(Effect.log(`Copied Codex ${spec.label} from ${sourceFile} to ${targetFile}`))\n })\n\nexport const copyDirIfEmpty = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourceDir: string,\n targetDir: string,\n label: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n if (sourceDir === targetDir) {\n return\n }\n const sourceExists = yield* _(fs.exists(sourceDir))\n if (!sourceExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourceDir))\n if (sourceInfo.type !== \"Directory\") {\n return\n }\n yield* _(fs.makeDirectory(targetDir, { recursive: true }))\n const targetEntries = yield* _(fs.readDirectory(targetDir))\n if (targetEntries.length > 0) {\n return\n }\n yield* _(copyDirRecursive(fs, path, sourceDir, targetDir))\n yield* _(Effect.log(`Copied ${label} from ${sourceDir} to ${targetDir}`))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport { Effect, Either } from \"effect\"\n\ntype CopyDecision = \"skip\" | \"copy\"\ntype JsonPrimitive = boolean | number | string | null\ntype JsonValue = JsonPrimitive | JsonRecord | ReadonlyArray<JsonValue>\ntype JsonRecord = Readonly<{ [key: string]: JsonValue }>\n\nconst JsonValueSchema: Schema.Schema<JsonValue> = Schema.suspend(() =>\n Schema.Union(\n Schema.Null,\n Schema.Boolean,\n Schema.String,\n Schema.JsonNumber,\n Schema.Array(JsonValueSchema),\n Schema.Record({ key: Schema.String, value: JsonValueSchema })\n )\n)\n\nconst JsonRecordSchema: Schema.Schema<JsonRecord> = Schema.Record({\n key: Schema.String,\n value: JsonValueSchema\n})\n\nconst JsonRecordFromStringSchema = Schema.parseJson(JsonRecordSchema)\nconst defaultEnvContents = \"# docker-git env\\n# KEY=value\\n\"\nconst codexConfigMarker = \"# docker-git codex config\"\n\n// CHANGE: enable web search tool in default Codex config (top-level)\n// WHY: avoid deprecated legacy flags and keep config minimal\n// QUOTE(ТЗ): \"да убери легаси\"\n// REF: user-request-2026-02-05-remove-legacy-web-search\n// SOURCE: n/a\n// FORMAT THEOREM: ∀c: config(c) -> web_search(c)=\"live\"\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: default config stays deterministic\n// COMPLEXITY: O(1)\nexport const defaultCodexConfig = [\n \"# docker-git codex config\",\n \"model = \\\"gpt-5.3-codex\\\"\",\n \"model_reasoning_effort = \\\"xhigh\\\"\",\n \"personality = \\\"pragmatic\\\"\",\n \"\",\n \"approval_policy = \\\"never\\\"\",\n \"sandbox_mode = \\\"danger-full-access\\\"\",\n \"web_search = \\\"live\\\"\",\n \"\",\n \"[features]\",\n \"shell_snapshot = true\",\n \"multi_agent = true\",\n \"apps = true\",\n \"shell_tool = true\"\n].join(\"\\n\")\n\nexport const resolvePathFromBase = (\n path: {\n readonly isAbsolute: (targetPath: string) => boolean\n readonly resolve: (...parts: ReadonlyArray<string>) => string\n },\n baseDir: string,\n targetPath: string\n): string => path.isAbsolute(targetPath) ? targetPath : path.resolve(baseDir, targetPath)\n\nconst isPermissionDeniedSystemError = (error: PlatformError): boolean =>\n error._tag === \"SystemError\" && error.reason === \"PermissionDenied\"\n\nexport const skipCodexConfigPermissionDenied = (\n configPath: string,\n error: PlatformError\n): Effect.Effect<void, PlatformError> =>\n isPermissionDeniedSystemError(error)\n ? Effect.logWarning(\n `Skipped Codex config sync at ${configPath}: permission denied (${error.description ?? \"no details\"}).`\n )\n : Effect.fail(error)\n\nconst normalizeConfigText = (text: string): string =>\n text\n .replaceAll(\"\\r\\n\", \"\\n\")\n .trim()\n\nexport const shouldRewriteDockerGitCodexConfig = (existing: string): boolean => {\n const normalized = normalizeConfigText(existing)\n if (normalized.length === 0) {\n return true\n }\n if (!normalized.startsWith(codexConfigMarker)) {\n return false\n }\n return normalized !== normalizeConfigText(defaultCodexConfig)\n}\n\nexport const shouldCopyEnv = (sourceText: string, targetText: string): CopyDecision => {\n if (sourceText.trim().length === 0) {\n return \"skip\"\n }\n if (targetText.trim().length === 0) {\n return \"copy\"\n }\n if (targetText.trim() === defaultEnvContents.trim() && sourceText.trim() !== defaultEnvContents.trim()) {\n return \"copy\"\n }\n return \"skip\"\n}\n\nexport const parseJsonRecord = (text: string): Effect.Effect<JsonRecord | null> =>\n Either.match(ParseResult.decodeUnknownEither(JsonRecordFromStringSchema)(text), {\n onLeft: () => Effect.succeed(null),\n onRight: (record) => Effect.succeed(record)\n })\n\nexport const hasClaudeOauthAccount = (record: JsonRecord | null): boolean =>\n record !== null && typeof record[\"oauthAccount\"] === \"object\" && record[\"oauthAccount\"] !== null\n\nexport const hasClaudeCredentials = (record: JsonRecord | null): boolean =>\n record !== null && typeof record[\"claudeAiOauth\"] === \"object\" && record[\"claudeAiOauth\"] !== null\n\nexport const isGithubTokenKey = (key: string): boolean =>\n key === \"GITHUB_TOKEN\" || key === \"GH_TOKEN\" || key.startsWith(\"GITHUB_TOKEN__\")\n\nexport type AuthPaths = {\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n}\n\nexport type AuthSyncSpec = {\n readonly sourceBase: string\n readonly targetBase: string\n readonly source: AuthPaths\n readonly target: AuthPaths\n}\n\nexport type LegacyOrchPaths = AuthPaths & {\n readonly ghAuthPath: string\n readonly claudeAuthPath: string\n}\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport { copyCodexFile, copyDirIfEmpty } from \"./auth-copy.js\"\nimport {\n type AuthSyncSpec,\n defaultCodexConfig,\n hasClaudeCredentials,\n hasClaudeOauthAccount,\n isGithubTokenKey,\n type LegacyOrchPaths,\n parseJsonRecord,\n resolvePathFromBase,\n shouldCopyEnv,\n shouldRewriteDockerGitCodexConfig,\n skipCodexConfigPermissionDenied\n} from \"./auth-sync-helpers.js\"\nimport { parseEnvEntries, removeEnvKey, upsertEnvKey } from \"./env-file.js\"\nimport { withFsPathContext } from \"./runtime.js\"\n\n// CHANGE: synchronize GitHub auth keys between env files\n// WHY: avoid stale per-project tokens that cause clone auth failures after token rotation\n// QUOTE(ТЗ): n/a\n// REF: user-request-2026-02-11-clone-invalid-token\n// SOURCE: n/a\n// FORMAT THEOREM: ∀k ∈ github_token_keys: source(k)=v → merged(k)=v\n// PURITY: CORE\n// INVARIANT: non-auth keys in target are preserved\n// COMPLEXITY: O(n) where n = |env entries|\nexport const syncGithubAuthKeys = (sourceText: string, targetText: string): string => {\n const sourceTokenEntries = parseEnvEntries(sourceText).filter((entry) => isGithubTokenKey(entry.key))\n if (sourceTokenEntries.length === 0) {\n return targetText\n }\n\n const targetTokenKeys = parseEnvEntries(targetText)\n .filter((entry) => isGithubTokenKey(entry.key))\n .map((entry) => entry.key)\n\n let next = targetText\n for (const key of targetTokenKeys) {\n next = removeEnvKey(next, key)\n }\n for (const entry of sourceTokenEntries) {\n next = upsertEnvKey(next, entry.key, entry.value)\n }\n\n return next\n}\n\nconst syncGithubTokenKeysInFile = (\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs }) =>\n Effect.gen(function*(_) {\n const sourceExists = yield* _(fs.exists(sourcePath))\n if (!sourceExists) {\n return\n }\n const targetExists = yield* _(fs.exists(targetPath))\n if (!targetExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourcePath))\n const targetInfo = yield* _(fs.stat(targetPath))\n if (sourceInfo.type !== \"File\" || targetInfo.type !== \"File\") {\n return\n }\n\n const sourceText = yield* _(fs.readFileString(sourcePath))\n const targetText = yield* _(fs.readFileString(targetPath))\n const mergedText = syncGithubAuthKeys(sourceText, targetText)\n if (mergedText !== targetText) {\n yield* _(fs.writeFileString(targetPath, mergedText))\n yield* _(Effect.log(`Synced GitHub auth keys from ${sourcePath} to ${targetPath}`))\n }\n })\n )\n\nconst copyFileIfNeeded = (\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const sourceExists = yield* _(fs.exists(sourcePath))\n if (!sourceExists) {\n return\n }\n const sourceInfo = yield* _(fs.stat(sourcePath))\n if (sourceInfo.type !== \"File\") {\n return\n }\n yield* _(fs.makeDirectory(path.dirname(targetPath), { recursive: true }))\n const targetExists = yield* _(fs.exists(targetPath))\n if (!targetExists) {\n yield* _(fs.copyFile(sourcePath, targetPath))\n yield* _(Effect.log(`Copied env file from ${sourcePath} to ${targetPath}`))\n return\n }\n const sourceText = yield* _(fs.readFileString(sourcePath))\n const targetText = yield* _(fs.readFileString(targetPath))\n if (shouldCopyEnv(sourceText, targetText) === \"copy\") {\n yield* _(fs.writeFileString(targetPath, sourceText))\n yield* _(Effect.log(`Synced env file from ${sourcePath} to ${targetPath}`))\n }\n })\n )\n\ntype ClaudeJsonSyncSpec = {\n readonly sourcePath: string\n readonly targetPath: string\n readonly hasRequiredData: (record: Parameters<typeof hasClaudeOauthAccount>[0]) => boolean\n readonly onWrite: (targetPath: string) => Effect.Effect<void, PlatformError>\n readonly seedLabel: string\n readonly updateLabel: string\n}\n\nconst syncClaudeJsonFile = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n spec: ClaudeJsonSyncSpec\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const sourceExists = yield* _(fs.exists(spec.sourcePath))\n if (!sourceExists) {\n return\n }\n\n const sourceInfo = yield* _(fs.stat(spec.sourcePath))\n if (sourceInfo.type !== \"File\") {\n return\n }\n\n const sourceText = yield* _(fs.readFileString(spec.sourcePath))\n const sourceJson = yield* _(parseJsonRecord(sourceText))\n if (!spec.hasRequiredData(sourceJson)) {\n return\n }\n\n const targetExists = yield* _(fs.exists(spec.targetPath))\n if (!targetExists) {\n yield* _(fs.makeDirectory(path.dirname(spec.targetPath), { recursive: true }))\n yield* _(fs.copyFile(spec.sourcePath, spec.targetPath))\n yield* _(spec.onWrite(spec.targetPath))\n yield* _(Effect.log(`Seeded ${spec.seedLabel} from ${spec.sourcePath} to ${spec.targetPath}`))\n return\n }\n\n const targetInfo = yield* _(fs.stat(spec.targetPath))\n if (targetInfo.type !== \"File\") {\n return\n }\n\n const targetText = yield* _(fs.readFileString(spec.targetPath), Effect.orElseSucceed(() => \"\"))\n const targetJson = yield* _(parseJsonRecord(targetText))\n if (!spec.hasRequiredData(targetJson)) {\n yield* _(fs.writeFileString(spec.targetPath, sourceText))\n yield* _(spec.onWrite(spec.targetPath))\n yield* _(Effect.log(`Updated ${spec.updateLabel} from ${spec.sourcePath} to ${spec.targetPath}`))\n }\n })\n\nconst syncClaudeHomeJson = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError> =>\n syncClaudeJsonFile(fs, path, {\n sourcePath,\n targetPath,\n hasRequiredData: hasClaudeOauthAccount,\n onWrite: () => Effect.void,\n seedLabel: \"Claude auth file\",\n updateLabel: \"Claude auth file\"\n })\n\nconst syncClaudeCredentialsJson = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n sourcePath: string,\n targetPath: string\n): Effect.Effect<void, PlatformError> =>\n syncClaudeJsonFile(fs, path, {\n sourcePath,\n targetPath,\n hasRequiredData: hasClaudeCredentials,\n onWrite: (pathToChmod) => fs.chmod(pathToChmod, 0o600).pipe(Effect.orElseSucceed(() => void 0)),\n seedLabel: \"Claude credentials\",\n updateLabel: \"Claude credentials\"\n })\n\n// CHANGE: seed docker-git Claude auth store from host-level Claude files\n// WHY: Claude Code (v2+) keeps OAuth session in ~/.claude.json and ~/.claude/.credentials.json\n// QUOTE(ТЗ): \"глобальная авторизация для клода ... должна сама везде настроиться\"\n// REF: user-request-2026-03-04-claude-global-auth-seed\n// SOURCE: https://docs.anthropic.com/en/docs/claude-code/settings (section: \\\"Files and settings\\\", mentions ~/.claude.json)\n// FORMAT THEOREM: ∀p: project(p) → (host_claude_auth_exists → project_claude_auth_seeded)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: never deletes existing auth data; only seeds missing/incomplete Claude auth files\n// COMPLEXITY: O(1)\nexport const ensureClaudeAuthSeedFromHome = (\n baseDir: string,\n claudeAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const homeDir = (process.env[\"HOME\"] ?? \"\").trim()\n if (homeDir.length === 0) {\n return\n }\n\n const sourceClaudeJson = path.join(homeDir, \".claude.json\")\n const sourceCredentials = path.join(homeDir, \".claude\", \".credentials.json\")\n\n const claudeRoot = resolvePathFromBase(path, baseDir, claudeAuthPath)\n const targetAccountDir = path.join(claudeRoot, \"default\")\n const targetClaudeJson = path.join(targetAccountDir, \".claude.json\")\n const targetCredentials = path.join(targetAccountDir, \".credentials.json\")\n\n yield* _(fs.makeDirectory(targetAccountDir, { recursive: true }))\n yield* _(syncClaudeHomeJson(fs, path, sourceClaudeJson, targetClaudeJson))\n yield* _(syncClaudeCredentialsJson(fs, path, sourceCredentials, targetCredentials))\n })\n )\n\n// CHANGE: ensure Codex config exists with full-access defaults\n// WHY: enable all codex commands without extra prompts inside containers\n// QUOTE(ТЗ): \"сразу настраивал полностью весь доступ ко всем командам\"\n// REF: user-request-2026-01-30-codex-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: writable(config(p)) -> config(p)=defaults; permission_denied(config(p)) -> warning_logged\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: rewrites only docker-git-managed configs to keep defaults in sync, permission-denied writes are skipped\n// COMPLEXITY: O(n) where n = |config|\nexport const ensureCodexConfigFile = (\n baseDir: string,\n codexAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolvePathFromBase(path, baseDir, codexAuthPath)\n const configPath = path.join(resolved, \"config.toml\")\n const writeConfig = Effect.gen(function*(__) {\n const exists = yield* __(fs.exists(configPath))\n if (exists) {\n const current = yield* __(fs.readFileString(configPath))\n if (!shouldRewriteDockerGitCodexConfig(current)) {\n return\n }\n yield* __(fs.writeFileString(configPath, defaultCodexConfig))\n yield* __(Effect.log(`Updated Codex config at ${configPath}`))\n return\n }\n yield* __(fs.makeDirectory(resolved, { recursive: true }))\n yield* __(fs.writeFileString(configPath, defaultCodexConfig))\n yield* __(Effect.log(`Created Codex config at ${configPath}`))\n })\n yield* _(\n writeConfig.pipe(\n Effect.matchEffect({\n onFailure: (error) => skipCodexConfigPermissionDenied(configPath, error),\n onSuccess: () => Effect.void\n })\n )\n )\n })\n )\n\nexport const syncAuthArtifacts = (\n spec: AuthSyncSpec\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const sourceGlobal = resolvePathFromBase(path, spec.sourceBase, spec.source.envGlobalPath)\n const targetGlobal = resolvePathFromBase(path, spec.targetBase, spec.target.envGlobalPath)\n const sourceProject = resolvePathFromBase(path, spec.sourceBase, spec.source.envProjectPath)\n const targetProject = resolvePathFromBase(path, spec.targetBase, spec.target.envProjectPath)\n const sourceCodex = resolvePathFromBase(path, spec.sourceBase, spec.source.codexAuthPath)\n const targetCodex = resolvePathFromBase(path, spec.targetBase, spec.target.codexAuthPath)\n\n yield* _(copyFileIfNeeded(sourceGlobal, targetGlobal))\n yield* _(syncGithubTokenKeysInFile(sourceGlobal, targetGlobal))\n yield* _(copyFileIfNeeded(sourceProject, targetProject))\n yield* _(fs.makeDirectory(targetCodex, { recursive: true }))\n if (sourceCodex !== targetCodex) {\n const sourceExists = yield* _(fs.exists(sourceCodex))\n if (sourceExists) {\n const sourceInfo = yield* _(fs.stat(sourceCodex))\n if (sourceInfo.type === \"Directory\") {\n const targetExists = yield* _(fs.exists(targetCodex))\n if (!targetExists) {\n yield* _(fs.makeDirectory(targetCodex, { recursive: true }))\n }\n // NOTE: We intentionally do not copy auth.json.\n // ChatGPT refresh tokens are rotating; copying them into each project causes refresh_token_reused.\n yield* _(\n copyCodexFile(fs, path, {\n sourceDir: sourceCodex,\n targetDir: targetCodex,\n fileName: \"config.toml\",\n label: \"config\"\n })\n )\n }\n }\n }\n })\n )\n\nexport const migrateLegacyOrchLayout = (\n baseDir: string,\n paths: LegacyOrchPaths\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const legacyRoot = path.resolve(baseDir, \".orch\")\n const legacyExists = yield* _(fs.exists(legacyRoot))\n if (!legacyExists) {\n return\n }\n const legacyInfo = yield* _(fs.stat(legacyRoot))\n if (legacyInfo.type !== \"Directory\") {\n return\n }\n\n const legacyEnvGlobal = path.join(legacyRoot, \"env\", \"global.env\")\n const legacyEnvProject = path.join(legacyRoot, \"env\", \"project.env\")\n const legacyCodex = path.join(legacyRoot, \"auth\", \"codex\")\n const legacyGh = path.join(legacyRoot, \"auth\", \"gh\")\n const legacyClaude = path.join(legacyRoot, \"auth\", \"claude\")\n\n const resolvedEnvGlobal = resolvePathFromBase(path, baseDir, paths.envGlobalPath)\n const resolvedEnvProject = resolvePathFromBase(path, baseDir, paths.envProjectPath)\n const resolvedCodex = resolvePathFromBase(path, baseDir, paths.codexAuthPath)\n const resolvedGh = resolvePathFromBase(path, baseDir, paths.ghAuthPath)\n const resolvedClaude = resolvePathFromBase(path, baseDir, paths.claudeAuthPath)\n\n yield* _(copyFileIfNeeded(legacyEnvGlobal, resolvedEnvGlobal))\n yield* _(copyFileIfNeeded(legacyEnvProject, resolvedEnvProject))\n yield* _(copyDirIfEmpty(fs, path, legacyCodex, resolvedCodex, \"Codex auth\"))\n yield* _(copyDirIfEmpty(fs, path, legacyGh, resolvedGh, \"GH auth\"))\n yield* _(copyDirIfEmpty(fs, path, legacyClaude, resolvedClaude, \"Claude auth\"))\n })\n )\n","import * as NodeSocketServer from \"@effect/platform-node/NodeSocketServer\"\nimport { Effect } from \"effect\"\n\nimport { PortProbeError } from \"./errors.js\"\n\ntype ErrnoError = Error & { readonly code?: string }\n\nconst normalizeMessage = (error: Error): string => error.message\n\nconst isErrnoError = (error: Error): error is ErrnoError => \"code\" in error\n\n// CHANGE: probe TCP port availability on localhost\n// WHY: avoid docker compose failures due to port collisions\n// QUOTE(ТЗ): \"Bind for 127.0.0.1:2222 failed: port is already allocated\"\n// REF: user-request-2026-01-28-port\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: available(p) -> can_bind(p)\n// PURITY: SHELL\n// EFFECT: Effect<boolean, PortProbeError, never>\n// INVARIANT: returns false when the port is already in use\n// COMPLEXITY: O(1)\nexport const isPortAvailable = (\n port: number,\n host: string = \"127.0.0.1\"\n): Effect.Effect<boolean, PortProbeError> =>\n Effect.scoped(NodeSocketServer.make({ host, port })).pipe(\n Effect.as(true),\n Effect.catchTag(\"SocketServerError\", (error) => {\n const { cause } = error\n if (error.reason === \"Open\" && cause instanceof Error && isErrnoError(cause) && cause.code === \"EADDRINUSE\") {\n return Effect.succeed(false)\n }\n return Effect.fail(new PortProbeError({ port, message: normalizeMessage(error) }))\n })\n )\n\n// CHANGE: select the first available port in a range\n// WHY: auto-recover from occupied SSH ports\n// QUOTE(ТЗ): \"Bind for 127.0.0.1:2222 failed: port is already allocated\"\n// REF: user-request-2026-01-28-port\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: find(p) -> available(find(p))\n// PURITY: SHELL\n// EFFECT: Effect<number, PortProbeError, never>\n// INVARIANT: result is >= preferred when found\n// COMPLEXITY: O(n) where n = |attempts|\nexport const findAvailablePort = (\n preferred: number,\n attempts: number,\n host: string = \"127.0.0.1\"\n): Effect.Effect<number, PortProbeError> =>\n Effect.gen(function*(_) {\n const max = Math.max(1, attempts)\n for (let offset = 0; offset < max; offset += 1) {\n const candidate = preferred + offset\n const available = yield* _(isPortAvailable(candidate, host))\n if (available) {\n return candidate\n }\n }\n\n return yield* _(\n Effect.fail(\n new PortProbeError({\n port: preferred,\n message: `no available port in range ${preferred}-${preferred + max - 1}`\n })\n )\n )\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Either, Option } from \"effect\"\n\nimport { runDockerPsPublishedHostPorts } from \"../shell/docker.js\"\nimport { PortProbeError } from \"../shell/errors.js\"\nimport { isPortAvailable } from \"../shell/ports.js\"\nimport { listProjectItems } from \"./projects-list.js\"\n\nexport type ReservedPort = {\n readonly port: number\n readonly projectDir: string\n}\n\nconst dockerPublishedMarker = \"<docker:published>\"\n\nconst resolveExclude = (\n path: Path.Path,\n excludeDir: string | null\n): string | null => (excludeDir === null ? null : path.resolve(excludeDir))\n\nconst filterReserved = (\n path: Path.Path,\n excludeDir: string | null\n) =>\n(item: { readonly projectDir: string }): boolean => {\n const resolvedExclude = resolveExclude(path, excludeDir)\n if (resolvedExclude === null) {\n return true\n }\n return path.resolve(item.projectDir) !== resolvedExclude\n}\n\nconst reservePort = (\n reserved: Array<ReservedPort>,\n seen: Set<number>,\n port: number,\n projectDir: string\n): void => {\n if (seen.has(port)) {\n return\n }\n seen.add(port)\n reserved.push({ port, projectDir })\n}\n\nconst loadPublishedDockerPorts = (): Effect.Effect<ReadonlySet<number>, never, CommandExecutor.CommandExecutor> =>\n Effect.either(runDockerPsPublishedHostPorts(process.cwd())).pipe(\n Effect.flatMap(\n Either.match({\n onLeft: (error) =>\n Effect.logWarning(\n `Failed to read published Docker ports; falling back to TCP probing only: ${\n error instanceof Error ? error.message : String(error)\n }`\n ).pipe(Effect.as(new Set<number>())),\n onRight: (ports) => Effect.succeed(new Set(ports))\n })\n )\n )\n\n// CHANGE: collect SSH ports currently occupied by existing docker-git projects\n// WHY: avoid port collisions while allowing reuse of ports from stopped projects\n// QUOTE(ТЗ): \"для каждого докера брать должен свой порт\"\n// REF: user-request-2026-02-05-port-reserve\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p∈Projects: reserved(port(p))\n// PURITY: SHELL\n// EFFECT: Effect<ReadonlyArray<ReservedPort>, PlatformError | PortProbeError, FileSystem | Path.Path | CommandExecutor>\n// INVARIANT: excludes the current project dir when provided\n// COMPLEXITY: O(n) where n = number of projects\nexport const loadReservedPorts = (\n excludeDir: string | null\n): Effect.Effect<\n ReadonlyArray<ReservedPort>,\n PlatformError | PortProbeError,\n FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const items = yield* _(listProjectItems)\n const publishedByDocker = yield* _(loadPublishedDockerPorts())\n const reserved: Array<ReservedPort> = []\n const seen = new Set<number>()\n const filter = filterReserved(path, excludeDir)\n\n for (const item of items) {\n if (!filter(item)) {\n continue\n }\n const occupiedByDocker = publishedByDocker.has(item.sshPort)\n const occupiedBySocket = occupiedByDocker ? false : !(yield* _(isPortAvailable(item.sshPort)))\n if (occupiedByDocker || occupiedBySocket) {\n reservePort(reserved, seen, item.sshPort, item.projectDir)\n }\n }\n\n for (const port of publishedByDocker) {\n reservePort(reserved, seen, port, dockerPublishedMarker)\n }\n\n return reserved\n })\n\nconst isReserved = (reserved: ReadonlySet<number>, port: number): boolean => reserved.has(port)\n\nconst buildCandidates = (\n preferred: number,\n attempts: number,\n reserved: ReadonlySet<number>\n): ReadonlyArray<number> => {\n const max = Math.max(1, attempts)\n return Array.from({ length: max }, (_, index) => preferred + index)\n .filter((candidate) => !isReserved(reserved, candidate))\n}\n\n// CHANGE: find the first non-reserved, available port from a preferred range\n// WHY: avoid taking another project's assigned port\n// QUOTE(ТЗ): \"А не бороться за чужой порт\"\n// REF: user-request-2026-02-05-port-reserve\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: selected(p) → available(p) ∧ not_reserved(p)\n// PURITY: SHELL\n// EFFECT: Effect<number, PortProbeError, never>\n// INVARIANT: result is >= preferred when found\n// COMPLEXITY: O(n) where n = attempts\nexport const selectAvailablePort = (\n preferred: number,\n attempts: number,\n reserved: ReadonlySet<number>\n): Effect.Effect<number, PortProbeError> =>\n Effect.gen(function*(_) {\n const candidates = buildCandidates(preferred, attempts, reserved)\n const selected = yield* _(\n Effect.reduce(candidates, Option.none<number>(), (current, candidate) =>\n Option.isSome(current)\n ? Effect.succeed(current)\n : isPortAvailable(candidate).pipe(\n Effect.map((available) => Option.fromNullable(available ? candidate : null))\n ))\n )\n if (Option.isSome(selected)) {\n return selected.value\n }\n return yield* _(\n Effect.fail(\n new PortProbeError({\n port: preferred,\n message: `no available port in range ${preferred}-${preferred + Math.max(1, attempts) - 1}`\n })\n )\n )\n })\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { ProjectConfig, TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport {\n runDockerComposePsFormatted,\n runDockerComposeUp,\n runDockerExecExitCode,\n runDockerInspectContainerBridgeIp,\n runDockerNetworkConnectBridge\n} from \"../shell/docker.js\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { ensureComposeNetworkReady } from \"./docker-network-gc.js\"\nimport { loadReservedPorts, selectAvailablePort } from \"./ports-reserve.js\"\nimport { parseComposePsOutput } from \"./projects-core.js\"\n\nconst maxPortAttempts = 25\n\nconst syncManagedProjectFiles = (\n projectDir: string,\n template: TemplateConfig\n): Effect.Effect<void, FileExistsError | PlatformError, FileSystem | Path> =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Applying docker-git templates in ${projectDir} before docker compose up...`))\n yield* _(writeProjectFiles(projectDir, template, true))\n yield* _(ensureCodexConfigFile(projectDir, template.codexAuthPath))\n })\n\nconst claudeCliSelfHealScript = String.raw`set -eu\nif command -v claude >/dev/null 2>&1; then\n exit 0\nfi\n\nif ! command -v npm >/dev/null 2>&1; then\n exit 1\nfi\n\nNPM_ROOT=\"$(npm root -g 2>/dev/null || true)\"\nCLAUDE_JS=\"$NPM_ROOT/@anthropic-ai/claude-code/cli.js\"\nif [ -z \"$NPM_ROOT\" ] || [ ! -f \"$CLAUDE_JS\" ]; then\n echo \"claude cli.js not found under npm global root\" >&2\n exit 1\nfi\n\ncat <<'EOF' > /usr/local/bin/claude\n#!/usr/bin/env bash\nset -euo pipefail\n\nNPM_ROOT=\"$(npm root -g 2>/dev/null || true)\"\nCLAUDE_JS=\"$NPM_ROOT/@anthropic-ai/claude-code/cli.js\"\nif [[ -z \"$NPM_ROOT\" || ! -f \"$CLAUDE_JS\" ]]; then\n echo \"claude: cli.js not found under npm global root\" >&2\n exit 127\nfi\n\nexec node \"$CLAUDE_JS\" \"$@\"\nEOF\nchmod 0755 /usr/local/bin/claude || true\nln -sf /usr/local/bin/claude /usr/bin/claude || true\n\ncommand -v claude >/dev/null 2>&1`\n\nconst ensureClaudeCliReady = (\n projectDir: string,\n containerName: string\n): Effect.Effect<void, never, CommandExecutor> =>\n pipe(\n runDockerExecExitCode(projectDir, containerName, [\n \"bash\",\n \"-lc\",\n \"command -v claude >/dev/null 2>&1\"\n ]),\n Effect.flatMap((probeExitCode) => {\n if (probeExitCode === 0) {\n return Effect.void\n }\n\n return pipe(\n Effect.logWarning(\n `Claude CLI is missing in ${containerName}; running docker-git self-heal.`\n ),\n Effect.zipRight(\n runDockerExecExitCode(projectDir, containerName, [\n \"bash\",\n \"-lc\",\n claudeCliSelfHealScript\n ])\n ),\n Effect.flatMap((healExitCode) =>\n healExitCode === 0\n ? Effect.log(`Claude CLI self-heal completed in ${containerName}.`)\n : Effect.logWarning(\n `Claude CLI self-heal failed in ${containerName} (exit ${healExitCode}).`\n )),\n Effect.asVoid\n )\n }),\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Skipping Claude CLI self-heal check for ${containerName}: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n\n// CHANGE: update template port when the preferred SSH port is reserved or busy\n// WHY: keep each project on a unique port even across restarts\n// QUOTE(ТЗ): \"Почему контейнер пытается подниматься на существующий порт?\"\n// REF: user-request-2026-02-05-port-conflict\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: reserved(p) ∨ occupied(p) → selected(p') ∧ available(p')\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, PortProbeError | PlatformError | FileExistsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: config is rewritten when port changes\n// COMPLEXITY: O(n) where n = maxPortAttempts\nconst ensureAvailableSshPort = (\n projectDir: string,\n config: ProjectConfig\n): Effect.Effect<\n TemplateConfig,\n PortProbeError | PlatformError | FileExistsError,\n FileSystem | Path | CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const reserved = yield* _(loadReservedPorts(projectDir))\n const reservedPorts = new Set(reserved.map((entry) => entry.port))\n const selected = yield* _(selectAvailablePort(config.template.sshPort, maxPortAttempts, reservedPorts))\n if (selected === config.template.sshPort) {\n return config.template\n }\n const reason = reservedPorts.has(config.template.sshPort)\n ? \"already reserved by another docker-git project\"\n : \"already in use\"\n yield* _(\n Effect.logWarning(\n `SSH port ${config.template.sshPort} is ${reason}; using ${selected} instead.`\n )\n )\n const updatedTemplate: TemplateConfig = { ...config.template, sshPort: selected }\n return updatedTemplate\n })\n\n// CHANGE: start docker compose with a fresh port check for existing projects\n// WHY: keep \"docker compose up\" resilient to later port collisions\n// QUOTE(ТЗ): \"Почему контейнер пытается подниматься на существующий порт?\"\n// REF: user-request-2026-02-05-port-conflict\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: up(p) → available(ssh_port(p))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | PortProbeError | FileExistsError | DockerCommandError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: docker compose runs after port is validated\n// COMPLEXITY: O(n) where n = maxPortAttempts\nexport const runDockerComposeUpWithPortCheck = (\n projectDir: string\n): Effect.Effect<\n TemplateConfig,\n ConfigNotFoundError | ConfigDecodeError | PortProbeError | FileExistsError | DockerCommandError | PlatformError,\n FileSystem | Path | CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const config = yield* _(readProjectConfig(projectDir))\n const alreadyRunning = yield* _(\n runDockerComposePsFormatted(projectDir).pipe(\n Effect.map((raw) => parseComposePsOutput(raw)),\n Effect.map((rows) => rows.length > 0)\n )\n )\n\n // Avoid port churn when the project's compose environment is already running.\n const updated = alreadyRunning\n ? config.template\n : yield* _(ensureAvailableSshPort(projectDir, config))\n // Keep generated templates in sync with the running CLI version.\n yield* _(syncManagedProjectFiles(projectDir, updated))\n yield* _(ensureComposeNetworkReady(projectDir, updated))\n yield* _(runDockerComposeUp(projectDir))\n yield* _(ensureClaudeCliReady(projectDir, updated.containerName))\n\n const ensureBridgeAccess = (containerName: string) =>\n runDockerInspectContainerBridgeIp(projectDir, containerName).pipe(\n Effect.flatMap((bridgeIp) =>\n bridgeIp.length > 0\n ? Effect.void\n : runDockerNetworkConnectBridge(projectDir, containerName)\n ),\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to connect ${containerName} to bridge network: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n\n yield* _(ensureBridgeAccess(updated.containerName))\n if (updated.enableMcpPlaywright) {\n yield* _(ensureBridgeAccess(`${updated.containerName}-browser`))\n }\n\n return updated\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Duration, Effect, pipe, Schedule } from \"effect\"\n\nimport { runCommandExitCode, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { runDockerComposePsFormatted } from \"../shell/docker.js\"\nimport {\n CommandFailedError,\n type ConfigDecodeError,\n type ConfigNotFoundError,\n type DockerCommandError,\n type FileExistsError,\n type PortProbeError\n} from \"../shell/errors.js\"\nimport { renderError } from \"./errors.js\"\nimport {\n buildSshCommand,\n forEachProjectStatus,\n formatComposeRows,\n parseComposePsOutput,\n type ProjectItem,\n renderProjectStatusHeader,\n withProjectIndexAndSsh\n} from \"./projects-core.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\nimport { ensureTerminalCursorVisible } from \"./terminal-cursor.js\"\n\nconst buildSshArgs = (item: ProjectItem): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (item.sshKeyPath !== null) {\n args.push(\"-i\", item.sshKeyPath)\n }\n args.push(\n \"-tt\",\n \"-Y\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(item.sshPort),\n `${item.sshUser}@localhost`\n )\n return args\n}\n\nconst buildSshProbeArgs = (item: ProjectItem): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (item.sshKeyPath !== null) {\n args.push(\"-i\", item.sshKeyPath)\n }\n args.push(\n \"-T\",\n \"-o\",\n \"BatchMode=yes\",\n \"-o\",\n \"ConnectTimeout=2\",\n \"-o\",\n \"ConnectionAttempts=1\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(item.sshPort),\n `${item.sshUser}@localhost`,\n \"true\"\n )\n return args\n}\n\nconst waitForSshReady = (\n item: ProjectItem\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> => {\n const probe = Effect.gen(function*(_) {\n const exitCode = yield* _(\n runCommandExitCode({\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshProbeArgs(item)\n })\n )\n if (exitCode !== 0) {\n return yield* _(Effect.fail(new CommandFailedError({ command: \"ssh wait\", exitCode })))\n }\n })\n\n return pipe(\n Effect.log(`Waiting for SSH on localhost:${item.sshPort} ...`),\n Effect.zipRight(\n Effect.retry(\n probe,\n pipe(\n Schedule.spaced(Duration.seconds(2)),\n Schedule.intersect(Schedule.recurs(30))\n )\n )\n ),\n Effect.tap(() => Effect.log(\"SSH is ready.\"))\n )\n}\n\n// CHANGE: connect to a project via SSH using its resolved settings\n// WHY: allow TUI to open a shell immediately after selection\n// QUOTE(ТЗ): \"выбор проекта сразу подключает по SSH\"\n// REF: user-request-2026-02-02-select-ssh\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: connect(p) -> ssh(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: command is ssh with deterministic args\n// COMPLEXITY: O(1)\nexport const connectProjectSsh = (\n item: ProjectItem\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n ensureTerminalCursorVisible(),\n Effect.zipRight(\n runCommandWithExitCodes(\n {\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshArgs(item)\n },\n [0, 130],\n (exitCode) => new CommandFailedError({ command: \"ssh\", exitCode })\n )\n ),\n Effect.ensuring(ensureTerminalCursorVisible())\n )\n\n// CHANGE: ensure docker compose is up before SSH connection\n// WHY: selected project should auto-start when not running\n// QUOTE(ТЗ): \"Если не поднят то пусть поднимает\"\n// REF: user-request-2026-02-02-select-up\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: up(p) -> ssh(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | DockerCommandError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: docker compose up runs before ssh\n// COMPLEXITY: O(1)\nexport const connectProjectSshWithUp = (\n item: ProjectItem\n): Effect.Effect<\n void,\n | CommandFailedError\n | ConfigNotFoundError\n | ConfigDecodeError\n | FileExistsError\n | PortProbeError\n | DockerCommandError\n | PlatformError,\n CommandExecutor.CommandExecutor | Fs | PathService\n> =>\n pipe(\n Effect.log(`Starting docker compose for ${item.displayName} ...`),\n Effect.zipRight(runDockerComposeUpWithPortCheck(item.projectDir)),\n Effect.map((template) => ({ ...item, sshPort: template.sshPort })),\n Effect.tap((updated) => waitForSshReady(updated)),\n Effect.flatMap((updated) => connectProjectSsh(updated))\n )\n\n// CHANGE: show docker compose status for all known docker-git projects\n// WHY: allow checking active containers without switching directories\n// QUOTE(ТЗ): \"как посмотреть какие активны?\"\n// REF: user-request-2026-01-27-status\n// SOURCE: n/a\n// FORMAT THEOREM: forall p in projects: status(p) -> output(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: each project emits a header before docker compose output\n// COMPLEXITY: O(n) where n = |projects|\nexport const listProjectStatus: Effect.Effect<\n void,\n PlatformError,\n Fs | PathService | CommandExecutor.CommandExecutor\n> = Effect.asVoid(\n withProjectIndexAndSsh((index, sshKey) =>\n forEachProjectStatus(index.configPaths, (status) =>\n pipe(\n Effect.log(renderProjectStatusHeader(status)),\n Effect.zipRight(\n Effect.log(`SSH access: ${buildSshCommand(status.config.template, sshKey)}`)\n ),\n Effect.zipRight(\n runDockerComposePsFormatted(status.projectDir).pipe(\n Effect.map((raw) => parseComposePsOutput(raw)),\n Effect.map((rows) => formatComposeRows(rows)),\n Effect.flatMap((text) => Effect.log(text)),\n Effect.matchEffect({\n onFailure: (error: DockerCommandError | PlatformError) =>\n Effect.logWarning(\n `docker compose ps failed for ${status.projectDir}: ${renderError(error)}`\n ),\n onSuccess: () => Effect.void\n })\n )\n )\n ))\n )\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Duration, Effect, Fiber, Schedule } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport {\n runDockerComposeDownVolumes,\n runDockerComposeLogsFollow,\n runDockerComposeUp,\n runDockerComposeUpRecreate,\n runDockerExecExitCode,\n runDockerInspectContainerBridgeIp,\n runDockerNetworkConnectBridge\n} from \"../../shell/docker.js\"\nimport type { DockerCommandError } from \"../../shell/errors.js\"\nimport { CloneFailedError } from \"../../shell/errors.js\"\nimport { ensureComposeNetworkReady } from \"../docker-network-gc.js\"\nimport { findSshPrivateKey, resolveAuthorizedKeysPath } from \"../path-helpers.js\"\nimport { buildSshCommand } from \"../projects.js\"\n\nconst maxPortAttempts = 25\nconst clonePollInterval = Duration.seconds(1)\nconst cloneDonePath = \"/run/docker-git/clone.done\"\nconst cloneFailPath = \"/run/docker-git/clone.failed\"\n\nconst logSshAccess = (\n baseDir: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const resolvedAuthorizedKeys = resolveAuthorizedKeysPath(path, baseDir, config.authorizedKeysPath)\n const authExists = yield* _(fs.exists(resolvedAuthorizedKeys))\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const sshCommand = buildSshCommand(config, sshKey)\n\n yield* _(Effect.log(`SSH access: ${sshCommand}`))\n if (!authExists) {\n yield* _(\n Effect.logWarning(\n `Authorized keys file missing: ${resolvedAuthorizedKeys} (SSH may fail without a matching key).`\n )\n )\n }\n })\n\ntype CloneState = \"pending\" | \"done\" | \"failed\"\ntype DockerUpError = CloneFailedError | DockerCommandError | PlatformError\ntype DockerUpEnvironment = CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\ntype DockerUpOptions = {\n readonly runUp: boolean\n readonly waitForClone: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nconst checkCloneState = (\n cwd: string,\n containerName: string\n): Effect.Effect<CloneState, PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const failed = yield* _(runDockerExecExitCode(cwd, containerName, [\"test\", \"-f\", cloneFailPath]))\n if (failed === 0) {\n return \"failed\"\n }\n\n const done = yield* _(runDockerExecExitCode(cwd, containerName, [\"test\", \"-f\", cloneDonePath]))\n return done === 0 ? \"done\" : \"pending\"\n })\n\nconst waitForCloneCompletion = (\n cwd: string,\n config: CreateCommand[\"config\"]\n): Effect.Effect<void, CloneFailedError | DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const logsFiber = yield* _(\n runDockerComposeLogsFollow(cwd).pipe(\n Effect.tapError((error) =>\n Effect.logWarning(\n `docker compose logs --follow failed: ${error instanceof Error ? error.message : String(error)}`\n )\n ),\n Effect.fork\n )\n )\n const result = yield* _(\n checkCloneState(cwd, config.containerName).pipe(\n Effect.repeat(\n Schedule.addDelay(\n Schedule.recurUntil<CloneState>((state) => state !== \"pending\"),\n () => clonePollInterval\n )\n )\n )\n )\n yield* _(Fiber.interrupt(logsFiber))\n if (result === \"failed\") {\n return yield* _(\n Effect.fail(\n new CloneFailedError({\n repoUrl: config.repoUrl,\n repoRef: config.repoRef,\n targetDir: config.targetDir\n })\n )\n )\n }\n })\n\nconst runDockerComposeUpByMode = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"],\n force: boolean,\n forceEnv: boolean\n): Effect.Effect<void, DockerCommandError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(ensureComposeNetworkReady(resolvedOutDir, projectConfig))\n\n if (force) {\n yield* _(Effect.log(\"Force enabled: wiping docker compose volumes (docker compose down -v)...\"))\n yield* _(runDockerComposeDownVolumes(resolvedOutDir))\n yield* _(Effect.log(\"Running: docker compose up -d --build\"))\n yield* _(runDockerComposeUp(resolvedOutDir))\n return\n }\n if (forceEnv) {\n yield* _(Effect.log(\"Force env enabled: resetting env defaults and recreating containers (volumes preserved)...\"))\n yield* _(runDockerComposeUpRecreate(resolvedOutDir))\n return\n }\n yield* _(Effect.log(\"Running: docker compose up -d --build\"))\n yield* _(runDockerComposeUp(resolvedOutDir))\n })\n\nconst ensureContainerBridgeAccess = (\n resolvedOutDir: string,\n containerName: string\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n runDockerInspectContainerBridgeIp(resolvedOutDir, containerName).pipe(\n Effect.flatMap((bridgeIp) =>\n bridgeIp.length > 0\n ? Effect.void\n : runDockerNetworkConnectBridge(resolvedOutDir, containerName)\n ),\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.logWarning(\n `Failed to connect ${containerName} to bridge network: ${\n error instanceof Error ? error.message : String(error)\n }`\n ),\n onSuccess: () => Effect.void\n })\n )\n\nconst ensureBridgeAccess = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"]\n): Effect.Effect<void, never, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n // Make container ports reachable from other (non-compose) containers by IP.\n yield* _(ensureContainerBridgeAccess(resolvedOutDir, projectConfig.containerName))\n if (projectConfig.enableMcpPlaywright) {\n yield* _(ensureContainerBridgeAccess(resolvedOutDir, `${projectConfig.containerName}-browser`))\n }\n })\n\nexport const runDockerUpIfNeeded = (\n resolvedOutDir: string,\n projectConfig: CreateCommand[\"config\"],\n options: DockerUpOptions\n): Effect.Effect<void, DockerUpError, DockerUpEnvironment> =>\n Effect.gen(function*(_) {\n if (!options.runUp) {\n return\n }\n yield* _(runDockerComposeUpByMode(resolvedOutDir, projectConfig, options.force, options.forceEnv))\n yield* _(ensureBridgeAccess(resolvedOutDir, projectConfig))\n\n if (options.waitForClone) {\n yield* _(Effect.log(\"Streaming container logs until clone completes...\"))\n yield* _(waitForCloneCompletion(resolvedOutDir, projectConfig))\n }\n yield* _(Effect.log(\"Docker environment is up\"))\n yield* _(logSshAccess(resolvedOutDir, projectConfig))\n })\n\nexport const maxSshPortAttempts = maxPortAttempts\n","import type * as Path from \"@effect/platform/Path\"\nimport type { CreateCommand } from \"../../core/domain.js\"\n\nexport const resolvePathFromBase = (path: Path.Path, baseDir: string, targetPath: string): string =>\n path.isAbsolute(targetPath) ? targetPath : path.resolve(baseDir, targetPath)\n\nconst toPosixPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\")\n\nexport const resolveDockerGitRootRelativePath = (\n path: Path.Path,\n projectsRoot: string,\n inputPath: string\n): string => {\n if (path.isAbsolute(inputPath)) {\n return inputPath\n }\n const normalized = inputPath\n .replaceAll(\"\\\\\", \"/\")\n .replace(/^\\.\\//, \"\")\n if (normalized === \".docker-git\") {\n return projectsRoot\n }\n const prefix = \".docker-git/\"\n if (normalized.startsWith(prefix)) {\n return path.join(projectsRoot, normalized.slice(prefix.length))\n }\n return inputPath\n}\n\ntype ProjectConfigs = {\n readonly globalConfig: CreateCommand[\"config\"]\n readonly projectConfig: CreateCommand[\"config\"]\n}\n\nexport const buildProjectConfigs = (\n path: Path.Path,\n baseDir: string,\n resolvedOutDir: string,\n resolvedConfig: CreateCommand[\"config\"]\n): ProjectConfigs => {\n // docker-compose resolves relative host paths from the project directory (where docker-compose.yml lives).\n // To keep generated projects portable across host OSes, we avoid embedding absolute host paths in templates.\n const relativeFromOutDir = (absolutePath: string): string => toPosixPath(path.relative(resolvedOutDir, absolutePath))\n\n const globalConfig = {\n ...resolvedConfig,\n dockerGitPath: resolvePathFromBase(path, baseDir, resolvedConfig.dockerGitPath),\n authorizedKeysPath: resolvePathFromBase(path, baseDir, resolvedConfig.authorizedKeysPath),\n envGlobalPath: resolvePathFromBase(path, baseDir, resolvedConfig.envGlobalPath),\n envProjectPath: resolvePathFromBase(path, baseDir, resolvedConfig.envProjectPath),\n codexAuthPath: resolvePathFromBase(path, baseDir, resolvedConfig.codexAuthPath),\n codexSharedAuthPath: resolvePathFromBase(path, baseDir, resolvedConfig.codexSharedAuthPath)\n }\n const projectConfig = {\n ...resolvedConfig,\n dockerGitPath: relativeFromOutDir(globalConfig.dockerGitPath),\n authorizedKeysPath: relativeFromOutDir(globalConfig.authorizedKeysPath),\n envGlobalPath: \"./.orch/env/global.env\",\n envProjectPath: path.isAbsolute(resolvedConfig.envProjectPath)\n ? relativeFromOutDir(resolvedConfig.envProjectPath)\n : toPosixPath(resolvedConfig.envProjectPath),\n // Project-local Codex state (sessions/logs/etc) is kept under .orch.\n codexAuthPath: \"./.orch/auth/codex\",\n // Shared credentials root is mounted separately; entrypoint links auth.json into CODEX_HOME.\n codexSharedAuthPath: relativeFromOutDir(globalConfig.codexSharedAuthPath)\n }\n return { globalConfig, projectConfig }\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport type { PortProbeError } from \"../../shell/errors.js\"\nimport { loadReservedPorts, selectAvailablePort } from \"../ports-reserve.js\"\n\nconst maxPortAttempts = 25\n\nexport const resolveSshPort = (\n config: CreateCommand[\"config\"],\n outDir: string\n): Effect.Effect<\n CreateCommand[\"config\"],\n PortProbeError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n Effect.gen(function*(_) {\n const reserved = yield* _(loadReservedPorts(outDir))\n const reservedPorts = new Set(reserved.map((entry) => entry.port))\n const selected = yield* _(selectAvailablePort(config.sshPort, maxPortAttempts, reservedPorts))\n if (selected !== config.sshPort) {\n const reason = reservedPorts.has(config.sshPort)\n ? \"already reserved by another docker-git project\"\n : \"already in use\"\n yield* _(\n Effect.logWarning(\n `SSH port ${config.sshPort} is ${reason}; using ${selected} instead.`\n )\n )\n }\n return selected === config.sshPort ? config : { ...config, sshPort: selected }\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport type { FileExistsError } from \"../../shell/errors.js\"\nimport { writeProjectFiles } from \"../../shell/files.js\"\nimport {\n ensureClaudeAuthSeedFromHome,\n ensureCodexConfigFile,\n migrateLegacyOrchLayout,\n syncAuthArtifacts\n} from \"../auth-sync.js\"\nimport { findAuthorizedKeysSource, resolveAuthorizedKeysPath } from \"../path-helpers.js\"\nimport { withFsPathContext } from \"../runtime.js\"\nimport { resolvePathFromBase } from \"./paths.js\"\n\ntype ExistingFileState = \"exists\" | \"missing\"\n\nconst ensureFileReady = (\n fs: FileSystem.FileSystem,\n resolved: string,\n onDirectoryMessage: (resolvedPath: string, backupPath: string) => string\n): Effect.Effect<ExistingFileState, PlatformError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(resolved))\n if (!exists) {\n return \"missing\"\n }\n\n const info = yield* _(fs.stat(resolved))\n if (info.type === \"Directory\") {\n const backupPath = `${resolved}.bak-${Date.now()}`\n yield* _(fs.rename(resolved, backupPath))\n yield* _(Effect.logWarning(onDirectoryMessage(resolved, backupPath)))\n return \"missing\"\n }\n\n return \"exists\"\n })\n\nconst ensureAuthorizedKeys = (\n baseDir: string,\n authorizedKeysPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolveAuthorizedKeysPath(path, baseDir, authorizedKeysPath)\n const state = yield* _(\n ensureFileReady(\n fs,\n resolved,\n (resolvedPath, backupPath) =>\n `Authorized keys was a directory, moved to ${backupPath}. Creating a file at ${resolvedPath}.`\n )\n )\n if (state === \"exists\") {\n return\n }\n\n const source = yield* _(findAuthorizedKeysSource(fs, path, process.cwd()))\n if (source === null) {\n yield* _(\n Effect.logError(\n `Authorized keys not found. Create ${resolved} with your public key to enable SSH.`\n )\n )\n return\n }\n\n yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))\n yield* _(fs.copyFile(source, resolved))\n yield* _(Effect.log(`Authorized keys copied from ${source} to ${resolved}`))\n })\n )\n\nconst defaultGlobalEnvContents = \"# docker-git env\\n# KEY=value\\n\"\n\nconst defaultProjectEnvContents = [\n \"# docker-git project env defaults\",\n \"CODEX_SHARE_AUTH=1\",\n \"CODEX_AUTO_UPDATE=1\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST=1\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=fg=8,italic\",\n \"DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=history completion\",\n \"MCP_PLAYWRIGHT_ISOLATED=1\",\n \"\"\n].join(\"\\n\")\n\nconst ensureEnvFile = (\n baseDir: string,\n envPath: string,\n defaultContents: string,\n overwrite: boolean = false\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n withFsPathContext(({ fs, path }) =>\n Effect.gen(function*(_) {\n const resolved = resolvePathFromBase(path, baseDir, envPath)\n const state = yield* _(\n ensureFileReady(\n fs,\n resolved,\n (_resolvedPath, backupPath) => `Env file was a directory, moved to ${backupPath}.`\n )\n )\n if (state === \"exists\" && !overwrite) {\n return\n }\n\n yield* _(fs.makeDirectory(path.dirname(resolved), { recursive: true }))\n yield* _(fs.writeFileString(resolved, defaultContents))\n })\n )\n\nexport type PrepareProjectFilesError = FileExistsError | PlatformError\ntype PrepareProjectFilesOptions = {\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nexport const prepareProjectFiles = (\n resolvedOutDir: string,\n baseDir: string,\n globalConfig: CreateCommand[\"config\"],\n projectConfig: CreateCommand[\"config\"],\n options: PrepareProjectFilesOptions\n): Effect.Effect<ReadonlyArray<string>, PrepareProjectFilesError, FileSystem.FileSystem | Path.Path> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const rewriteManagedFiles = options.force || options.forceEnv\n const envOnlyRefresh = options.forceEnv && !options.force\n const createdFiles = yield* _(\n writeProjectFiles(resolvedOutDir, projectConfig, rewriteManagedFiles)\n )\n yield* _(ensureAuthorizedKeys(resolvedOutDir, projectConfig.authorizedKeysPath))\n yield* _(ensureEnvFile(resolvedOutDir, projectConfig.envGlobalPath, defaultGlobalEnvContents))\n yield* _(\n ensureEnvFile(\n resolvedOutDir,\n projectConfig.envProjectPath,\n defaultProjectEnvContents,\n envOnlyRefresh\n )\n )\n yield* _(ensureCodexConfigFile(baseDir, globalConfig.codexAuthPath))\n const globalClaudeAuthPath = path.join(path.dirname(globalConfig.codexAuthPath), \"claude\")\n yield* _(ensureClaudeAuthSeedFromHome(baseDir, globalClaudeAuthPath))\n yield* _(\n syncAuthArtifacts({\n sourceBase: baseDir,\n targetBase: resolvedOutDir,\n source: {\n envGlobalPath: globalConfig.envGlobalPath,\n envProjectPath: globalConfig.envProjectPath,\n codexAuthPath: globalConfig.codexAuthPath\n },\n target: {\n envGlobalPath: projectConfig.envGlobalPath,\n envProjectPath: projectConfig.envProjectPath,\n codexAuthPath: projectConfig.codexAuthPath\n }\n })\n )\n // Ensure per-project config stays in sync even when `.orch/auth/codex` already exists.\n yield* _(ensureCodexConfigFile(resolvedOutDir, projectConfig.codexAuthPath))\n return createdFiles\n })\n\nexport const migrateProjectOrchLayout = (\n baseDir: string,\n globalConfig: CreateCommand[\"config\"],\n resolveRootPath: (value: string) => string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(baseDir, {\n envGlobalPath: globalConfig.envGlobalPath,\n envProjectPath: globalConfig.envProjectPath,\n codexAuthPath: globalConfig.codexAuthPath,\n ghAuthPath: resolveRootPath(\".docker-git/.orch/auth/gh\"),\n claudeAuthPath: resolveRootPath(\".docker-git/.orch/auth/claude\")\n })\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { CreateCommand } from \"../../core/domain.js\"\nimport { deriveRepoPathParts } from \"../../core/domain.js\"\nimport { runCommandWithExitCodes } from \"../../shell/command-runner.js\"\nimport { ensureDockerDaemonAccess } from \"../../shell/docker.js\"\nimport { CommandFailedError } from \"../../shell/errors.js\"\nimport type {\n CloneFailedError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../../shell/errors.js\"\nimport { logDockerAccessInfo } from \"../access-log.js\"\nimport { renderError } from \"../errors.js\"\nimport { applyGithubForkConfig } from \"../github-fork.js\"\nimport { defaultProjectsRoot } from \"../menu-helpers.js\"\nimport { findSshPrivateKey } from \"../path-helpers.js\"\nimport { buildSshCommand } from \"../projects-core.js\"\nimport { autoSyncState } from \"../state-repo.js\"\nimport { ensureTerminalCursorVisible } from \"../terminal-cursor.js\"\nimport { runDockerUpIfNeeded } from \"./docker-up.js\"\nimport { buildProjectConfigs, resolveDockerGitRootRelativePath } from \"./paths.js\"\nimport { resolveSshPort } from \"./ports.js\"\nimport { migrateProjectOrchLayout, prepareProjectFiles } from \"./prepare-files.js\"\n\ntype CreateProjectRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype CreateProjectError =\n | FileExistsError\n | CloneFailedError\n | DockerAccessError\n | DockerCommandError\n | PortProbeError\n | PlatformError\n\ntype CreateContext = {\n readonly baseDir: string\n readonly resolveRootPath: (value: string) => string\n}\n\nconst makeCreateContext = (path: Path.Path, baseDir: string): CreateContext => {\n const projectsRoot = path.resolve(defaultProjectsRoot(baseDir))\n const resolveRootPath = (value: string): string => resolveDockerGitRootRelativePath(path, projectsRoot, value)\n return { baseDir, resolveRootPath }\n}\n\nconst resolveRootedConfig = (command: CreateCommand, ctx: CreateContext): CreateCommand[\"config\"] => ({\n ...command.config,\n dockerGitPath: ctx.resolveRootPath(command.config.dockerGitPath),\n authorizedKeysPath: ctx.resolveRootPath(command.config.authorizedKeysPath),\n envGlobalPath: ctx.resolveRootPath(command.config.envGlobalPath),\n envProjectPath: ctx.resolveRootPath(command.config.envProjectPath),\n codexAuthPath: ctx.resolveRootPath(command.config.codexAuthPath),\n codexSharedAuthPath: ctx.resolveRootPath(command.config.codexSharedAuthPath)\n})\n\nconst resolveCreateConfig = (\n command: CreateCommand,\n ctx: CreateContext,\n resolvedOutDir: string\n): Effect.Effect<\n CreateCommand[\"config\"],\n PortProbeError | PlatformError,\n FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n> =>\n resolveSshPort(resolveRootedConfig(command, ctx), resolvedOutDir).pipe(\n Effect.flatMap((config) => applyGithubForkConfig(config))\n )\n\nconst logCreatedProject = (resolvedOutDir: string, createdFiles: ReadonlyArray<string>) =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Created docker-git project in ${resolvedOutDir}`))\n for (const file of createdFiles) {\n yield* _(Effect.log(` - ${file}`))\n }\n }).pipe(Effect.asVoid)\n\nconst formatStateSyncLabel = (repoUrl: string): string => {\n const repoPath = deriveRepoPathParts(repoUrl).pathParts.join(\"/\")\n return repoPath.length > 0 ? repoPath : repoUrl\n}\n\nconst isInteractiveTty = (): boolean => process.stdin.isTTY && process.stdout.isTTY\n\nconst buildSshArgs = (\n config: CreateCommand[\"config\"],\n sshKeyPath: string | null\n): ReadonlyArray<string> => {\n const args: Array<string> = []\n if (sshKeyPath !== null) {\n args.push(\"-i\", sshKeyPath)\n }\n args.push(\n \"-tt\",\n \"-Y\",\n \"-o\",\n \"LogLevel=ERROR\",\n \"-o\",\n \"StrictHostKeyChecking=no\",\n \"-o\",\n \"UserKnownHostsFile=/dev/null\",\n \"-p\",\n String(config.sshPort),\n `${config.sshUser}@localhost`\n )\n return args\n}\n\n// CHANGE: auto-open SSH after environment is created (best-effort)\n// WHY: clone flow should drop the user into the container without manual copy/paste\n// QUOTE(ТЗ): \"Мне надо что бы он сразу открыл SSH\"\n// REF: issue-39\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: openSsh(c) -> ssh_session_started(c) || warning_logged(c)\n// PURITY: SHELL\n// EFFECT: Effect<void, never, FileSystem | Path | CommandExecutor>\n// INVARIANT: SSH failures do not fail the create/clone command\n// COMPLEXITY: O(1) + ssh\nconst openSshBestEffort = (\n template: CreateCommand[\"config\"]\n): Effect.Effect<void, never, CreateProjectRuntime> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const sshCommand = buildSshCommand(template, sshKey)\n\n yield* _(Effect.log(`Opening SSH: ${sshCommand}`))\n yield* _(ensureTerminalCursorVisible())\n yield* _(\n runCommandWithExitCodes(\n {\n cwd: process.cwd(),\n command: \"ssh\",\n args: buildSshArgs(template, sshKey)\n },\n [0, 130],\n (exitCode) => new CommandFailedError({ command: \"ssh\", exitCode })\n ).pipe(Effect.ensuring(ensureTerminalCursorVisible()))\n )\n }).pipe(\n Effect.asVoid,\n Effect.matchEffect({\n onFailure: (error) => Effect.logWarning(`SSH auto-open failed: ${renderError(error)}`),\n onSuccess: () => Effect.void\n })\n )\n\nconst runCreateProject = (\n path: Path.Path,\n command: CreateCommand\n): Effect.Effect<void, CreateProjectError, CreateProjectRuntime> =>\n Effect.gen(function*(_) {\n if (command.runUp) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n }\n\n const ctx = makeCreateContext(path, process.cwd())\n const resolvedOutDir = path.resolve(ctx.resolveRootPath(command.outDir))\n\n const resolvedConfig = yield* _(resolveCreateConfig(command, ctx, resolvedOutDir))\n const { globalConfig, projectConfig } = buildProjectConfigs(path, ctx.baseDir, resolvedOutDir, resolvedConfig)\n\n yield* _(migrateProjectOrchLayout(ctx.baseDir, globalConfig, ctx.resolveRootPath))\n\n const createdFiles = yield* _(\n prepareProjectFiles(resolvedOutDir, ctx.baseDir, globalConfig, projectConfig, {\n force: command.force,\n forceEnv: command.forceEnv\n })\n )\n yield* _(logCreatedProject(resolvedOutDir, createdFiles))\n\n yield* _(\n runDockerUpIfNeeded(resolvedOutDir, projectConfig, {\n runUp: command.runUp,\n waitForClone: command.waitForClone,\n force: command.force,\n forceEnv: command.forceEnv\n })\n )\n if (command.runUp) {\n yield* _(logDockerAccessInfo(resolvedOutDir, projectConfig))\n }\n\n yield* _(autoSyncState(`chore(state): update ${formatStateSyncLabel(projectConfig.repoUrl)}`))\n\n if (command.openSsh) {\n if (!command.runUp) {\n yield* _(Effect.logWarning(\"Skipping SSH auto-open: docker compose up disabled (--no-up).\"))\n } else if (isInteractiveTty()) {\n yield* _(openSshBestEffort(projectConfig))\n } else {\n yield* _(Effect.logWarning(\"Skipping SSH auto-open: not running in an interactive TTY.\"))\n }\n }\n }).pipe(Effect.asVoid)\n\nexport const createProject = (command: CreateCommand): Effect.Effect<void, CreateProjectError, CreateProjectRuntime> =>\n Path.Path.pipe(Effect.flatMap((path) => runCreateProject(path, command)))\n","import { trimLeftChar, trimRightChar } from \"./strings.js\"\n\nconst trimEdgeUnderscores = (value: string): string => {\n let start = 0\n while (start < value.length && value[start] === \"_\") {\n start += 1\n }\n\n let end = value.length\n while (end > start && value[end - 1] === \"_\") {\n end -= 1\n }\n return value.slice(start, end)\n}\n\nconst trimEdgeHyphens = (value: string): string => {\n const withoutLeading = trimLeftChar(value, \"-\")\n return trimRightChar(withoutLeading, \"-\")\n}\n\nexport const normalizeGitTokenLabel = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return undefined\n }\n\n const normalized = trimmed\n .toUpperCase()\n .replaceAll(/[^A-Z0-9]+/g, \"_\")\n const cleaned = trimEdgeUnderscores(normalized)\n if (cleaned.length === 0 || cleaned === \"DEFAULT\") {\n return undefined\n }\n return cleaned\n}\n\nexport const normalizeAuthLabel = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return undefined\n }\n\n const normalized = trimmed\n .toLowerCase()\n .replaceAll(/[^a-z0-9]+/g, \"-\")\n const cleaned = trimEdgeHyphens(normalized)\n if (cleaned.length === 0 || cleaned === \"default\") {\n return undefined\n }\n return cleaned\n}\n","import type { ApplyCommand, TemplateConfig } from \"../core/domain.js\"\nimport { normalizeAuthLabel, normalizeGitTokenLabel } from \"../core/token-labels.js\"\n\nexport const hasApplyOverrides = (command: ApplyCommand): boolean =>\n command.gitTokenLabel !== undefined ||\n command.codexTokenLabel !== undefined ||\n command.claudeTokenLabel !== undefined ||\n command.enableMcpPlaywright !== undefined\n\nexport const applyTemplateOverrides = (\n template: TemplateConfig,\n command: ApplyCommand | undefined\n): TemplateConfig => {\n if (command === undefined) {\n return template\n }\n\n let nextTemplate = template\n\n if (command.gitTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n gitTokenLabel: normalizeGitTokenLabel(command.gitTokenLabel)\n }\n }\n if (command.codexTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n codexAuthLabel: normalizeAuthLabel(command.codexTokenLabel)\n }\n }\n if (command.claudeTokenLabel !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n claudeAuthLabel: normalizeAuthLabel(command.claudeTokenLabel)\n }\n }\n if (command.enableMcpPlaywright !== undefined) {\n nextTemplate = {\n ...nextTemplate,\n enableMcpPlaywright: command.enableMcpPlaywright\n }\n }\n\n return nextTemplate\n}\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport { type ApplyCommand, deriveRepoPathParts, type TemplateConfig } from \"../core/domain.js\"\nimport { parseGithubRepoUrl } from \"../core/repo.js\"\nimport { runCommandCapture, runCommandExitCode } from \"../shell/command-runner.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport type * as ShellErrors from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { applyTemplateOverrides, hasApplyOverrides } from \"./apply-overrides.js\"\nimport { ensureClaudeAuthSeedFromHome, ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { findDockerGitConfigPaths } from \"./docker-git-config-search.js\"\nimport { defaultProjectsRoot, findExistingUpwards } from \"./path-helpers.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\n\ntype ApplyProjectFilesError =\n | ShellErrors.ConfigNotFoundError\n | ShellErrors.ConfigDecodeError\n | ShellErrors.FileExistsError\n | PlatformError\ntype ApplyProjectFilesEnv = FileSystem | Path\n\n// CHANGE: apply existing docker-git.json to managed files in an already created project\n// WHY: allow updating current project/container config without creating a new project directory\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: apply_files(p) -> files(p) = plan(read_config(p))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: rewrites only managed files from docker-git.json\n// COMPLEXITY: O(n) where n = |managed_files|\nexport const applyProjectFiles = (\n projectDir: string,\n command?: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectFilesError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Applying docker-git config files in ${projectDir}...`))\n const config = yield* _(readProjectConfig(projectDir))\n const resolvedTemplate = applyTemplateOverrides(config.template, command)\n yield* _(writeProjectFiles(projectDir, resolvedTemplate, true))\n yield* _(ensureCodexConfigFile(projectDir, resolvedTemplate.codexAuthPath))\n yield* _(ensureClaudeAuthSeedFromHome(defaultProjectsRoot(projectDir), \".orch/auth/claude\"))\n return resolvedTemplate\n })\n\nexport type ApplyProjectConfigError =\n | ApplyProjectFilesError\n | ShellErrors.DockerAccessError\n | ShellErrors.DockerCommandError\n | ShellErrors.PortProbeError\n\ntype ApplyProjectConfigEnv = ApplyProjectFilesEnv | CommandExecutor\n\ntype RepoIdentity = {\n readonly fullPath: string\n readonly repo: string\n}\n\ntype ProjectCandidate = {\n readonly projectDir: string\n readonly repoUrl: string\n readonly repoRef: string\n}\n\nconst gitSuccessExitCode = 0\nconst gitBranchDetached = \"HEAD\"\nconst maxLocalConfigSearchDepth = 6\nconst gitBaseEnv: Readonly<Record<string, string>> = {\n GIT_TERMINAL_PROMPT: \"0\"\n}\n\nconst emptyConfigPaths = (): ReadonlyArray<string> => []\nconst nullProjectCandidate = (): ProjectCandidate | null => null\nconst nullString = (): string | null => null\n\nconst normalizeRepoIdentity = (repoUrl: string): RepoIdentity => {\n const github = parseGithubRepoUrl(repoUrl)\n if (github !== null) {\n const owner = github.owner.trim().toLowerCase()\n const repo = github.repo.trim().toLowerCase()\n return { fullPath: `${owner}/${repo}`, repo }\n }\n\n const parts = deriveRepoPathParts(repoUrl)\n const normalizedParts = parts.pathParts.map((part) => part.toLowerCase())\n const repo = parts.repo.toLowerCase()\n return {\n fullPath: normalizedParts.join(\"/\"),\n repo\n }\n}\n\nconst toProjectDirBaseName = (projectDir: string): string => {\n const normalized = projectDir.replaceAll(\"\\\\\", \"/\")\n const parts = normalized.split(\"/\").filter((part) => part.length > 0)\n return parts.at(-1)?.toLowerCase() ?? \"\"\n}\n\nconst parsePrRefFromBranch = (branch: string): string | null => {\n const prefix = \"pr-\"\n if (!branch.toLowerCase().startsWith(prefix)) {\n return null\n }\n const id = branch.slice(prefix.length).trim()\n return id.length > 0 ? `refs/pull/${id}/head` : null\n}\n\nconst scoreBranchMatch = (\n branch: string | null,\n candidate: ProjectCandidate\n): number => {\n if (branch === null) {\n return 0\n }\n\n const branchLower = branch.toLowerCase()\n const candidateRef = candidate.repoRef.toLowerCase()\n const prRef = parsePrRefFromBranch(branchLower)\n const branchRefScore = candidateRef === branchLower ? 8 : 0\n const prRefScore = prRef !== null && candidateRef === prRef.toLowerCase() ? 8 : 0\n const dirNameScore = toProjectDirBaseName(candidate.projectDir) === branchLower ? 5 : 0\n return branchRefScore + prRefScore + dirNameScore\n}\n\nconst scoreCandidate = (\n remoteIdentities: ReadonlyArray<RepoIdentity>,\n branch: string | null,\n candidate: ProjectCandidate\n): number => {\n const candidateIdentity = normalizeRepoIdentity(candidate.repoUrl)\n const hasFullPathMatch = remoteIdentities.some((remote) => remote.fullPath === candidateIdentity.fullPath)\n const hasRepoMatch = remoteIdentities.some((remote) => remote.repo === candidateIdentity.repo)\n if (!hasFullPathMatch && !hasRepoMatch) {\n return 0\n }\n\n const repoScore = hasFullPathMatch ? 100 : 10\n return repoScore + scoreBranchMatch(branch, candidate)\n}\n\nconst selectCandidateProjectDir = (\n remoteIdentities: ReadonlyArray<RepoIdentity>,\n branch: string | null,\n candidates: ReadonlyArray<ProjectCandidate>\n): string | null => {\n const scored = candidates\n .map((candidate) => ({ candidate, score: scoreCandidate(remoteIdentities, branch, candidate) }))\n .filter((entry) => entry.score > 0)\n\n if (scored.length === 0) {\n return null\n }\n\n const topScore = Math.max(...scored.map((entry) => entry.score))\n const topCandidates = scored.filter((entry) => entry.score === topScore)\n if (topCandidates.length !== 1) {\n return null\n }\n\n return topCandidates[0]?.candidate.projectDir ?? null\n}\n\nconst tryGitCapture = (\n cwd: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string | null, never, CommandExecutor> => {\n const spec = { cwd, command: \"git\", args, env: gitBaseEnv }\n\n return runCommandExitCode(spec).pipe(\n Effect.matchEffect({\n onFailure: () => Effect.succeed<string | null>(null),\n onSuccess: (exitCode) =>\n exitCode === gitSuccessExitCode\n ? runCommandCapture(spec, [gitSuccessExitCode], (code) => ({ _tag: \"ApplyGitCaptureError\", code })).pipe(\n Effect.map((value) => value.trim()),\n Effect.match({\n onFailure: nullString,\n onSuccess: (value) => value\n })\n )\n : Effect.succeed<string | null>(null)\n })\n )\n}\n\nconst listProjectCandidates = (\n projectsRoot: string\n): Effect.Effect<ReadonlyArray<ProjectCandidate>, PlatformError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(projectsRoot))\n const configPaths = yield* _(\n findDockerGitConfigPaths(fs, path, resolved).pipe(\n Effect.match({\n onFailure: emptyConfigPaths,\n onSuccess: (value) => value\n })\n )\n )\n\n const candidates: Array<ProjectCandidate> = []\n for (const configPath of configPaths) {\n const projectDir = path.dirname(configPath)\n const candidate = yield* _(\n readProjectConfig(projectDir).pipe(\n Effect.match({\n onFailure: nullProjectCandidate,\n onSuccess: (config) => ({\n projectDir,\n repoUrl: config.template.repoUrl,\n repoRef: config.template.repoRef\n })\n })\n )\n )\n if (candidate !== null) {\n candidates.push(candidate)\n }\n }\n\n return candidates\n })\n\nconst collectRemoteIdentities = (\n repoRoot: string\n): Effect.Effect<ReadonlyArray<RepoIdentity>, never, CommandExecutor> =>\n Effect.gen(function*(_) {\n const listedRemotes = yield* _(tryGitCapture(repoRoot, [\"remote\"]))\n const dynamicNames = listedRemotes === null\n ? []\n : listedRemotes\n .split(/\\r?\\n/)\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n const remoteNames = [...new Set([...dynamicNames, \"origin\", \"upstream\"])]\n const urls: Array<string> = []\n\n for (const remoteName of remoteNames) {\n const url = yield* _(tryGitCapture(repoRoot, [\"remote\", \"get-url\", remoteName]))\n if (url !== null && url.length > 0) {\n urls.push(url)\n }\n }\n\n const identityMap = new Map<string, RepoIdentity>()\n for (const url of urls) {\n const identity = normalizeRepoIdentity(url)\n identityMap.set(`${identity.fullPath}|${identity.repo}`, identity)\n }\n return [...identityMap.values()]\n })\n\nconst resolveFromCurrentTree = (): Effect.Effect<string | null, PlatformError, ApplyProjectFilesEnv> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(\".\"))\n const configPath = yield* _(\n findExistingUpwards(fs, path, resolved, \"docker-git.json\", maxLocalConfigSearchDepth).pipe(\n Effect.match({\n onFailure: nullString,\n onSuccess: (value) => value\n })\n )\n )\n return configPath === null ? null : path.dirname(configPath)\n })\n\nconst normalizeBranch = (branch: string | null): string | null => {\n const normalized = branch?.trim() ?? \"\"\n if (normalized.length === 0 || normalized === gitBranchDetached) {\n return null\n }\n return normalized\n}\n\nconst resolveFromCurrentRepository = (): Effect.Effect<string | null, PlatformError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n const cwd = process.cwd()\n const repoRoot = yield* _(tryGitCapture(cwd, [\"rev-parse\", \"--show-toplevel\"]))\n if (repoRoot === null) {\n return null\n }\n\n const remoteIdentities = yield* _(collectRemoteIdentities(repoRoot))\n if (remoteIdentities.length === 0) {\n return null\n }\n\n const branch = normalizeBranch(yield* _(tryGitCapture(repoRoot, [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"])))\n const projectsRoot = defaultProjectsRoot(cwd)\n const candidates = yield* _(listProjectCandidates(projectsRoot))\n if (candidates.length === 0) {\n return null\n }\n\n return selectCandidateProjectDir(remoteIdentities, branch, candidates)\n })\n\nconst resolveImplicitApplyProjectDir = (): Effect.Effect<string | null, PlatformError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n const localProjectDir = yield* _(resolveFromCurrentTree())\n if (localProjectDir !== null) {\n return localProjectDir\n }\n return yield* _(resolveFromCurrentRepository())\n })\n\nconst runApplyForProjectDir = (\n projectDir: string,\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n command.runUp ? applyProjectWithUp(projectDir, command) : applyProjectFiles(projectDir, command)\n\nconst applyProjectWithUp = (\n projectDir: string,\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n Effect.gen(function*(_) {\n yield* _(Effect.log(`Applying docker-git config and refreshing container in ${projectDir}...`))\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n yield* _(ensureClaudeAuthSeedFromHome(defaultProjectsRoot(projectDir), \".orch/auth/claude\"))\n if (hasApplyOverrides(command)) {\n yield* _(applyProjectFiles(projectDir, command))\n }\n return yield* _(runDockerComposeUpWithPortCheck(projectDir))\n })\n\n// CHANGE: add command handler to apply docker-git config on an existing project\n// WHY: update current project/container config without running create/clone again\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall c: apply(c) -> updated(project(c)) && (c.runUp -> container_refreshed(c))\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ApplyProjectConfigError, FileSystem | Path | CommandExecutor>\n// INVARIANT: project path remains unchanged; command only updates managed artifacts\n// COMPLEXITY: O(n) + O(command)\nexport const applyProjectConfig = (\n command: ApplyCommand\n): Effect.Effect<TemplateConfig, ApplyProjectConfigError, ApplyProjectConfigEnv> =>\n runApplyForProjectDir(command.projectDir, command).pipe(\n Effect.catchTag(\"ConfigNotFoundError\", (error) =>\n command.projectDir === \".\"\n ? Effect.gen(function*(_) {\n const inferredProjectDir = yield* _(resolveImplicitApplyProjectDir())\n if (inferredProjectDir === null) {\n return yield* _(Effect.fail(error))\n }\n yield* _(Effect.log(`Auto-resolved docker-git project directory: ${inferredProjectDir}`))\n return yield* _(runApplyForProjectDir(inferredProjectDir, command))\n })\n : Effect.fail(error))\n )\n","import * as Command from \"@effect/platform/Command\"\nimport * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, pipe } from \"effect\"\nimport * as Fiber from \"effect/Fiber\"\nimport type * as Scope from \"effect/Scope\"\nimport * as Stream from \"effect/Stream\"\n\nimport { resolveDefaultDockerUser } from \"../shell/docker-auth.js\"\nimport { AuthError, CommandFailedError } from \"../shell/errors.js\"\n\nconst oauthTokenEnvKey = \"DOCKER_GIT_CLAUDE_OAUTH_TOKEN\"\nconst tokenMarker = \"Your OAuth token (valid for 1 year):\"\nconst tokenFooterMarker = \"Store this token securely.\"\nconst outputWindowSize = 262_144\n\nconst oauthTokenRegex = /([A-Za-z0-9][A-Za-z0-9._-]{20,})/u\n\nconst ansiEscape = \"\\u001B\"\nconst ansiBell = \"\\u0007\"\n\nconst isAnsiFinalByte = (codePoint: number | undefined): boolean =>\n codePoint !== undefined && codePoint >= 0x40 && codePoint <= 0x7E\n\nconst skipCsiSequence = (raw: string, start: number): number => {\n const length = raw.length\n let index = start + 2\n while (index < length) {\n const codePoint = raw.codePointAt(index)\n if (isAnsiFinalByte(codePoint)) {\n return index + 1\n }\n index += 1\n }\n return index\n}\n\nconst skipOscSequence = (raw: string, start: number): number => {\n const length = raw.length\n let index = start + 2\n while (index < length) {\n const char = raw[index] ?? \"\"\n if (char === ansiBell) {\n return index + 1\n }\n if (char === ansiEscape && raw[index + 1] === \"\\\\\") {\n return index + 2\n }\n index += 1\n }\n return index\n}\n\nconst skipEscapeSequence = (raw: string, start: number): number => {\n const next = raw[start + 1] ?? \"\"\n if (next === \"[\") {\n return skipCsiSequence(raw, start)\n }\n if (next === \"]\") {\n return skipOscSequence(raw, start)\n }\n return Math.min(raw.length, start + 2)\n}\n\nconst stripAnsi = (raw: string): string => {\n const cleaned: Array<string> = []\n let index = 0\n\n while (index < raw.length) {\n const current = raw[index] ?? \"\"\n if (current !== ansiEscape) {\n cleaned.push(current)\n index += 1\n continue\n }\n index = skipEscapeSequence(raw, index)\n }\n\n return cleaned.join(\"\")\n}\n\nconst extractOauthToken = (rawOutput: string): string | null => {\n const normalized = stripAnsi(rawOutput).replaceAll(\"\\r\", \"\\n\")\n const markerIndex = normalized.lastIndexOf(tokenMarker)\n if (markerIndex === -1) {\n return null\n }\n\n const tail = normalized.slice(markerIndex + tokenMarker.length)\n const footerIndex = tail.indexOf(tokenFooterMarker)\n const tokenSection = footerIndex === -1 ? tail : tail.slice(0, footerIndex)\n\n // CHANGE: join wrapped lines in token section before parsing\n // WHY: some terminals hard-wrap long OAuth tokens with newline characters\n // REF: issue-377\n // SOURCE: n/a\n // PURITY: CORE\n // INVARIANT: only whitespace is removed; token alphabet remains intact\n const compactSection = tokenSection.replaceAll(/\\s+/gu, \"\")\n const compactMatch = oauthTokenRegex.exec(compactSection)\n if (compactMatch?.[1] !== undefined) {\n return compactMatch[1]\n }\n\n const directMatch = oauthTokenRegex.exec(tokenSection)\n return directMatch?.[1] ?? null\n}\n\nconst oauthTokenFromEnv = (): string | null => {\n const value = (process.env[oauthTokenEnvKey] ?? \"\").trim()\n return value.length > 0 ? value : null\n}\n\nconst ensureOauthToken = (rawToken: string): Effect.Effect<string, AuthError> => {\n const token = rawToken.trim()\n return token.length > 0\n ? Effect.succeed(token)\n : Effect.fail(new AuthError({ message: \"Claude OAuth token is empty.\" }))\n}\n\ntype DockerSetupTokenSpec = {\n readonly cwd: string\n readonly image: string\n readonly hostPath: string\n readonly containerPath: string\n readonly env: ReadonlyArray<string>\n readonly args: ReadonlyArray<string>\n}\n\nconst buildDockerSetupTokenSpec = (\n cwd: string,\n accountPath: string,\n image: string,\n containerPath: string\n): DockerSetupTokenSpec => ({\n cwd,\n image,\n hostPath: accountPath,\n containerPath,\n env: [`CLAUDE_CONFIG_DIR=${containerPath}`, `HOME=${containerPath}`, \"BROWSER=echo\"],\n args: [\"setup-token\"]\n})\n\nconst buildDockerSetupTokenArgs = (spec: DockerSetupTokenSpec): ReadonlyArray<string> => {\n const base: Array<string> = [\"run\", \"--rm\", \"-i\", \"-t\", \"-v\", `${spec.hostPath}:${spec.containerPath}`]\n const dockerUser = resolveDefaultDockerUser()\n if (dockerUser !== null) {\n base.push(\"--user\", dockerUser)\n }\n for (const entry of spec.env) {\n const trimmed = entry.trim()\n if (trimmed.length === 0) {\n continue\n }\n base.push(\"-e\", trimmed)\n }\n return [...base, spec.image, ...spec.args]\n}\n\nconst startDockerProcess = (\n executor: CommandExecutor.CommandExecutor,\n spec: DockerSetupTokenSpec\n): Effect.Effect<CommandExecutor.Process, PlatformError, Scope.Scope> =>\n executor.start(\n pipe(\n Command.make(\"docker\", ...buildDockerSetupTokenArgs(spec)),\n Command.workingDirectory(spec.cwd),\n Command.stdin(\"inherit\"),\n Command.stdout(\"pipe\"),\n Command.stderr(\"pipe\")\n )\n )\n\nconst writeChunkToFd = (fd: number, chunk: Uint8Array): void => {\n if (fd === 2) {\n process.stderr.write(chunk)\n return\n }\n process.stdout.write(chunk)\n}\n\nconst pumpDockerOutput = (\n source: Stream.Stream<Uint8Array, PlatformError>,\n fd: number,\n tokenBox: { value: string | null }\n): Effect.Effect<void, PlatformError> => {\n const decoder = new TextDecoder(\"utf-8\")\n let outputWindow = \"\"\n\n return pipe(\n source,\n Stream.runForEach((chunk) =>\n Effect.sync(() => {\n writeChunkToFd(fd, chunk)\n outputWindow += decoder.decode(chunk)\n if (outputWindow.length > outputWindowSize) {\n outputWindow = outputWindow.slice(-outputWindowSize)\n }\n if (tokenBox.value !== null) {\n return\n }\n const parsed = extractOauthToken(outputWindow)\n if (parsed !== null) {\n tokenBox.value = parsed\n }\n }).pipe(Effect.asVoid)\n )\n ).pipe(Effect.asVoid)\n}\n\nconst resolveCapturedToken = (token: string | null): Effect.Effect<string, AuthError> =>\n token === null\n ? Effect.fail(\n new AuthError({\n message:\n \"Claude OAuth completed without a captured token. Retry login and ensure the flow reaches 'Long-lived authentication token created successfully'.\"\n })\n )\n : ensureOauthToken(token)\n\nconst resolveLoginResult = (\n token: string | null,\n exitCode: number\n): Effect.Effect<string, AuthError | CommandFailedError> =>\n Effect.gen(function*(_) {\n if (token !== null) {\n if (exitCode !== 0) {\n yield* _(\n Effect.logWarning(\n `claude setup-token returned exit=${exitCode}, but OAuth token was captured; continuing.`\n )\n )\n }\n return yield* _(ensureOauthToken(token))\n }\n\n if (exitCode !== 0) {\n yield* _(Effect.fail(new CommandFailedError({ command: \"claude setup-token\", exitCode })))\n }\n\n return yield* _(resolveCapturedToken(token))\n })\n\nexport const runClaudeOauthLoginWithPrompt = (\n cwd: string,\n accountPath: string,\n options: {\n readonly image: string\n readonly containerPath: string\n }\n): Effect.Effect<string, AuthError | CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> => {\n const envToken = oauthTokenFromEnv()\n if (envToken !== null) {\n return ensureOauthToken(envToken)\n }\n\n return Effect.scoped(\n Effect.gen(function*(_) {\n const executor = yield* _(CommandExecutor.CommandExecutor)\n const spec = buildDockerSetupTokenSpec(cwd, accountPath, options.image, options.containerPath)\n const proc = yield* _(startDockerProcess(executor, spec))\n\n const tokenBox: { value: string | null } = { value: null }\n const stdoutFiber = yield* _(Effect.forkScoped(pumpDockerOutput(proc.stdout, 1, tokenBox)))\n const stderrFiber = yield* _(Effect.forkScoped(pumpDockerOutput(proc.stderr, 2, tokenBox)))\n\n const exitCode = yield* _(proc.exitCode.pipe(Effect.map(Number)))\n yield* _(Fiber.join(stdoutFiber))\n yield* _(Fiber.join(stderrFiber))\n return yield* _(resolveLoginResult(tokenBox.value, exitCode))\n })\n )\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { AuthClaudeLoginCommand, AuthClaudeLogoutCommand, AuthClaudeStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { runDockerAuth, runDockerAuthExitCode } from \"../shell/docker-auth.js\"\nimport type { AuthError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { runClaudeOauthLoginWithPrompt } from \"./auth-claude-oauth.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype ClaudeRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype ClaudeAccountContext = {\n readonly accountLabel: string\n readonly accountPath: string\n readonly cwd: string\n readonly fs: FileSystem.FileSystem\n}\n\nexport const claudeAuthRoot = \".docker-git/.orch/auth/claude\"\n\nconst claudeImageName = \"docker-git-auth-claude:latest\"\nconst claudeImageDir = \".docker-git/.orch/auth/claude/.image\"\nconst claudeContainerHomeDir = \"/claude-home\"\nconst claudeOauthTokenFileName = \".oauth-token\"\nconst claudeConfigFileName = \".claude.json\"\nconst claudeCredentialsFileName = \".credentials.json\"\nconst claudeCredentialsDirName = \".claude\"\n\nconst claudeOauthTokenPath = (accountPath: string): string => `${accountPath}/${claudeOauthTokenFileName}`\nconst claudeConfigPath = (accountPath: string): string => `${accountPath}/${claudeConfigFileName}`\nconst claudeCredentialsPath = (accountPath: string): string => `${accountPath}/${claudeCredentialsFileName}`\nconst claudeNestedCredentialsPath = (accountPath: string): string =>\n `${accountPath}/${claudeCredentialsDirName}/${claudeCredentialsFileName}`\n\nconst isRegularFile = (\n fs: FileSystem.FileSystem,\n filePath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(filePath))\n if (!exists) {\n return false\n }\n const info = yield* _(fs.stat(filePath))\n return info.type === \"File\"\n })\n\nconst syncClaudeCredentialsFile = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const nestedPath = claudeNestedCredentialsPath(accountPath)\n const rootPath = claudeCredentialsPath(accountPath)\n const nestedExists = yield* _(isRegularFile(fs, nestedPath))\n if (nestedExists) {\n yield* _(fs.copyFile(nestedPath, rootPath))\n yield* _(fs.chmod(rootPath, 0o600), Effect.orElseSucceed(() => void 0))\n return\n }\n\n const rootExists = yield* _(isRegularFile(fs, rootPath))\n if (rootExists) {\n const nestedDirPath = `${accountPath}/${claudeCredentialsDirName}`\n yield* _(fs.makeDirectory(nestedDirPath, { recursive: true }))\n yield* _(fs.copyFile(rootPath, nestedPath))\n yield* _(fs.chmod(nestedPath, 0o600), Effect.orElseSucceed(() => void 0))\n }\n })\n\nconst hasNonEmptyOauthToken = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const tokenPath = claudeOauthTokenPath(accountPath)\n const hasToken = yield* _(isRegularFile(fs, tokenPath))\n if (!hasToken) {\n return false\n }\n const tokenText = yield* _(fs.readFileString(tokenPath), Effect.orElseSucceed(() => \"\"))\n return tokenText.trim().length > 0\n })\n\nconst buildClaudeAuthEnv = (\n interactive: boolean\n): ReadonlyArray<string> =>\n interactive\n ? [`HOME=${claudeContainerHomeDir}`, `CLAUDE_CONFIG_DIR=${claudeContainerHomeDir}`, \"BROWSER=echo\"]\n : [`HOME=${claudeContainerHomeDir}`, `CLAUDE_CONFIG_DIR=${claudeContainerHomeDir}`]\n\nconst ensureClaudeOrchLayout = (\n cwd: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(cwd, {\n envGlobalPath: defaultTemplateConfig.envGlobalPath,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: defaultTemplateConfig.codexAuthPath,\n ghAuthPath: \".docker-git/.orch/auth/gh\",\n claudeAuthPath: \".docker-git/.orch/auth/claude\"\n })\n\nconst renderClaudeDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends ca-certificates curl bsdutils \\\n && rm -rf /var/lib/apt/lists/*\nRUN curl -fsSL https://deb.nodesource.com/setup_24.x | bash - \\\n && apt-get install -y --no-install-recommends nodejs \\\n && node -v \\\n && npm -v \\\n && rm -rf /var/lib/apt/lists/*\nRUN npm install -g @anthropic-ai/claude-code@latest\nENTRYPOINT [\"claude\"]\n`\n\nconst resolveClaudeAccountPath = (path: Path.Path, rootPath: string, label: string | null): {\n readonly accountLabel: string\n readonly accountPath: string\n} => {\n const accountLabel = normalizeAccountLabel(label, \"default\")\n const accountPath = path.join(rootPath, accountLabel)\n return { accountLabel, accountPath }\n}\n\nconst withClaudeAuth = <A, E>(\n command: AuthClaudeLoginCommand | AuthClaudeLogoutCommand | AuthClaudeStatusCommand,\n run: (\n context: ClaudeAccountContext\n ) => Effect.Effect<A, E, CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError | CommandFailedError, ClaudeRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureClaudeOrchLayout(cwd))\n const rootPath = resolvePathFromCwd(path, cwd, command.claudeAuthPath)\n const { accountLabel, accountPath } = resolveClaudeAccountPath(path, rootPath, command.label)\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n yield* _(\n ensureDockerImage(fs, path, cwd, {\n imageName: claudeImageName,\n imageDir: claudeImageDir,\n dockerfile: renderClaudeDockerfile(),\n buildLabel: \"claude auth\"\n })\n )\n return yield* _(run({ accountLabel, accountPath, cwd, fs }))\n })\n )\n\nconst runClaudeAuthCommand = (\n cwd: string,\n accountPath: string,\n args: ReadonlyArray<string>,\n commandLabel: string,\n interactive: boolean\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: claudeImageName,\n hostPath: accountPath,\n containerPath: claudeContainerHomeDir,\n env: buildClaudeAuthEnv(interactive),\n args,\n interactive\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: commandLabel, exitCode })\n )\n\nconst runClaudeLogout = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runClaudeAuthCommand(cwd, accountPath, [\"auth\", \"logout\"], \"claude auth logout\", false)\n\nconst runClaudePingProbeExitCode = (\n cwd: string,\n accountPath: string\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthExitCode(\n buildDockerAuthSpec({\n cwd,\n image: claudeImageName,\n hostPath: accountPath,\n containerPath: claudeContainerHomeDir,\n env: buildClaudeAuthEnv(false),\n args: [\"-p\", \"ping\"],\n interactive: false\n })\n )\n\n// CHANGE: login to Claude Code CLI via interactive `claude setup-token` in isolated container\n// WHY: `claude auth login` may stall in containerized TTY without presenting the code prompt\n// QUOTE(ТЗ): \"claude авторизация в docker-git рабочая\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: login(l) -> claude_auth_cache_exists(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, AuthError | CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: HOME and CLAUDE_CONFIG_DIR are pinned to the mounted auth directory\n// COMPLEXITY: O(command)\nexport const authClaudeLogin = (\n command: AuthClaudeLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, ClaudeRuntime> => {\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n return withClaudeAuth(command, ({ accountPath, cwd, fs }) =>\n Effect.gen(function*(_) {\n const token = yield* _(\n runClaudeOauthLoginWithPrompt(cwd, accountPath, {\n image: claudeImageName,\n containerPath: claudeContainerHomeDir\n })\n )\n yield* _(fs.writeFileString(claudeOauthTokenPath(accountPath), `${token}\\n`))\n yield* _(fs.chmod(claudeOauthTokenPath(accountPath), 0o600), Effect.orElseSucceed(() => void 0))\n yield* _(syncClaudeCredentialsFile(fs, accountPath))\n const probeExitCode = yield* _(runClaudePingProbeExitCode(cwd, accountPath))\n if (probeExitCode !== 0) {\n yield* _(\n Effect.fail(\n new CommandFailedError({\n command: \"claude setup-token\",\n exitCode: probeExitCode\n })\n )\n )\n }\n })).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth claude ${accountLabel}`))\n )\n}\n\n// CHANGE: show Claude Code auth status for a given label\n// WHY: allow verifying OAuth cache presence without exposing credentials\n// QUOTE(ТЗ): \"где теперь можно изучить эти сессии?\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: status(l) -> connected(l) | disconnected(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never logs tokens/credentials\n// COMPLEXITY: O(command)\nexport const authClaudeStatus = (\n command: AuthClaudeStatusCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, ClaudeRuntime> =>\n withClaudeAuth(command, ({ accountLabel, accountPath, cwd, fs }) =>\n Effect.gen(function*(_) {\n yield* _(syncClaudeCredentialsFile(fs, accountPath))\n const hasOauthToken = yield* _(hasNonEmptyOauthToken(fs, accountPath))\n const hasCredentials = yield* _(isRegularFile(fs, claudeCredentialsPath(accountPath)))\n if (!hasOauthToken && !hasCredentials) {\n yield* _(Effect.log(`Claude not connected (${accountLabel}).`))\n return\n }\n\n const probeExitCode = yield* _(runClaudePingProbeExitCode(cwd, accountPath))\n if (probeExitCode === 0) {\n const method = hasCredentials ? \"claude-ai-session\" : \"oauth-token\"\n yield* _(Effect.log(`Claude connected (${accountLabel}, ${method}).`))\n return\n }\n const method = hasCredentials ? \"claude-ai-session\" : \"oauth-token\"\n yield* _(\n Effect.logWarning(\n `Claude session exists but API probe failed (${accountLabel}, ${method}, exit=${probeExitCode}). Run 'docker-git auth claude login'.`\n )\n )\n }))\n\n// CHANGE: logout Claude Code by clearing credentials for a label\n// WHY: allow revoking Claude Code access deterministically\n// QUOTE(ТЗ): \"Надо сделать что бы ... можно создавать множество данных\"\n// REF: issue-61\n// SOURCE: n/a\n// FORMAT THEOREM: forall l: logout(l) -> credentials_cleared(l)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: CLAUDE_CONFIG_DIR stays within the mounted account directory\n// COMPLEXITY: O(command)\nexport const authClaudeLogout = (\n command: AuthClaudeLogoutCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, ClaudeRuntime> =>\n Effect.gen(function*(_) {\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n yield* _(\n withClaudeAuth(command, ({ accountPath, cwd, fs }) =>\n Effect.gen(function*(_) {\n yield* _(runClaudeLogout(cwd, accountPath))\n yield* _(fs.remove(claudeOauthTokenPath(accountPath), { force: true }))\n yield* _(fs.remove(claudeCredentialsPath(accountPath), { force: true }))\n yield* _(fs.remove(claudeNestedCredentialsPath(accountPath), { force: true }))\n yield* _(fs.remove(claudeConfigPath(accountPath), { force: true }))\n }))\n )\n yield* _(autoSyncState(`chore(state): auth claude logout ${accountLabel}`))\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { AuthCodexLoginCommand, AuthCodexLogoutCommand, AuthCodexStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { runDockerAuth, runDockerAuthExitCode } from \"../shell/docker-auth.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { ensureCodexConfigFile, migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureDockerImage } from \"./docker-image.js\"\n// NOTE: keep local helpers grouped to avoid duplicated import blocks.\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype CodexRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype CodexAccountContext = {\n readonly accountPath: string\n readonly cwd: string\n}\n\nconst codexImageName = \"docker-git-auth-codex:latest\"\nconst codexImageDir = \".docker-git/.orch/auth/codex/.image\"\nconst codexHome = \"/root/.codex\"\n\nconst ensureCodexOrchLayout = (\n cwd: string,\n codexAuthPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(cwd, {\n envGlobalPath: defaultTemplateConfig.envGlobalPath,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath,\n ghAuthPath: \".docker-git/.orch/auth/gh\",\n claudeAuthPath: \".docker-git/.orch/auth/claude\"\n })\n\nconst renderCodexDockerfile = (): string =>\n String.raw`FROM ubuntu:24.04\nENV DEBIAN_FRONTEND=noninteractive\nRUN apt-get update \\\n && apt-get install -y --no-install-recommends curl ca-certificates unzip bsdutils nodejs \\\n && rm -rf /var/lib/apt/lists/*\nENV BUN_INSTALL=/usr/local/bun\nENV PATH=\"/usr/local/bun/bin:$PATH\"\nRUN set -eu; \\\n for attempt in 1 2 3 4 5; do \\\n if curl -fsSL --retry 5 --retry-all-errors --retry-delay 2 https://bun.sh/install -o /tmp/bun-install.sh \\\n && BUN_INSTALL=/usr/local/bun bash /tmp/bun-install.sh; then \\\n rm -f /tmp/bun-install.sh; \\\n exit 0; \\\n fi; \\\n echo \"bun install attempt \\${attempt} failed; retrying...\" >&2; \\\n rm -f /tmp/bun-install.sh; \\\n sleep $((attempt * 2)); \\\n done; \\\n echo \"bun install failed after retries\" >&2; \\\n exit 1\nRUN ln -sf /usr/local/bun/bin/bun /usr/local/bin/bun\nRUN script -q -e -c \"bun add -g @openai/codex@latest\" /dev/null\nRUN ln -sf /usr/local/bun/bin/codex /usr/local/bin/codex\n`\n\nconst resolveCodexAccountPath = (rootPath: string, label: string | null): string => {\n const resolvedLabel = normalizeAccountLabel(label, \"default\")\n return resolvedLabel === \"default\" ? rootPath : `${rootPath}/${resolvedLabel}`\n}\n\nconst withCodexAccount = <A, E>(\n codexAuthPath: string,\n label: string | null,\n run: (\n context: CodexAccountContext\n ) => Effect.Effect<A, E, FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureCodexOrchLayout(cwd, codexAuthPath))\n const rootPath = resolvePathFromCwd(path, cwd, codexAuthPath)\n const accountPath = resolveCodexAccountPath(rootPath, label)\n yield* _(ensureCodexConfigFile(cwd, accountPath))\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n return yield* _(run({ accountPath, cwd }))\n })\n )\n\nconst withCodexAuth = <A, E>(\n command: AuthCodexLoginCommand | AuthCodexLogoutCommand | AuthCodexStatusCommand,\n run: (\n context: CodexAccountContext\n ) => Effect.Effect<A, E, CommandExecutor.CommandExecutor>\n): Effect.Effect<A, E | PlatformError | CommandFailedError, CodexRuntime> =>\n withCodexAccount(command.codexAuthPath, command.label, ({ accountPath, cwd }) =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n yield* _(\n ensureDockerImage(fs, path, cwd, {\n imageName: codexImageName,\n imageDir: codexImageDir,\n dockerfile: renderCodexDockerfile(),\n buildLabel: \"codex auth\"\n })\n )\n return yield* _(run({ accountPath, cwd }))\n }))\n\nconst runCodexAuthCommand = (\n cwd: string,\n accountPath: string,\n args: ReadonlyArray<string>,\n commandLabel: string,\n interactive: boolean\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: codexImageName,\n hostPath: accountPath,\n containerPath: codexHome,\n env: `CODEX_HOME=${codexHome}`,\n args,\n interactive\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: commandLabel, exitCode })\n )\n\nconst runCodexLogin = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCodexAuthCommand(cwd, accountPath, [\"codex\", \"login\", \"--device-auth\"], \"codex login --device-auth\", false)\n\nconst runCodexStatus = (\n cwd: string,\n accountPath: string\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthExitCode(\n buildDockerAuthSpec({\n cwd,\n image: codexImageName,\n hostPath: accountPath,\n containerPath: codexHome,\n env: `CODEX_HOME=${codexHome}`,\n args: [\"codex\", \"login\", \"status\"],\n interactive: false\n })\n )\n\nconst runCodexLogout = (\n cwd: string,\n accountPath: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCodexAuthCommand(cwd, accountPath, [\"codex\", \"logout\"], \"codex logout\", false)\n\n// CHANGE: login to Codex CLI using a dedicated auth container\n// WHY: keep auth isolated from the host toolchain\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: login(p) -> codex_auth(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: CODEX_HOME is set to the resolved auth directory\n// COMPLEXITY: O(command)\nexport const authCodexLogin = (\n command: AuthCodexLoginCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) => runCodexLogin(cwd, accountPath)).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth codex ${normalizeAccountLabel(command.label, \"default\")}`))\n )\n\n// CHANGE: show Codex auth status for a given label\n// WHY: make it obvious whether Codex is connected\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: status(p) -> connected(p) | disconnected(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: never logs credentials\n// COMPLEXITY: O(command)\nexport const authCodexStatus = (\n command: AuthCodexStatusCommand\n): Effect.Effect<void, PlatformError | CommandFailedError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) =>\n Effect.gen(function*(_) {\n const exitCode = yield* _(runCodexStatus(cwd, accountPath))\n if (exitCode === 0) {\n yield* _(Effect.log(`Codex connected (${accountPath}).`))\n return\n }\n if (exitCode === 1) {\n yield* _(Effect.log(`Codex not connected (${accountPath}).`))\n return\n }\n return yield* _(Effect.fail(new CommandFailedError({ command: \"codex login status\", exitCode })))\n }))\n\n// CHANGE: logout Codex by clearing credentials for a label\n// WHY: allow revoking Codex access deterministically\n// QUOTE(ТЗ): \"поднимал отдельный контейнер где будет установлен чисто gh или чисто codex\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: logout(p) -> credentials_cleared(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, FileSystem | Path | CommandExecutor>\n// INVARIANT: codex auth state reflects CODEX_HOME after logout\n// COMPLEXITY: O(command)\nexport const authCodexLogout = (\n command: AuthCodexLogoutCommand\n): Effect.Effect<void, CommandFailedError | PlatformError, CodexRuntime> =>\n withCodexAuth(command, ({ accountPath, cwd }) => runCodexLogout(cwd, accountPath)).pipe(\n Effect.zipRight(autoSyncState(`chore(state): auth codex logout ${normalizeAccountLabel(command.label, \"default\")}`))\n )\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\n// NOTE: keep platform type imports grouped for auth flows.\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Duration, Effect, Schedule } from \"effect\"\n\nimport type { AuthGithubLoginCommand, AuthGithubLogoutCommand, AuthGithubStatusCommand } from \"../core/domain.js\"\nimport { defaultTemplateConfig } from \"../core/domain.js\"\nimport { trimLeftChar, trimRightChar } from \"../core/strings.js\"\nimport { runDockerAuth, runDockerAuthCapture } from \"../shell/docker-auth.js\"\nimport type { AuthError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { buildDockerAuthSpec, normalizeAccountLabel } from \"./auth-helpers.js\"\nimport { migrateLegacyOrchLayout } from \"./auth-sync.js\"\nimport { ensureEnvFile, parseEnvEntries, readEnvText, removeEnvKey, upsertEnvKey } from \"./env-file.js\"\nimport { ensureGhAuthImage, ghAuthDir, ghAuthRoot, ghImageName } from \"./github-auth-image.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { withFsPathContext } from \"./runtime.js\"\nimport { autoSyncState } from \"./state-repo.js\"\n\ntype GithubTokenEntry = {\n readonly key: string\n readonly label: string\n readonly token: string\n}\n\ntype GithubFsRuntime = FileSystem.FileSystem | Path.Path\ntype GithubRuntime = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\ntype EnvContext = {\n readonly fs: FileSystem.FileSystem\n readonly envPath: string\n readonly current: string\n}\n\nconst ensureGithubOrchLayout = (\n cwd: string,\n envGlobalPath: string\n): Effect.Effect<void, PlatformError, FileSystem.FileSystem | Path.Path> =>\n migrateLegacyOrchLayout(cwd, {\n envGlobalPath,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: defaultTemplateConfig.codexAuthPath,\n ghAuthPath: ghAuthRoot,\n claudeAuthPath: \".docker-git/.orch/auth/claude\"\n })\n\nconst normalizeGithubLabel = (value: string | null): string => {\n const trimmed = value?.trim() ?? \"\"\n if (trimmed.length === 0) {\n return \"\"\n }\n const normalized = trimmed.toUpperCase().replaceAll(/[^A-Z0-9]+/g, \"_\")\n const withoutLeading = trimLeftChar(normalized, \"_\")\n const cleaned = trimRightChar(withoutLeading, \"_\")\n return cleaned.length > 0 ? cleaned : \"\"\n}\n\nconst tokenKey = \"GITHUB_TOKEN\"\nconst tokenPrefix = \"GITHUB_TOKEN__\"\n\nconst buildGithubTokenKey = (label: string | null): string => {\n const normalized = normalizeGithubLabel(label)\n if (normalized === \"DEFAULT\" || normalized.length === 0) {\n return tokenKey\n }\n return `${tokenPrefix}${normalized}`\n}\n\nconst labelFromKey = (key: string): string => key.startsWith(tokenPrefix) ? key.slice(tokenPrefix.length) : \"default\"\n\nconst listGithubTokens = (envText: string): ReadonlyArray<GithubTokenEntry> =>\n parseEnvEntries(envText)\n .filter((entry) => entry.key === tokenKey || entry.key.startsWith(tokenPrefix))\n .map((entry) => ({\n key: entry.key,\n label: labelFromKey(entry.key),\n token: entry.value\n }))\n .filter((entry) => entry.token.trim().length > 0)\n\nconst defaultGithubScopes = \"repo,workflow,read:org\"\n\n// CHANGE: normalize GitHub scopes for gh auth login\n// WHY: ensure required scopes are requested without delete_repo\n// QUOTE(ТЗ): \"Передай все нужные скопы\"\n// REF: user-request-2026-02-05-gh-scopes\n// SOURCE: n/a\n// FORMAT THEOREM: ∀s: normalize(s) -> scopes(s) ⊆ required\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: empty input yields default scopes\n// COMPLEXITY: O(n) where n = |scopes|\nconst normalizeGithubScopes = (value: string | null | undefined): ReadonlyArray<string> => {\n const raw = value?.trim() ?? \"\"\n const input = raw.length === 0 ? defaultGithubScopes : raw\n const scopes = input\n .split(/[,\\s]+/g)\n .map((scope) => scope.trim())\n .filter((scope) => scope.length > 0 && scope !== \"delete_repo\")\n return scopes.length === 0 ? defaultGithubScopes.split(\",\") : scopes\n}\n\nconst withEnvContext = <A, E, R>(\n envGlobalPath: string,\n run: (context: EnvContext) => Effect.Effect<A, E, FileSystem.FileSystem | R>\n): Effect.Effect<A, E | PlatformError, FileSystem.FileSystem | Path.Path | R> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureGithubOrchLayout(cwd, envGlobalPath))\n const envPath = resolvePathFromCwd(path, cwd, envGlobalPath)\n const current = yield* _(readEnvText(fs, envPath))\n return yield* _(run({ fs, envPath, current }))\n })\n )\n\nconst resolveGithubTokenFromGh = (\n cwd: string,\n accountPath: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuthCapture(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath: accountPath,\n containerPath: ghAuthDir,\n args: [\"auth\", \"token\"],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: \"gh auth token\", exitCode })\n ).pipe(\n Effect.map((raw) => raw.trim()),\n Effect.filterOrFail(\n (value) => value.length > 0,\n () => new CommandFailedError({ command: \"gh auth token\", exitCode: 1 })\n )\n )\n\nconst runGithubLogin = (\n cwd: string,\n accountPath: string,\n scopes: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runDockerAuth(\n buildDockerAuthSpec({\n cwd,\n image: ghImageName,\n hostPath: accountPath,\n containerPath: ghAuthDir,\n env: \"BROWSER=echo\",\n args: [\n \"auth\",\n \"login\",\n \"--web\",\n \"-h\",\n \"github.com\",\n \"-p\",\n \"https\",\n ...(scopes.length > 0 ? [\"--scopes\", scopes.join(\",\")] : [])\n ],\n interactive: false\n }),\n [0],\n (exitCode) => new CommandFailedError({ command: \"gh auth login --web\", exitCode })\n )\n\nconst retryGithubLogin = (\n effect: Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n effect.pipe(\n Effect.tapError(() => Effect.logWarning(\"GH auth login failed; retrying...\")),\n Effect.retry(\n Schedule.addDelay(\n Schedule.recurs(2),\n () => Duration.seconds(2)\n )\n )\n )\n\nconst persistGithubToken = (\n fs: FileSystem.FileSystem,\n envPath: string,\n key: string,\n token: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const current = yield* _(readEnvText(fs, envPath))\n const nextText = upsertEnvKey(current, key, token)\n yield* _(fs.writeFileString(envPath, nextText))\n const label = labelFromKey(key)\n yield* _(Effect.log(`GitHub token stored (${label}) in ${envPath}`))\n })\n\nconst runGithubInteractiveLogin = (\n cwd: string,\n fs: FileSystem.FileSystem,\n path: Path.Path,\n envPath: string,\n command: AuthGithubLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, GithubRuntime> =>\n Effect.gen(function*(_) {\n const rootPath = resolvePathFromCwd(path, cwd, ghAuthRoot)\n const accountLabel = normalizeAccountLabel(command.label, \"default\")\n const accountPath = path.join(rootPath, accountLabel)\n const scopes = normalizeGithubScopes(command.scopes)\n yield* _(fs.makeDirectory(accountPath, { recursive: true }))\n yield* _(ensureGhAuthImage(fs, path, cwd, \"gh auth\"))\n yield* _(Effect.log(`Starting GH auth login in container (scopes: ${scopes.join(\", \")})...`))\n yield* _(retryGithubLogin(runGithubLogin(cwd, accountPath, scopes)))\n const resolved = yield* _(resolveGithubTokenFromGh(cwd, accountPath))\n yield* _(ensureEnvFile(fs, path, envPath))\n const key = buildGithubTokenKey(command.label)\n yield* _(persistGithubToken(fs, envPath, key, resolved))\n })\n\n// CHANGE: login to GitHub by persisting a token in the shared env file\n// WHY: make GH_TOKEN available to all docker-git projects\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall t: login(t) -> env(GITHUB_TOKEN)=t\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | PlatformError, CommandExecutor>\n// INVARIANT: token is never logged\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubLogin = (\n command: AuthGithubLoginCommand\n): Effect.Effect<void, AuthError | CommandFailedError | PlatformError, GithubRuntime> =>\n withFsPathContext(({ cwd, fs, path }) =>\n Effect.gen(function*(_) {\n yield* _(ensureGithubOrchLayout(cwd, command.envGlobalPath))\n const envPath = resolvePathFromCwd(path, cwd, command.envGlobalPath)\n const token = command.token?.trim() ?? \"\"\n const key = buildGithubTokenKey(command.label)\n const label = labelFromKey(key)\n if (token.length > 0) {\n yield* _(ensureEnvFile(fs, path, envPath))\n yield* _(persistGithubToken(fs, envPath, key, token))\n yield* _(autoSyncState(`chore(state): auth gh ${label}`))\n return\n }\n yield* _(runGithubInteractiveLogin(cwd, fs, path, envPath, command))\n yield* _(autoSyncState(`chore(state): auth gh ${label}`))\n })\n )\n\n// CHANGE: show GitHub auth status from the shared env file\n// WHY: surface current account labels without leaking tokens\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: status(env) -> labels(env)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: tokens are never logged\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubStatus = (\n command: AuthGithubStatusCommand\n): Effect.Effect<void, PlatformError, GithubFsRuntime> =>\n withEnvContext(command.envGlobalPath, ({ current, envPath }) =>\n Effect.gen(function*(_) {\n const tokens = listGithubTokens(current)\n if (tokens.length === 0) {\n yield* _(Effect.log(`GitHub not connected (no tokens in ${envPath}).`))\n return\n }\n const sample = tokens.slice(0, 20).map((entry) => entry.label).join(\", \")\n const remaining = tokens.length - Math.min(tokens.length, 20)\n const suffix = remaining > 0 ? ` ... (+${remaining} more)` : \"\"\n yield* _(Effect.log(`GitHub tokens (${tokens.length}): ${sample}${suffix}`))\n }))\n\n// CHANGE: remove GitHub auth token from the shared env file\n// WHY: allow revoking tokens without editing files manually\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: logout(env) -> !hasToken(env)\n// PURITY: SHELL\n// EFFECT: Effect<void, PlatformError, FileSystem | Path>\n// INVARIANT: only the selected token key is removed\n// COMPLEXITY: O(n) where n = |env|\nexport const authGithubLogout = (\n command: AuthGithubLogoutCommand\n): Effect.Effect<void, PlatformError, GithubRuntime> =>\n withEnvContext(command.envGlobalPath, ({ current, envPath, fs }) =>\n Effect.gen(function*(_) {\n const key = buildGithubTokenKey(command.label)\n const nextText = removeEnvKey(current, key)\n yield* _(fs.writeFileString(envPath, nextText))\n const label = labelFromKey(key)\n yield* _(Effect.log(`GitHub token removed (${label}) from ${envPath}`))\n yield* _(autoSyncState(`chore(state): auth gh logout ${label}`))\n }))\n","import type { CommandExecutor } from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem } from \"@effect/platform/FileSystem\"\nimport type { Path } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { McpPlaywrightUpCommand, TemplateConfig } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerAccessError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"../shell/errors.js\"\nimport { writeProjectFiles } from \"../shell/files.js\"\nimport { ensureCodexConfigFile } from \"./auth-sync.js\"\nimport { runDockerComposeUpWithPortCheck } from \"./projects-up.js\"\n\ntype McpPlaywrightFilesError = ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError\ntype McpPlaywrightFilesEnv = FileSystem | Path\n\nconst enableInTemplate = (template: TemplateConfig): TemplateConfig => ({\n ...template,\n enableMcpPlaywright: true\n})\n\n// CHANGE: enable Playwright MCP in an existing docker-git project directory (files only)\n// WHY: allow adding the browser sidecar + MCP server config without wiping env or volumes\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: enable(p) -> template(p).enableMcpPlaywright = true\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, ConfigNotFoundError | ConfigDecodeError | FileExistsError | PlatformError, FileSystem | Path>\n// INVARIANT: does not rewrite .orch/env/project.env (only managed templates + docker-git.json)\n// COMPLEXITY: O(n) where n = |managed_files|\nexport const enableMcpPlaywrightProjectFiles = (\n projectDir: string\n): Effect.Effect<TemplateConfig, McpPlaywrightFilesError, McpPlaywrightFilesEnv> =>\n Effect.gen(function*(_) {\n const config = yield* _(readProjectConfig(projectDir))\n const alreadyEnabled = config.template.enableMcpPlaywright\n const updated = alreadyEnabled ? config.template : enableInTemplate(config.template)\n\n yield* _(\n alreadyEnabled\n ? Effect.log(\"Playwright MCP is already enabled for this project.\")\n : Effect.log(\"Enabling Playwright MCP for this project (templates only)...\")\n )\n\n yield* _(writeProjectFiles(projectDir, updated, true))\n yield* _(ensureCodexConfigFile(projectDir, updated.codexAuthPath))\n\n return updated\n })\n\nexport type McpPlaywrightUpError =\n | McpPlaywrightFilesError\n | DockerAccessError\n | DockerCommandError\n | PortProbeError\n\ntype McpPlaywrightUpEnv = McpPlaywrightFilesEnv | CommandExecutor\n\n// CHANGE: enable Playwright MCP in an existing project dir and bring docker compose up\n// WHY: upgrade already created containers to support browser automation without forcing full recreation flows\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: up(p) -> running(p-browser) OR docker_error\n// PURITY: SHELL\n// EFFECT: Effect<TemplateConfig, McpPlaywrightUpError, FileSystem | Path | CommandExecutor>\n// INVARIANT: volumes are preserved (no docker compose down -v)\n// COMPLEXITY: O(command)\nexport const mcpPlaywrightUp = (\n command: McpPlaywrightUpCommand\n): Effect.Effect<TemplateConfig, McpPlaywrightUpError, McpPlaywrightUpEnv> =>\n Effect.gen(function*(_) {\n const updated = yield* _(enableMcpPlaywrightProjectFiles(command.projectDir))\n\n if (!command.runUp) {\n return updated\n }\n\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n return yield* _(runDockerComposeUpWithPortCheck(command.projectDir))\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ScrapArchiveInvalidError } from \"../shell/errors.js\"\nimport { ScrapArchiveInvalidError as ScrapArchiveInvalidErrorClass } from \"../shell/errors.js\"\n\nexport const maxGitBlobBytes = 99 * 1000 * 1000\nexport const chunkManifestSuffix = \".chunks.json\"\n\nexport type ChunkManifest = {\n readonly original: string\n readonly originalSize: number\n readonly parts: ReadonlyArray<string>\n readonly splitAt: number\n readonly partsCount: number\n readonly createdAt: string\n}\n\nconst ChunkManifestSchema = Schema.Struct({\n original: Schema.String,\n originalSize: Schema.Number,\n parts: Schema.Array(Schema.String),\n splitAt: Schema.Number,\n partsCount: Schema.Number,\n createdAt: Schema.String\n})\n\nconst ChunkManifestJsonSchema = Schema.parseJson(ChunkManifestSchema)\n\nexport const decodeChunkManifest = (\n manifestPath: string,\n input: string\n): Effect.Effect<ChunkManifest, ScrapArchiveInvalidError> =>\n Either.match(ParseResult.decodeUnknownEither(ChunkManifestJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ScrapArchiveInvalidErrorClass({\n path: manifestPath,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n\nexport const removeChunkArtifacts = (\n fs: Fs,\n path: PathService,\n fileAbs: string\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const dir = path.dirname(fileAbs)\n const base = path.basename(fileAbs)\n const entries = yield* _(fs.readDirectory(dir))\n for (const entry of entries) {\n if (!entry.startsWith(`${base}.part`)) {\n continue\n }\n yield* _(fs.remove(path.join(dir, entry), { force: true }))\n }\n yield* _(fs.remove(`${fileAbs}${chunkManifestSuffix}`, { force: true }))\n }).pipe(Effect.asVoid)\n\nexport const listChunkParts = (\n fs: Fs,\n path: PathService,\n fileAbs: string\n): Effect.Effect<ReadonlyArray<string>, PlatformError> =>\n Effect.gen(function*(_) {\n const dir = path.dirname(fileAbs)\n const base = path.basename(fileAbs)\n const entries = yield* _(fs.readDirectory(dir))\n const parts = entries\n .filter((entry) => entry.startsWith(`${base}.part`))\n .toSorted((a, b) => a.localeCompare(b))\n return parts.map((entry) => path.join(dir, entry))\n })\n\nexport const sumFileSizes = (\n fs: Fs,\n filesAbs: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError> =>\n Effect.gen(function*(_) {\n let total = 0\n for (const fileAbs of filesAbs) {\n const stat = yield* _(fs.stat(fileAbs))\n if (stat.type === \"File\") {\n total += Number(stat.size)\n }\n }\n return total\n })\n\nexport const writeChunkManifest = (\n fs: Fs,\n path: PathService,\n fileAbs: string,\n originalSize: number,\n partsAbs: ReadonlyArray<string>\n): Effect.Effect<string, PlatformError> =>\n Effect.gen(function*(_) {\n const base = path.basename(fileAbs)\n const manifest: ChunkManifest = {\n original: base,\n originalSize,\n parts: partsAbs.map((part) => path.basename(part)),\n splitAt: maxGitBlobBytes,\n partsCount: partsAbs.length,\n createdAt: new Date().toISOString()\n }\n const manifestPath = `${fileAbs}${chunkManifestSuffix}`\n yield* _(fs.writeFileString(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`))\n return manifestPath\n })\n","import { Either } from \"effect\"\n\nimport { ScrapTargetDirUnsupportedError } from \"../shell/errors.js\"\n\nconst normalizeContainerPath = (value: string): string => value.replaceAll(\"\\\\\", \"/\").trim()\n\nexport const expandContainerHome = (sshUser: string, value: string): string => {\n if (value === \"~\") {\n return `/home/${sshUser}`\n }\n if (value.startsWith(\"~/\")) {\n return `/home/${sshUser}${value.slice(1)}`\n }\n return value\n}\n\nconst trimTrailingPosixSlashes = (value: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === \"/\") {\n end -= 1\n }\n return value.slice(0, end)\n}\n\nconst hasParentTraversalSegment = (value: string): boolean => value.split(\"/\").includes(\"..\")\n\nconst unsupportedTargetDir = (\n sshUser: string,\n targetDir: string,\n reason: string\n): ScrapTargetDirUnsupportedError => new ScrapTargetDirUnsupportedError({ sshUser, targetDir, reason })\n\nexport const deriveScrapWorkspaceRelativePath = (\n sshUser: string,\n targetDir: string\n): Either.Either<string, ScrapTargetDirUnsupportedError> => {\n const normalizedTarget = trimTrailingPosixSlashes(\n normalizeContainerPath(expandContainerHome(sshUser, targetDir))\n )\n const normalizedHome = trimTrailingPosixSlashes(`/home/${sshUser}`)\n\n if (hasParentTraversalSegment(normalizedTarget)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, \"targetDir must not contain '..' path segments\"))\n }\n\n if (normalizedTarget === normalizedHome) {\n return Either.right(\"\")\n }\n\n const prefix = `${normalizedHome}/`\n if (!normalizedTarget.startsWith(prefix)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, `targetDir must be under ${normalizedHome}`))\n }\n\n const relative = normalizedTarget\n .slice(prefix.length)\n .split(\"/\")\n .filter((segment) => segment.length > 0 && segment !== \".\")\n .join(\"/\")\n\n if (relative.length === 0) {\n return Either.right(\"\")\n }\n\n if (hasParentTraversalSegment(relative)) {\n return Either.left(unsupportedTargetDir(sshUser, targetDir, \"targetDir must not contain '..' path segments\"))\n }\n\n return Either.right(relative)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ProjectConfig } from \"../core/domain.js\"\nimport { runCommandCapture, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport type { CommandFailedError, ScrapWipeRefusedError } from \"../shell/errors.js\"\nimport {\n CommandFailedError as CommandFailedErrorClass,\n ScrapWipeRefusedError as ScrapWipeRefusedErrorClass\n} from \"../shell/errors.js\"\nimport { expandContainerHome } from \"./scrap-path.js\"\n\nconst dockerOk = [0]\n\nexport type ScrapTemplate = {\n readonly sshUser: string\n readonly containerName: string\n readonly targetDir: string\n readonly volumeName: string\n readonly codexHome: string\n}\n\nexport const buildScrapTemplate = (config: ProjectConfig): ScrapTemplate => ({\n sshUser: config.template.sshUser,\n containerName: config.template.containerName,\n targetDir: expandContainerHome(config.template.sshUser, config.template.targetDir),\n volumeName: config.template.volumeName,\n codexHome: config.template.codexHome\n})\n\nexport const eitherToEffect = <A, E>(either: Either.Either<A, E>): Effect.Effect<A, E> =>\n Either.match(either, {\n onLeft: (error) => Effect.fail(error),\n onRight: (value) => Effect.succeed(value)\n })\n\nexport const shellEscape = (value: string): string => {\n if (value.length === 0) {\n return \"''\"\n }\n if (!/[^\\w@%+=:,./-]/.test(value)) {\n return value\n }\n const escaped = value.replaceAll(\"'\", \"'\\\"'\\\"'\")\n return `'${escaped}'`\n}\n\nexport const runShell = (\n cwd: string,\n label: string,\n script: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n // NOTE: avoid `sh -l` on the host; some distros ship /etc/profile that is bash-only and breaks dash/posix sh.\n { cwd, command: \"sh\", args: [\"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `sh (${label})`, exitCode })\n )\n\nexport const runDockerExecCapture = (\n cwd: string,\n label: string,\n containerName: string,\n script: string,\n user?: string\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n // NOTE: avoid `sh -l` inside containers; it can source /etc/profile which may be bash-only and break dash/posix sh.\n { cwd, command: \"docker\", args: [\"exec\", ...(user ? [\"-u\", user] : []), containerName, \"sh\", \"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `docker exec (${label})`, exitCode })\n )\n\nexport const runDockerExec = (\n cwd: string,\n label: string,\n containerName: string,\n script: string,\n user?: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n // NOTE: avoid `sh -l` inside containers; it can source /etc/profile which may be bash-only and break dash/posix sh.\n { cwd, command: \"docker\", args: [\"exec\", ...(user ? [\"-u\", user] : []), containerName, \"sh\", \"-c\", script] },\n dockerOk,\n (exitCode) => new CommandFailedErrorClass({ command: `docker exec (${label})`, exitCode })\n )\n\nexport const ensureSafeScrapImportWipe = (\n wipe: boolean,\n template: ScrapTemplate,\n relative: string\n): Effect.Effect<void, ScrapWipeRefusedError> =>\n wipe && relative.length === 0\n ? Effect.fail(\n new ScrapWipeRefusedErrorClass({\n sshUser: template.sshUser,\n targetDir: template.targetDir,\n reason: `wipe would target /home/${template.sshUser}`\n })\n )\n : Effect.void\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { ProjectConfig, ScrapExportCommand } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport {\n listChunkParts,\n maxGitBlobBytes,\n removeChunkArtifacts,\n sumFileSizes,\n writeChunkManifest\n} from \"./scrap-chunks.js\"\nimport type { ScrapTemplate } from \"./scrap-common.js\"\nimport { buildScrapTemplate, runDockerExecCapture, runShell, shellEscape } from \"./scrap-common.js\"\nimport type { SessionManifest } from \"./scrap-session-manifest.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\ntype SessionRepoInfo = SessionManifest[\"repo\"]\n\ntype SessionExportContext = {\n readonly fs: Fs\n readonly path: PathService\n readonly resolved: string\n readonly config: ProjectConfig\n readonly template: ScrapTemplate\n readonly snapshotId: string\n readonly snapshotDir: string\n}\n\ntype HostEnvArtifacts = {\n readonly envGlobalFile: string | null\n readonly envProjectFile: string | null\n}\n\ntype SessionManifestInput = {\n readonly repo: SessionRepoInfo\n readonly patchChunksPath: string\n readonly codexChunksPath: string\n readonly codexSharedChunksPath: string\n readonly hostEnv: HostEnvArtifacts\n readonly rebuildCommands: ReadonlyArray<string>\n}\n\nconst formatSnapshotId = (now: Date): string => {\n const year = String(now.getUTCFullYear()).padStart(4, \"0\")\n const month = String(now.getUTCMonth() + 1).padStart(2, \"0\")\n const day = String(now.getUTCDate()).padStart(2, \"0\")\n const hour = String(now.getUTCHours()).padStart(2, \"0\")\n const min = String(now.getUTCMinutes()).padStart(2, \"0\")\n const sec = String(now.getUTCSeconds()).padStart(2, \"0\")\n return `${year}${month}${day}T${hour}${min}${sec}Z`\n}\n\nconst loadSessionExportContext = (\n command: ScrapExportCommand\n): Effect.Effect<SessionExportContext, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const template = buildScrapTemplate(config)\n\n const archiveRootAbs = resolvePathFromCwd(path, resolved, command.archivePath)\n const snapshotId = formatSnapshotId(new Date())\n const snapshotDir = path.join(archiveRootAbs, snapshotId)\n yield* _(fs.makeDirectory(snapshotDir, { recursive: true }))\n\n return { fs, path, resolved, config, template, snapshotId, snapshotDir }\n })\n\nconst captureRepoInfo = (\n ctx: SessionExportContext\n): Effect.Effect<SessionRepoInfo, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const base = `set -e; cd ${targetDir};`\n const capture = (label: string, cmd: string) =>\n runDockerExecCapture(ctx.resolved, label, ctx.template.containerName, `${base} ${cmd}`, ctx.template.sshUser)\n .pipe(\n Effect.map((value) => value.trim())\n )\n\n const safe = targetDir\n const head = yield* _(capture(\"scrap session rev-parse\", `git -c safe.directory=${safe} rev-parse HEAD`))\n const branch = yield* _(\n capture(\"scrap session branch\", `git -c safe.directory=${safe} rev-parse --abbrev-ref HEAD`)\n )\n const originUrl = yield* _(capture(\"scrap session origin\", `git -c safe.directory=${safe} remote get-url origin`))\n return { originUrl, head, branch }\n })\n\nconst exportHostEnvFiles = (\n ctx: SessionExportContext\n): Effect.Effect<HostEnvArtifacts, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const copyIfExists = (srcAbs: string, dstName: string) =>\n Effect.gen(function*(__) {\n const exists = yield* __(ctx.fs.exists(srcAbs))\n if (!exists) {\n return null\n }\n const contents = yield* __(ctx.fs.readFileString(srcAbs))\n const dstAbs = ctx.path.join(ctx.snapshotDir, dstName)\n yield* __(ctx.fs.writeFileString(dstAbs, contents))\n return dstName\n })\n\n const envGlobalAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envGlobalPath)\n const envProjectAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envProjectPath)\n\n const envGlobalFile = yield* _(copyIfExists(envGlobalAbs, \"env-global.env\"))\n const envProjectFile = yield* _(copyIfExists(envProjectAbs, \"env-project.env\"))\n\n return { envGlobalFile, envProjectFile }\n })\n\nconst detectRebuildCommands = (\n ctx: SessionExportContext\n): Effect.Effect<ReadonlyArray<string>, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const script = [\n \"set -e\",\n `cd ${targetDir}`,\n // Priority: pnpm > npm > yarn. Keep commands deterministic and rebuildable.\n \"if [ -f pnpm-lock.yaml ]; then echo 'pnpm install --frozen-lockfile'; exit 0; fi\",\n \"if [ -f package-lock.json ]; then echo 'npm ci'; exit 0; fi\",\n \"if [ -f yarn.lock ]; then echo 'yarn install --frozen-lockfile'; exit 0; fi\",\n \"exit 0\"\n ].join(\"; \")\n\n const output = yield* _(\n runDockerExecCapture(\n ctx.resolved,\n \"scrap session detect rebuild\",\n ctx.template.containerName,\n script,\n ctx.template.sshUser\n )\n )\n\n const command = output.trim()\n return command.length > 0 ? [command] : []\n })\n\nconst exportWorktreePatchChunks = (\n ctx: SessionExportContext\n): Effect.Effect<string, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const patchAbs = ctx.path.join(ctx.snapshotDir, \"worktree.patch.gz\")\n const patchPartsPrefix = `${patchAbs}.part`\n yield* _(removeChunkArtifacts(ctx.fs, ctx.path, patchAbs))\n\n const patchInner = [\n \"set -e\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"TMP_INDEX=$(mktemp)\",\n \"trap 'rm -f \\\"$TMP_INDEX\\\"' EXIT\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" read-tree HEAD\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" add -A\",\n \"GIT_INDEX_FILE=\\\"$TMP_INDEX\\\" git -c safe.directory=\\\"$SAFE\\\" diff --cached --binary --no-color\"\n ].join(\"; \")\n\n const patchPipeline = [\n `docker exec -u ${shellEscape(ctx.template.sshUser)} ${shellEscape(ctx.template.containerName)} sh -c ${\n shellEscape(patchInner)\n }`,\n \"gzip -c\",\n `split -b ${maxGitBlobBytes} -d -a 5 - ${shellEscape(patchPartsPrefix)}`\n ].join(\" | \")\n const patchScript = `set -e; bash -o pipefail -c ${shellEscape(patchPipeline)}`\n yield* _(runShell(ctx.resolved, \"scrap export session patch\", patchScript))\n\n const partsAbs = yield* _(listChunkParts(ctx.fs, ctx.path, patchAbs))\n const totalSize = yield* _(sumFileSizes(ctx.fs, partsAbs))\n return yield* _(writeChunkManifest(ctx.fs, ctx.path, patchAbs, totalSize, partsAbs))\n })\n\nconst exportContainerDirChunks = (\n ctx: SessionExportContext,\n srcDir: string,\n archiveName: string,\n label: string\n): Effect.Effect<string, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const archiveAbs = ctx.path.join(ctx.snapshotDir, archiveName)\n const partsPrefix = `${archiveAbs}.part`\n yield* _(removeChunkArtifacts(ctx.fs, ctx.path, archiveAbs))\n\n const inner = [\n \"set -e\",\n `SRC=${shellEscape(srcDir)}`,\n \"mkdir -p \\\"$SRC\\\"\",\n \"tar czf - -C \\\"$SRC\\\" .\"\n ].join(\"; \")\n\n const archivePipeline = [\n `docker exec -u ${shellEscape(ctx.template.sshUser)} ${shellEscape(ctx.template.containerName)} sh -c ${\n shellEscape(inner)\n }`,\n `split -b ${maxGitBlobBytes} -d -a 5 - ${shellEscape(partsPrefix)}`\n ].join(\" | \")\n const script = `set -e; bash -o pipefail -c ${shellEscape(archivePipeline)}`\n yield* _(runShell(ctx.resolved, label, script))\n\n const partsAbs = yield* _(listChunkParts(ctx.fs, ctx.path, archiveAbs))\n const totalSize = yield* _(sumFileSizes(ctx.fs, partsAbs))\n return yield* _(writeChunkManifest(ctx.fs, ctx.path, archiveAbs, totalSize, partsAbs))\n })\n\nconst writeSessionManifest = (\n ctx: SessionExportContext,\n input: SessionManifestInput\n): Effect.Effect<void, PlatformError> =>\n Effect.gen(function*(_) {\n const manifest: SessionManifest = {\n schemaVersion: 1,\n mode: \"session\",\n snapshotId: ctx.snapshotId,\n createdAtUtc: new Date().toISOString(),\n repo: input.repo,\n artifacts: {\n worktreePatchChunks: ctx.path.basename(input.patchChunksPath),\n codexChunks: ctx.path.basename(input.codexChunksPath),\n codexSharedChunks: ctx.path.basename(input.codexSharedChunksPath),\n envGlobalFile: input.hostEnv.envGlobalFile,\n envProjectFile: input.hostEnv.envProjectFile\n },\n rebuild: {\n commands: [...input.rebuildCommands]\n }\n }\n const manifestPath = ctx.path.join(ctx.snapshotDir, \"manifest.json\")\n yield* _(ctx.fs.writeFileString(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`))\n }).pipe(Effect.asVoid)\n\nexport const exportScrapSession = (\n command: ScrapExportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const ctx = yield* _(loadSessionExportContext(command))\n yield* _(\n Effect.log(\n [\n `Project: ${ctx.resolved}`,\n \"Mode: session\",\n `Container: ${ctx.template.containerName}`,\n `Workspace: ${ctx.template.targetDir}`,\n `Output: ${ctx.snapshotDir}`\n ].join(\"\\n\")\n )\n )\n\n const repo = yield* _(captureRepoInfo(ctx))\n const hostEnv = yield* _(exportHostEnvFiles(ctx))\n const rebuildCommands = yield* _(detectRebuildCommands(ctx))\n\n const patchChunksPath = yield* _(exportWorktreePatchChunks(ctx))\n const codexChunksPath = yield* _(\n exportContainerDirChunks(ctx, ctx.template.codexHome, \"codex.tar.gz\", \"scrap export session codex\")\n )\n\n const codexSharedHome = `${ctx.template.codexHome}-shared`\n const codexSharedChunksPath = yield* _(\n exportContainerDirChunks(ctx, codexSharedHome, \"codex-shared.tar.gz\", \"scrap export session codex-shared\")\n )\n\n yield* _(\n writeSessionManifest(ctx, {\n repo,\n patchChunksPath,\n codexChunksPath,\n codexSharedChunksPath,\n hostEnv,\n rebuildCommands\n })\n )\n yield* _(Effect.log(\"Scrap session export complete.\"))\n }).pipe(Effect.asVoid)\n","import * as ParseResult from \"@effect/schema/ParseResult\"\nimport * as Schema from \"@effect/schema/Schema\"\nimport * as TreeFormatter from \"@effect/schema/TreeFormatter\"\nimport { Effect, Either } from \"effect\"\n\nimport type { ScrapArchiveInvalidError } from \"../shell/errors.js\"\nimport { ScrapArchiveInvalidError as ScrapArchiveInvalidErrorClass } from \"../shell/errors.js\"\n\nexport type SessionManifest = {\n readonly schemaVersion: 1\n readonly mode: \"session\"\n readonly snapshotId: string\n readonly createdAtUtc: string\n readonly repo: {\n readonly originUrl: string\n readonly head: string\n readonly branch: string\n }\n readonly artifacts: {\n readonly worktreePatchChunks: string\n readonly codexChunks: string\n readonly codexSharedChunks: string\n readonly envGlobalFile: string | null\n readonly envProjectFile: string | null\n }\n readonly rebuild: {\n readonly commands: ReadonlyArray<string>\n }\n}\n\nconst SessionManifestSchema = Schema.Struct({\n schemaVersion: Schema.Literal(1),\n mode: Schema.Literal(\"session\"),\n snapshotId: Schema.String,\n createdAtUtc: Schema.String,\n repo: Schema.Struct({\n originUrl: Schema.String,\n head: Schema.String,\n branch: Schema.String\n }),\n artifacts: Schema.Struct({\n worktreePatchChunks: Schema.String,\n codexChunks: Schema.String,\n codexSharedChunks: Schema.String,\n envGlobalFile: Schema.optionalWith(Schema.Union(Schema.String, Schema.Null), { default: () => null }),\n envProjectFile: Schema.optionalWith(Schema.Union(Schema.String, Schema.Null), { default: () => null })\n }),\n rebuild: Schema.optionalWith(\n Schema.Struct({\n commands: Schema.Array(Schema.String)\n }),\n { default: () => ({ commands: [] }) }\n )\n})\n\nconst SessionManifestJsonSchema = Schema.parseJson(SessionManifestSchema)\n\nexport const decodeSessionManifest = (\n manifestPath: string,\n input: string\n): Effect.Effect<SessionManifest, ScrapArchiveInvalidError> =>\n Either.match(ParseResult.decodeUnknownEither(SessionManifestJsonSchema)(input), {\n onLeft: (issue) =>\n Effect.fail(\n new ScrapArchiveInvalidErrorClass({\n path: manifestPath,\n message: TreeFormatter.formatIssueSync(issue)\n })\n ),\n onRight: (value) => Effect.succeed(value)\n })\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { ProjectConfig, ScrapImportCommand } from \"../core/domain.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport { ScrapArchiveNotFoundError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\nimport { resolvePathFromCwd } from \"./path-helpers.js\"\nimport { decodeChunkManifest } from \"./scrap-chunks.js\"\nimport {\n buildScrapTemplate,\n eitherToEffect,\n ensureSafeScrapImportWipe,\n runDockerExec,\n runShell,\n shellEscape\n} from \"./scrap-common.js\"\nimport { deriveScrapWorkspaceRelativePath } from \"./scrap-path.js\"\nimport { decodeSessionManifest, type SessionManifest } from \"./scrap-session-manifest.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\ntype SessionImportContext = {\n readonly fs: Fs\n readonly path: PathService\n readonly resolved: string\n readonly config: ProjectConfig\n readonly template: ReturnType<typeof buildScrapTemplate>\n readonly snapshotDir: string\n readonly manifest: SessionManifest\n}\n\nconst resolveSessionSnapshotDir = (\n fs: Fs,\n path: PathService,\n projectDir: string,\n archivePath: string\n): Effect.Effect<string, ScrapArchiveNotFoundError | PlatformError> =>\n Effect.gen(function*(_) {\n const baseAbs = resolvePathFromCwd(path, projectDir, archivePath)\n const exists = yield* _(fs.exists(baseAbs))\n if (!exists) {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n }\n\n const baseStat = yield* _(fs.stat(baseAbs))\n if (baseStat.type !== \"Directory\") {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n }\n\n const direct = yield* _(fs.exists(path.join(baseAbs, \"manifest.json\")))\n if (direct) {\n return baseAbs\n }\n\n const entries = yield* _(fs.readDirectory(baseAbs))\n const sorted = entries.toSorted((a, b) => b.localeCompare(a))\n for (const entry of sorted) {\n const dirAbs = path.join(baseAbs, entry)\n const stat = yield* _(fs.stat(dirAbs))\n if (stat.type !== \"Directory\") {\n continue\n }\n const hasManifest = yield* _(fs.exists(path.join(dirAbs, \"manifest.json\")))\n if (hasManifest) {\n return dirAbs\n }\n }\n\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: baseAbs })))\n })\n\nconst loadSessionImportContext = (\n command: ScrapImportCommand\n): Effect.Effect<SessionImportContext, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const template = buildScrapTemplate(config)\n\n const relative = yield* _(eitherToEffect(deriveScrapWorkspaceRelativePath(template.sshUser, template.targetDir)))\n yield* _(ensureSafeScrapImportWipe(command.wipe, template, relative))\n\n const snapshotDir = yield* _(resolveSessionSnapshotDir(fs, path, resolved, command.archivePath))\n const manifestPath = path.join(snapshotDir, \"manifest.json\")\n const manifestText = yield* _(fs.readFileString(manifestPath))\n const manifest = yield* _(decodeSessionManifest(manifestPath, manifestText))\n\n return { fs, path, resolved, config, template, snapshotDir, manifest }\n })\n\nconst resolveSnapshotPartsAbs = (\n ctx: SessionImportContext,\n chunksFile: string\n): Effect.Effect<ReadonlyArray<string>, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const chunksAbs = ctx.path.join(ctx.snapshotDir, chunksFile)\n const chunksText = yield* _(ctx.fs.readFileString(chunksAbs))\n const chunks = yield* _(decodeChunkManifest(chunksAbs, chunksText))\n const partsAbs = chunks.parts.map((part) => ctx.path.join(ctx.snapshotDir, part))\n for (const partAbs of partsAbs) {\n const partExists = yield* _(ctx.fs.exists(partAbs))\n if (!partExists) {\n return yield* _(Effect.fail(new ScrapArchiveNotFoundError({ path: partAbs })))\n }\n }\n return partsAbs\n })\n\nconst restoreHostEnvFiles = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const restore = (snapshotFileName: string | null | undefined, dstAbs: string, label: string) =>\n Effect.gen(function*(__) {\n const name = snapshotFileName?.trim() ?? \"\"\n if (name.length === 0 || name === \"null\") {\n return\n }\n\n const srcAbs = ctx.path.join(ctx.snapshotDir, name)\n const exists = yield* __(ctx.fs.exists(srcAbs))\n if (!exists) {\n return\n }\n\n const contents = yield* __(ctx.fs.readFileString(srcAbs))\n yield* __(ctx.fs.makeDirectory(ctx.path.dirname(dstAbs), { recursive: true }))\n yield* __(ctx.fs.writeFileString(dstAbs, contents))\n yield* __(Effect.log(`Restored ${label}: ${dstAbs}`))\n })\n\n const envGlobalAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envGlobalPath)\n const envProjectAbs = resolvePathFromCwd(ctx.path, ctx.resolved, ctx.config.template.envProjectPath)\n\n yield* _(restore(ctx.manifest.artifacts.envGlobalFile, envGlobalAbs, \"env-global\"))\n yield* _(restore(ctx.manifest.artifacts.envProjectFile, envProjectAbs, \"env-project\"))\n }).pipe(Effect.asVoid)\n\nconst prepareRepoForImport = (\n ctx: SessionImportContext,\n wipe: boolean\n): Effect.Effect<void, ScrapError, ScrapRequirements> => {\n const targetDir = shellEscape(ctx.template.targetDir)\n const wipeLine = wipe ? `rm -rf ${targetDir}` : \":\"\n const gitDir = `${ctx.template.targetDir}/.git`\n const prepScript = [\n \"set -e\",\n wipeLine,\n `mkdir -p ${targetDir}`,\n `if [ ! -d ${shellEscape(gitDir)} ]; then`,\n ` PARENT=$(dirname ${targetDir})`,\n \" mkdir -p \\\"$PARENT\\\"\",\n ` git clone ${shellEscape(ctx.manifest.repo.originUrl)} ${targetDir}`,\n \"fi\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"git -c safe.directory=\\\"$SAFE\\\" fetch --all --prune\",\n `git -c safe.directory=\"$SAFE\" checkout --detach ${shellEscape(ctx.manifest.repo.head)}`,\n `git -c safe.directory=\"$SAFE\" reset --hard ${shellEscape(ctx.manifest.repo.head)}`,\n \"git -c safe.directory=\\\"$SAFE\\\" clean -fd\",\n // Remove common heavy caches that are easy to rebuild with internet access.\n \"find . -name node_modules -type d -prune -exec rm -rf '{}' + 2>/dev/null || true\"\n ].join(\"\\n\")\n\n return runDockerExec(\n ctx.resolved,\n \"scrap session prepare repo\",\n ctx.template.containerName,\n prepScript,\n ctx.template.sshUser\n )\n}\n\nconst applyWorktreePatch = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const patchPartsAbs = yield* _(resolveSnapshotPartsAbs(ctx, ctx.manifest.artifacts.worktreePatchChunks))\n const patchCatArgs = patchPartsAbs.map((p) => shellEscape(p)).join(\" \")\n const targetDir = shellEscape(ctx.template.targetDir)\n const applyInner = [\n \"set -e\",\n `cd ${targetDir}`,\n `SAFE=${targetDir}`,\n \"git -c safe.directory=\\\"$SAFE\\\" apply --allow-empty --binary --whitespace=nowarn -\"\n ].join(\"; \")\n const applyScript = [\n \"set -e\",\n `cat ${patchCatArgs} | gzip -dc | docker exec -i -u ${shellEscape(ctx.template.sshUser)} ${\n shellEscape(\n ctx.template.containerName\n )\n } sh -c ${\n shellEscape(\n applyInner\n )\n }`\n ].join(\"; \")\n yield* _(runShell(ctx.resolved, \"scrap session apply patch\", applyScript))\n }).pipe(Effect.asVoid)\n\nconst restoreTarChunksIntoContainerDir = (\n ctx: SessionImportContext,\n dst: string,\n chunksFile: string,\n label: string\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const partsAbs = yield* _(resolveSnapshotPartsAbs(ctx, chunksFile))\n const catArgs = partsAbs.map((partAbs) => shellEscape(partAbs)).join(\" \")\n const inner = [\n \"set -e\",\n `DST=${shellEscape(dst)}`,\n \"mkdir -p \\\"$DST\\\"\",\n // Clearing contents instead of removing the directory keeps mount points (like shared auth volumes) intact.\n \"find \\\"$DST\\\" -mindepth 1 -maxdepth 1 -exec rm -rf '{}' + 2>/dev/null || true\",\n \"tar xzf - -C \\\"$DST\\\"\"\n ].join(\"; \")\n const script = [\n \"set -e\",\n `cat ${catArgs} | docker exec -i -u ${shellEscape(ctx.template.sshUser)} ${\n shellEscape(\n ctx.template.containerName\n )\n } sh -c ${shellEscape(inner)}`\n ].join(\"; \")\n yield* _(runShell(ctx.resolved, label, script))\n }).pipe(Effect.asVoid)\n\nconst runRebuildCommands = (ctx: SessionImportContext): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const targetDir = shellEscape(ctx.template.targetDir)\n const commands = ctx.manifest.rebuild.commands\n if (commands.length === 0) {\n return\n }\n\n for (const command of commands) {\n const trimmed = command.trim()\n if (trimmed.length === 0) {\n continue\n }\n yield* _(Effect.log(`Rebuilding: ${trimmed}`))\n const script = `set -e; cd ${targetDir}; ${trimmed}`\n yield* _(\n runDockerExec(ctx.resolved, \"scrap session rebuild\", ctx.template.containerName, script, ctx.template.sshUser)\n )\n }\n }).pipe(Effect.asVoid)\n\nexport const importScrapSession = (\n command: ScrapImportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n const ctx = yield* _(loadSessionImportContext(command))\n yield* _(\n Effect.log(\n [\n `Project: ${ctx.resolved}`,\n \"Mode: session\",\n `Snapshot: ${ctx.snapshotDir}`,\n `Container: ${ctx.template.containerName}`,\n `Workspace: ${ctx.template.targetDir}`,\n `Repo: ${ctx.manifest.repo.originUrl} @ ${ctx.manifest.repo.head}`\n ].join(\"\\n\")\n )\n )\n\n yield* _(restoreHostEnvFiles(ctx))\n yield* _(prepareRepoForImport(ctx, command.wipe))\n yield* _(applyWorktreePatch(ctx))\n\n yield* _(\n restoreTarChunksIntoContainerDir(\n ctx,\n ctx.template.codexHome,\n ctx.manifest.artifacts.codexChunks,\n \"scrap session restore codex\"\n )\n )\n\n const codexSharedHome = `${ctx.template.codexHome}-shared`\n yield* _(\n restoreTarChunksIntoContainerDir(\n ctx,\n codexSharedHome,\n ctx.manifest.artifacts.codexSharedChunks,\n \"scrap session restore codex-shared\"\n )\n )\n\n yield* _(runRebuildCommands(ctx))\n yield* _(Effect.log(\"Scrap session import complete.\"))\n }).pipe(Effect.asVoid)\n","import { Effect } from \"effect\"\n\nimport type { ScrapExportCommand, ScrapImportCommand } from \"../core/domain.js\"\nimport { ensureDockerDaemonAccess } from \"../shell/docker.js\"\nimport { exportScrapSession, importScrapSession } from \"./scrap-session.js\"\nimport type { ScrapError, ScrapRequirements } from \"./scrap-types.js\"\n\nexport { deriveScrapWorkspaceRelativePath } from \"./scrap-path.js\"\nexport type { ScrapError } from \"./scrap-types.js\"\n\nexport const exportScrap = (\n command: ScrapExportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n yield* _(exportScrapSession(command))\n }).pipe(Effect.asVoid)\n\nexport const importScrap = (\n command: ScrapImportCommand\n): Effect.Effect<void, ScrapError, ScrapRequirements> =>\n Effect.gen(function*(_) {\n yield* _(ensureDockerDaemonAccess(process.cwd()))\n yield* _(importScrapSession(command))\n }).pipe(Effect.asVoid)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type { FileSystem as Fs } from \"@effect/platform/FileSystem\"\nimport type { Path as PathService } from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { SessionsKillCommand, SessionsListCommand, SessionsLogsCommand } from \"../core/domain.js\"\nimport { runCommandCapture, runCommandWithExitCodes } from \"../shell/command-runner.js\"\nimport { readProjectConfig } from \"../shell/config.js\"\nimport type { ConfigDecodeError, ConfigNotFoundError } from \"../shell/errors.js\"\nimport { CommandFailedError } from \"../shell/errors.js\"\nimport { resolveBaseDir } from \"../shell/paths.js\"\n\ntype SessionsError = CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError\ntype SessionsRequirements = Fs | PathService | CommandExecutor.CommandExecutor\n\nconst dockerOk = [0]\nconst baselineFile = \"/run/docker-git/terminal-baseline.pids\"\n\nconst buildFilteredPs = (mode: \"tty\" | \"bg\"): string =>\n `ps -eo pid,tty,etime,cmd --sort=etime | awk -v base=\"$BASELINE_FILE\" -v mode=\"${mode}\" 'BEGIN { while ((getline < base) > 0) baseline[$1]=1 } NR==1 {print; next} { pid=$1; tty=$2; cmd=$4; for (i=5;i<=NF;i++) cmd=cmd \" \" $i; if (baseline[pid]) next; if (cmd ~ /^sshd/ || cmd ~ /^-?bash/ || cmd ~ /^bash/ || cmd ~ /^sh/ || cmd ~ /^zsh/ || cmd ~ /^fish/ || cmd ~ /^ps / || cmd ~ /^awk / || cmd ~ /^grep / || cmd ~ /^tail / || cmd ~ /^who /) next; if (mode==\"tty\" && tty==\"?\") next; if (mode==\"bg\" && tty!=\"?\") next; print; found=1 } END { if (!found) print \"(none)\" }'`\n\nconst makeDockerExecSpec = (containerName: string, args: ReadonlyArray<string>) => ({\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"exec\", containerName, ...args]\n})\n\nconst runDockerExecCapture = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n makeDockerExecSpec(containerName, args),\n dockerOk,\n (exitCode) => new CommandFailedError({ command: \"docker exec\", exitCode })\n )\n\nconst runDockerExec = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n makeDockerExecSpec(containerName, args),\n dockerOk,\n (exitCode) => new CommandFailedError({ command: \"docker exec\", exitCode })\n )\n\nconst loadProjectContainer = (\n projectDir: string\n): Effect.Effect<\n { readonly projectDir: string; readonly containerName: string },\n ConfigNotFoundError | ConfigDecodeError | PlatformError,\n Fs | PathService\n> =>\n Effect.gen(function*(_) {\n const { resolved } = yield* _(resolveBaseDir(projectDir))\n const config = yield* _(readProjectConfig(resolved))\n return { projectDir: resolved, containerName: config.template.containerName }\n })\n\nconst loadAndLogContainer = (\n projectDir: string\n): Effect.Effect<\n { readonly projectDir: string; readonly containerName: string },\n SessionsError,\n Fs | PathService\n> =>\n Effect.gen(function*(_) {\n const info = yield* _(loadProjectContainer(projectDir))\n yield* _(Effect.log(`Project: ${info.projectDir}`))\n yield* _(Effect.log(`Container: ${info.containerName}`))\n return info\n })\n\nconst logCommandOutput = (output: string): Effect.Effect<void> =>\n output.trim().length === 0 ? Effect.log(\"(no output)\") : Effect.log(output.trimEnd())\n\nconst runDockerExecCaptureLogged = (\n containerName: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, SessionsError, CommandExecutor.CommandExecutor> =>\n Effect.flatMap(runDockerExecCapture(containerName, args), logCommandOutput)\n\nconst runSessionScript = (\n projectDir: string,\n args: ReadonlyArray<string>\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n Effect.gen(function*(_) {\n const { containerName } = yield* _(loadAndLogContainer(projectDir))\n yield* _(runDockerExecCaptureLogged(containerName, [\"bash\", \"-lc\", ...args]))\n })\n\n// CHANGE: run terminal session scripts under bash\n// WHY: Ubuntu /bin/sh (dash) fails on /etc/profile.d/zz-prompt.sh when run as a login shell\n// QUOTE(ТЗ): \"docker exec failed with exit code 2\"\n// REF: user-request-2026-02-05-sessions-bash\n// SOURCE: n/a\n// FORMAT THEOREM: ∀cmd: shell(cmd)=bash → compatible(cmd, /etc/profile.d/zz-prompt.sh)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, CommandExecutor>\n// INVARIANT: shell for scripts is deterministic (bash)\n// COMPLEXITY: O(1)\nconst listSessionsScriptAll = [\n \"echo \\\"TTY sessions (who -u)\\\"\",\n \"who -u 2>/dev/null || true\",\n \"echo \\\"\\\"\",\n \"echo \\\"TTY processes\\\"\",\n \"ps -eo pid,tty,etime,cmd --sort=etime | awk 'NR==1 {print; next} $2 != \\\"?\\\" {print; found=1} END { if (!found) print \\\"(none)\\\" }'\",\n \"echo \\\"\\\"\",\n \"echo \\\"Background processes (no TTY)\\\"\",\n \"ps -eo pid,tty,etime,cmd --sort=etime | awk 'NR==1 {print; next} $2 == \\\"?\\\" {print; found=1} END { if (!found) print \\\"(none)\\\" }'\"\n].join(\"; \")\n\n// CHANGE: hide default/system processes from sessions list by default\n// WHY: reduce noise from sshd/login shells and baseline tasks\n// QUOTE(ТЗ): \"Можно ли запомнить какие процессы изначально запущены и просто их не отображать как терминалы?\"\n// REF: user-request-2026-02-05-sessions-baseline\n// SOURCE: n/a\n// FORMAT THEOREM: ∀p: default(p) ∧ ¬includeDefault → hidden(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, CommandExecutor>\n// INVARIANT: includeDefault=true preserves full list\n// COMPLEXITY: O(n) where n = number of processes\nconst buildListSessionsScript = (includeDefault: boolean): string => {\n if (includeDefault) {\n return listSessionsScriptAll\n }\n\n return [\n `BASELINE_FILE=\"${baselineFile}\"`,\n \"if [ ! -f \\\"$BASELINE_FILE\\\" ]; then BASELINE_FILE=\\\"/dev/null\\\"; fi\",\n \"echo \\\"TTY sessions (who -u)\\\"\",\n \"who -u 2>/dev/null || true\",\n \"echo \\\"\\\"\",\n \"echo \\\"TTY processes (user only)\\\"\",\n buildFilteredPs(\"tty\"),\n \"echo \\\"\\\"\",\n \"echo \\\"Background processes (user only)\\\"\",\n buildFilteredPs(\"bg\")\n ].join(\"; \")\n}\n\nconst logsScript = [\n \"pid=\\\"$1\\\"\",\n \"lines=\\\"$2\\\"\",\n \"if [ -z \\\"$pid\\\" ]; then echo \\\"Missing pid\\\"; exit 2; fi\",\n \"if [ -z \\\"$lines\\\" ]; then lines=200; fi\",\n \"if [ ! -d \\\"/proc/$pid\\\" ]; then echo \\\"PID $pid not found\\\"; exit 3; fi\",\n \"resolve_log() {\",\n \" for fd in 1 2; do\",\n \" target=$(readlink -f \\\"/proc/$pid/fd/$fd\\\" 2>/dev/null || true)\",\n \" if [ -n \\\"$target\\\" ] && [ -f \\\"$target\\\" ]; then\",\n \" echo \\\"$target\\\"\",\n \" return 0\",\n \" fi\",\n \" done\",\n \" return 1\",\n \"}\",\n \"logfile=$(resolve_log || true)\",\n \"if [ -z \\\"$logfile\\\" ]; then\",\n \" echo \\\"No file-backed stdout/stderr for PID $pid\\\"\",\n \" exit 4\",\n \"fi\",\n \"echo \\\"Log file: $logfile\\\"\",\n \"tail -n \\\"$lines\\\" \\\"$logfile\\\" 2>&1\"\n].join(\"; \")\n\n// CHANGE: list active terminal sessions inside a docker-git container\n// WHY: expose container TTY/background processes from CLI\n// QUOTE(ТЗ): \"CLI команду которая из докера вернёт запущенные терминал сессии\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: sessions(p) -> output(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: project config resolves container name deterministically\n// COMPLEXITY: O(n) where n = number of processes\nexport const listTerminalSessions = (\n command: SessionsListCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n runSessionScript(command.projectDir, [buildListSessionsScript(command.includeDefault)])\n\n// CHANGE: stop a background process inside a docker-git container\n// WHY: allow shutting down long-running terminal jobs from CLI\n// QUOTE(ТЗ): \"иметь возможность его отключать\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall pid: kill(pid) -> stopped(pid)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: kill targets a single PID\n// COMPLEXITY: O(1)\nexport const killTerminalProcess = (\n command: SessionsKillCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n Effect.gen(function*(_) {\n const { containerName } = yield* _(loadAndLogContainer(command.projectDir))\n yield* _(runDockerExec(containerName, [\"kill\", \"-TERM\", String(command.pid)]))\n yield* _(Effect.log(`Sent SIGTERM to PID ${command.pid}`))\n })\n\n// CHANGE: tail stdout/stderr logs for a container process\n// WHY: expose background job logs without manual docker exec\n// QUOTE(ТЗ): \"иметь возможность его просматривать Что пишет он в терминал лог\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall pid: logs(pid) -> output(pid)\n// PURITY: SHELL\n// EFFECT: Effect<void, SessionsError, FileSystem | Path | CommandExecutor>\n// INVARIANT: uses file-backed stdout/stderr when present\n// COMPLEXITY: O(n) where n = log lines\nexport const tailTerminalLogs = (\n command: SessionsLogsCommand\n): Effect.Effect<void, SessionsError, SessionsRequirements> =>\n runSessionScript(command.projectDir, [\n logsScript,\n \"--\",\n String(command.pid),\n String(command.lines)\n ])\n","import { Either } from \"effect\"\n\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport type { ParseError } from \"@effect-template/lib/core/domain\"\n\ninterface ValueOptionSpec {\n readonly flag: string\n readonly key:\n | \"repoUrl\"\n | \"repoRef\"\n | \"targetDir\"\n | \"sshPort\"\n | \"sshUser\"\n | \"containerName\"\n | \"serviceName\"\n | \"volumeName\"\n | \"secretsRoot\"\n | \"authorizedKeysPath\"\n | \"envGlobalPath\"\n | \"envProjectPath\"\n | \"codexAuthPath\"\n | \"codexHome\"\n | \"dockerNetworkMode\"\n | \"dockerSharedNetworkName\"\n | \"archivePath\"\n | \"scrapMode\"\n | \"label\"\n | \"gitTokenLabel\"\n | \"codexTokenLabel\"\n | \"claudeTokenLabel\"\n | \"token\"\n | \"scopes\"\n | \"message\"\n | \"outDir\"\n | \"projectDir\"\n | \"lines\"\n}\n\nconst valueOptionSpecs: ReadonlyArray<ValueOptionSpec> = [\n { flag: \"--repo-url\", key: \"repoUrl\" },\n { flag: \"--repo-ref\", key: \"repoRef\" },\n { flag: \"--branch\", key: \"repoRef\" },\n { flag: \"-b\", key: \"repoRef\" },\n { flag: \"--target-dir\", key: \"targetDir\" },\n { flag: \"--ssh-port\", key: \"sshPort\" },\n { flag: \"--ssh-user\", key: \"sshUser\" },\n { flag: \"--container-name\", key: \"containerName\" },\n { flag: \"--service-name\", key: \"serviceName\" },\n { flag: \"--volume-name\", key: \"volumeName\" },\n { flag: \"--secrets-root\", key: \"secretsRoot\" },\n { flag: \"--authorized-keys\", key: \"authorizedKeysPath\" },\n { flag: \"--env-global\", key: \"envGlobalPath\" },\n { flag: \"--env-project\", key: \"envProjectPath\" },\n { flag: \"--codex-auth\", key: \"codexAuthPath\" },\n { flag: \"--codex-home\", key: \"codexHome\" },\n { flag: \"--network-mode\", key: \"dockerNetworkMode\" },\n { flag: \"--shared-network\", key: \"dockerSharedNetworkName\" },\n { flag: \"--archive\", key: \"archivePath\" },\n { flag: \"--mode\", key: \"scrapMode\" },\n { flag: \"--label\", key: \"label\" },\n { flag: \"--git-token\", key: \"gitTokenLabel\" },\n { flag: \"--codex-token\", key: \"codexTokenLabel\" },\n { flag: \"--claude-token\", key: \"claudeTokenLabel\" },\n { flag: \"--token\", key: \"token\" },\n { flag: \"--scopes\", key: \"scopes\" },\n { flag: \"--message\", key: \"message\" },\n { flag: \"-m\", key: \"message\" },\n { flag: \"--out-dir\", key: \"outDir\" },\n { flag: \"--project-dir\", key: \"projectDir\" },\n { flag: \"--lines\", key: \"lines\" }\n]\n\nconst valueOptionSpecByFlag: ReadonlyMap<string, ValueOptionSpec> = new Map(\n valueOptionSpecs.map((spec) => [spec.flag, spec])\n)\n\ntype ValueKey = ValueOptionSpec[\"key\"]\n\nconst booleanFlagUpdaters: Readonly<Record<string, (raw: RawOptions) => RawOptions>> = {\n \"--up\": (raw) => ({ ...raw, up: true }),\n \"--no-up\": (raw) => ({ ...raw, up: false }),\n \"--ssh\": (raw) => ({ ...raw, openSsh: true }),\n \"--no-ssh\": (raw) => ({ ...raw, openSsh: false }),\n \"--force\": (raw) => ({ ...raw, force: true }),\n \"--force-env\": (raw) => ({ ...raw, forceEnv: true }),\n \"--mcp-playwright\": (raw) => ({ ...raw, enableMcpPlaywright: true }),\n \"--no-mcp-playwright\": (raw) => ({ ...raw, enableMcpPlaywright: false }),\n \"--wipe\": (raw) => ({ ...raw, wipe: true }),\n \"--no-wipe\": (raw) => ({ ...raw, wipe: false }),\n \"--web\": (raw) => ({ ...raw, authWeb: true }),\n \"--include-default\": (raw) => ({ ...raw, includeDefault: true })\n}\n\nconst valueFlagUpdaters: { readonly [K in ValueKey]: (raw: RawOptions, value: string) => RawOptions } = {\n repoUrl: (raw, value) => ({ ...raw, repoUrl: value }),\n repoRef: (raw, value) => ({ ...raw, repoRef: value }),\n targetDir: (raw, value) => ({ ...raw, targetDir: value }),\n sshPort: (raw, value) => ({ ...raw, sshPort: value }),\n sshUser: (raw, value) => ({ ...raw, sshUser: value }),\n containerName: (raw, value) => ({ ...raw, containerName: value }),\n serviceName: (raw, value) => ({ ...raw, serviceName: value }),\n volumeName: (raw, value) => ({ ...raw, volumeName: value }),\n secretsRoot: (raw, value) => ({ ...raw, secretsRoot: value }),\n authorizedKeysPath: (raw, value) => ({ ...raw, authorizedKeysPath: value }),\n envGlobalPath: (raw, value) => ({ ...raw, envGlobalPath: value }),\n envProjectPath: (raw, value) => ({ ...raw, envProjectPath: value }),\n codexAuthPath: (raw, value) => ({ ...raw, codexAuthPath: value }),\n codexHome: (raw, value) => ({ ...raw, codexHome: value }),\n dockerNetworkMode: (raw, value) => ({ ...raw, dockerNetworkMode: value }),\n dockerSharedNetworkName: (raw, value) => ({ ...raw, dockerSharedNetworkName: value }),\n archivePath: (raw, value) => ({ ...raw, archivePath: value }),\n scrapMode: (raw, value) => ({ ...raw, scrapMode: value }),\n label: (raw, value) => ({ ...raw, label: value }),\n gitTokenLabel: (raw, value) => ({ ...raw, gitTokenLabel: value }),\n codexTokenLabel: (raw, value) => ({ ...raw, codexTokenLabel: value }),\n claudeTokenLabel: (raw, value) => ({ ...raw, claudeTokenLabel: value }),\n token: (raw, value) => ({ ...raw, token: value }),\n scopes: (raw, value) => ({ ...raw, scopes: value }),\n message: (raw, value) => ({ ...raw, message: value }),\n outDir: (raw, value) => ({ ...raw, outDir: value }),\n projectDir: (raw, value) => ({ ...raw, projectDir: value }),\n lines: (raw, value) => ({ ...raw, lines: value })\n}\n\nexport const applyCommandBooleanFlag = (raw: RawOptions, token: string): RawOptions | null => {\n const updater = booleanFlagUpdaters[token]\n return updater ? updater(raw) : null\n}\n\nexport const applyCommandValueFlag = (\n raw: RawOptions,\n token: string,\n value: string\n): Either.Either<RawOptions, ParseError> => {\n const valueSpec = valueOptionSpecByFlag.get(token)\n if (valueSpec === undefined) {\n return Either.left({ _tag: \"UnknownOption\", option: token })\n }\n\n const update = valueFlagUpdaters[valueSpec.key]\n return Either.right(update(raw, value))\n}\n\ntype ParseRawOptionsStep =\n | { readonly _tag: \"ok\"; readonly raw: RawOptions; readonly nextIndex: number }\n | { readonly _tag: \"error\"; readonly error: ParseError }\n\nconst parseInlineValueToken = (\n raw: RawOptions,\n token: string\n): Either.Either<RawOptions, ParseError> | null => {\n const equalIndex = token.indexOf(\"=\")\n if (equalIndex <= 0 || !token.startsWith(\"-\")) {\n return null\n }\n\n const flag = token.slice(0, equalIndex)\n const inlineValue = token.slice(equalIndex + 1)\n return applyCommandValueFlag(raw, flag, inlineValue)\n}\n\nconst parseRawOptionsStep = (\n args: ReadonlyArray<string>,\n index: number,\n raw: RawOptions\n): ParseRawOptionsStep => {\n const token = args[index] ?? \"\"\n const inlineApplied = parseInlineValueToken(raw, token)\n if (inlineApplied !== null) {\n return Either.isLeft(inlineApplied)\n ? { _tag: \"error\", error: inlineApplied.left }\n : { _tag: \"ok\", raw: inlineApplied.right, nextIndex: index + 1 }\n }\n\n const booleanApplied = applyCommandBooleanFlag(raw, token)\n if (booleanApplied !== null) {\n return { _tag: \"ok\", raw: booleanApplied, nextIndex: index + 1 }\n }\n\n if (!token.startsWith(\"-\")) {\n return { _tag: \"error\", error: { _tag: \"UnexpectedArgument\", value: token } }\n }\n\n const value = args[index + 1]\n if (value === undefined) {\n return { _tag: \"error\", error: { _tag: \"MissingOptionValue\", option: token } }\n }\n\n const nextRaw = applyCommandValueFlag(raw, token, value)\n return Either.isLeft(nextRaw)\n ? { _tag: \"error\", error: nextRaw.left }\n : { _tag: \"ok\", raw: nextRaw.right, nextIndex: index + 2 }\n}\n\nexport const parseRawOptions = (args: ReadonlyArray<string>): Either.Either<RawOptions, ParseError> => {\n let index = 0\n let raw: RawOptions = {}\n\n while (index < args.length) {\n const step = parseRawOptionsStep(args, index, raw)\n if (step._tag === \"error\") {\n return Either.left(step.error)\n }\n raw = step.raw\n index = step.nextIndex\n }\n\n return Either.right(raw)\n}\n\nexport { type RawOptions } from \"@effect-template/lib/core/command-options\"\n","import { Either } from \"effect\"\n\nimport { deriveRepoPathParts, type ParseError, resolveRepoInput } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions, type RawOptions } from \"./parser-options.js\"\n\ntype PositionalRepo = {\n readonly positionalRepoUrl: string | undefined\n readonly restArgs: ReadonlyArray<string>\n}\n\nexport const resolveWorkspaceRepoPath = (\n resolvedRepo: ReturnType<typeof resolveRepoInput>\n): string => {\n const baseParts = deriveRepoPathParts(resolvedRepo.repoUrl).pathParts\n const projectParts = resolvedRepo.workspaceSuffix ? [...baseParts, resolvedRepo.workspaceSuffix] : baseParts\n return projectParts.join(\"/\")\n}\n\nexport const splitPositionalRepo = (args: ReadonlyArray<string>): PositionalRepo => {\n const first = args[0]\n const positionalRepoUrl = first !== undefined && !first.startsWith(\"-\") ? first : undefined\n const restArgs = positionalRepoUrl ? args.slice(1) : args\n return { positionalRepoUrl, restArgs }\n}\n\nexport const parseProjectDirWithOptions = (\n args: ReadonlyArray<string>,\n defaultProjectDir: string = \".\"\n): Either.Either<{ readonly projectDir: string; readonly raw: RawOptions }, ParseError> =>\n Either.gen(function*(_) {\n const { positionalRepoUrl, restArgs } = splitPositionalRepo(args)\n const raw = yield* _(parseRawOptions(restArgs))\n const rawRepoUrl = raw.repoUrl ?? positionalRepoUrl\n const repoPath = rawRepoUrl ? resolveWorkspaceRepoPath(resolveRepoInput(rawRepoUrl)) : null\n const projectDir = raw.projectDir ??\n (repoPath\n ? `.docker-git/${repoPath}`\n : defaultProjectDir)\n\n return { projectDir, raw }\n })\n\nexport const parseProjectDirArgs = (\n args: ReadonlyArray<string>,\n defaultProjectDir: string = \".\"\n): Either.Either<{ readonly projectDir: string }, ParseError> =>\n Either.map(\n parseProjectDirWithOptions(args, defaultProjectDir),\n ({ projectDir }) => ({ projectDir })\n )\n","import { Either } from \"effect\"\n\nimport { type ApplyCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\n// CHANGE: parse \"apply\" command for existing docker-git projects\n// WHY: update managed docker-git config on the current project/container without creating a new project\n// QUOTE(ТЗ): \"Не создавать новый... а прямо в текущем обновить её на актуальную\"\n// REF: issue-72-followup-apply-current-config\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseApply(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<ApplyCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseApply = (\n args: ReadonlyArray<string>\n): Either.Either<ApplyCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"Apply\",\n projectDir,\n runUp: raw.up ?? true,\n gitTokenLabel: raw.gitTokenLabel,\n codexTokenLabel: raw.codexTokenLabel,\n claudeTokenLabel: raw.claudeTokenLabel,\n enableMcpPlaywright: raw.enableMcpPlaywright\n }))\n","import { Either } from \"effect\"\n\nimport { type AttachCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirArgs } from \"./parser-shared.js\"\n\n// CHANGE: parse attach command into a project selection\n// WHY: allow \"docker-git attach\" to open a tmux workspace\n// QUOTE(ТЗ): \"окей Давай подключим tmux\"\n// REF: user-request-2026-02-02-tmux\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseAttach(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<AttachCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseAttach = (args: ReadonlyArray<string>): Either.Either<AttachCommand, ParseError> => {\n return Either.map(parseProjectDirArgs(args), ({ projectDir }) => ({\n _tag: \"Attach\",\n projectDir\n }))\n}\n","import { Either, Match } from \"effect\"\n\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport { type AuthCommand, type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\n\ntype AuthOptions = {\n readonly envGlobalPath: string\n readonly codexAuthPath: string\n readonly claudeAuthPath: string\n readonly label: string | null\n readonly token: string | null\n readonly scopes: string | null\n readonly authWeb: boolean\n}\n\nconst missingArgument = (name: string): ParseError => ({\n _tag: \"MissingRequiredOption\",\n option: name\n})\n\nconst invalidArgument = (name: string, reason: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: name,\n reason\n})\n\nconst normalizeLabel = (value: string | undefined): string | null => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length === 0 ? null : trimmed\n}\n\nconst defaultEnvGlobalPath = \".docker-git/.orch/env/global.env\"\nconst defaultCodexAuthPath = \".docker-git/.orch/auth/codex\"\nconst defaultClaudeAuthPath = \".docker-git/.orch/auth/claude\"\n\nconst resolveAuthOptions = (raw: RawOptions): AuthOptions => ({\n envGlobalPath: raw.envGlobalPath ?? defaultEnvGlobalPath,\n codexAuthPath: raw.codexAuthPath ?? defaultCodexAuthPath,\n claudeAuthPath: defaultClaudeAuthPath,\n label: normalizeLabel(raw.label),\n token: normalizeLabel(raw.token),\n scopes: normalizeLabel(raw.scopes),\n authWeb: raw.authWeb === true\n})\n\nconst buildGithubCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n options.authWeb && options.token !== null\n ? Either.left(invalidArgument(\"--token\", \"cannot be combined with --web\"))\n : Either.right<AuthCommand>({\n _tag: \"AuthGithubLogin\",\n label: options.label,\n token: options.authWeb ? null : options.token,\n scopes: options.scopes,\n envGlobalPath: options.envGlobalPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthGithubStatus\",\n envGlobalPath: options.envGlobalPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthGithubLogout\",\n label: options.label,\n envGlobalPath: options.envGlobalPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildCodexCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexLogin\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexStatus\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthCodexLogout\",\n label: options.label,\n codexAuthPath: options.codexAuthPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildClaudeCommand = (action: string, options: AuthOptions): Either.Either<AuthCommand, ParseError> =>\n Match.value(action).pipe(\n Match.when(\"login\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeLogin\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.when(\"status\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeStatus\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.when(\"logout\", () =>\n Either.right<AuthCommand>({\n _tag: \"AuthClaudeLogout\",\n label: options.label,\n claudeAuthPath: options.claudeAuthPath\n })),\n Match.orElse(() => Either.left(invalidArgument(\"auth action\", `unknown action '${action}'`)))\n )\n\nconst buildAuthCommand = (\n provider: string,\n action: string,\n options: AuthOptions\n): Either.Either<AuthCommand, ParseError> =>\n Match.value(provider).pipe(\n Match.when(\"github\", () => buildGithubCommand(action, options)),\n Match.when(\"gh\", () => buildGithubCommand(action, options)),\n Match.when(\"codex\", () => buildCodexCommand(action, options)),\n Match.when(\"claude\", () => buildClaudeCommand(action, options)),\n Match.when(\"cc\", () => buildClaudeCommand(action, options)),\n Match.orElse(() => Either.left(invalidArgument(\"auth provider\", `unknown provider '${provider}'`)))\n )\n\n// CHANGE: parse docker-git auth subcommands\n// WHY: keep auth flows in the same typed CLI parser\n// QUOTE(ТЗ): \"система авторизации\"\n// REF: user-request-2026-01-28-auth\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseAuth(argv) = cmd | error\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: no IO or side effects\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseAuth = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n if (args.length < 2) {\n return Either.left(missingArgument(args.length === 0 ? \"auth provider\" : \"auth action\"))\n }\n\n const provider = args[0] ?? \"\"\n const action = args[1] ?? \"\"\n const rest = args.slice(2)\n\n return Either.flatMap(parseRawOptions(rest), (raw) => buildAuthCommand(provider, action, resolveAuthOptions(raw)))\n}\n","import { Either } from \"effect\"\n\nimport { expandContainerHome } from \"../usecases/scrap-path.js\"\nimport { type RawOptions } from \"./command-options.js\"\nimport {\n type CreateCommand,\n defaultTemplateConfig,\n deriveRepoPathParts,\n deriveRepoSlug,\n isDockerNetworkMode,\n type ParseError,\n resolveRepoInput\n} from \"./domain.js\"\nimport { trimRightChar } from \"./strings.js\"\nimport { normalizeAuthLabel, normalizeGitTokenLabel } from \"./token-labels.js\"\n\nconst parsePort = (value: string): Either.Either<number, ParseError> => {\n const parsed = Number(value)\n if (!Number.isInteger(parsed)) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--ssh-port\",\n reason: `expected integer, got: ${value}`\n })\n }\n if (parsed < 1 || parsed > 65_535) {\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--ssh-port\",\n reason: \"must be between 1 and 65535\"\n })\n }\n return Either.right(parsed)\n}\n\nconst parseDockerNetworkMode = (\n value: string | undefined\n): Either.Either<CreateCommand[\"config\"][\"dockerNetworkMode\"], ParseError> => {\n const candidate = value?.trim() ?? defaultTemplateConfig.dockerNetworkMode\n if (isDockerNetworkMode(candidate)) {\n return Either.right(candidate)\n }\n return Either.left({\n _tag: \"InvalidOption\",\n option: \"--network-mode\",\n reason: \"expected one of: shared, project\"\n })\n}\n\nexport const nonEmpty = (\n option: string,\n value: string | undefined,\n fallback?: string\n): Either.Either<string, ParseError> => {\n const candidate = value?.trim() ?? fallback\n if (candidate === undefined || candidate.length === 0) {\n return Either.left({\n _tag: \"MissingRequiredOption\",\n option\n })\n }\n return Either.right(candidate)\n}\n\nconst normalizeSecretsRoot = (value: string): string => trimRightChar(value, \"/\")\n\ntype RepoBasics = {\n readonly repoUrl: string\n readonly repoSlug: string\n readonly projectSlug: string\n readonly repoPath: string\n readonly repoRef: string\n readonly targetDir: string\n readonly sshUser: string\n readonly sshPort: number\n}\n\nconst resolveRepoBasics = (raw: RawOptions): Either.Either<RepoBasics, ParseError> =>\n Either.gen(function*(_) {\n const rawRepoUrl = raw.repoUrl?.trim() ?? \"\"\n const resolvedRepo = resolveRepoInput(rawRepoUrl)\n const repoUrl = resolvedRepo.repoUrl\n const repoSlug = deriveRepoSlug(repoUrl)\n const repoPathParts = deriveRepoPathParts(repoUrl).pathParts\n const workspaceSuffix = resolvedRepo.workspaceSuffix\n const projectSlug = workspaceSuffix ? `${repoSlug}-${workspaceSuffix}` : repoSlug\n const repoPath = workspaceSuffix ? [...repoPathParts, workspaceSuffix].join(\"/\") : repoPathParts.join(\"/\")\n const repoRef = yield* _(\n nonEmpty(\"--repo-ref\", raw.repoRef ?? resolvedRepo.repoRef, defaultTemplateConfig.repoRef)\n )\n const sshUser = yield* _(nonEmpty(\"--ssh-user\", raw.sshUser, defaultTemplateConfig.sshUser))\n const rawTargetDir = yield* _(\n nonEmpty(\"--target-dir\", raw.targetDir, defaultTemplateConfig.targetDir)\n )\n const targetDir = expandContainerHome(sshUser, rawTargetDir)\n const sshPort = yield* _(parsePort(raw.sshPort ?? String(defaultTemplateConfig.sshPort)))\n\n return { repoUrl, repoSlug, projectSlug, repoPath, repoRef, targetDir, sshUser, sshPort }\n })\n\ntype NameConfig = {\n readonly containerName: string\n readonly serviceName: string\n readonly volumeName: string\n}\n\nconst resolveNames = (\n raw: RawOptions,\n projectSlug: string\n): Either.Either<NameConfig, ParseError> =>\n Either.gen(function*(_) {\n const derivedContainerName = `dg-${projectSlug}`\n const derivedServiceName = `dg-${projectSlug}`\n const derivedVolumeName = `dg-${projectSlug}-home`\n const containerName = yield* _(\n nonEmpty(\"--container-name\", raw.containerName, derivedContainerName)\n )\n const serviceName = yield* _(nonEmpty(\"--service-name\", raw.serviceName, derivedServiceName))\n const volumeName = yield* _(nonEmpty(\"--volume-name\", raw.volumeName, derivedVolumeName))\n\n return { containerName, serviceName, volumeName }\n })\n\ntype PathConfig = {\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n readonly codexSharedAuthPath: string\n readonly codexHome: string\n readonly outDir: string\n}\n\ntype DefaultPathConfig = {\n readonly dockerGitPath: string\n readonly authorizedKeysPath: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly codexAuthPath: string\n}\n\nconst resolveNormalizedSecretsRoot = (value: string | undefined): string | undefined => {\n const trimmed = value?.trim() ?? \"\"\n return trimmed.length === 0 ? undefined : normalizeSecretsRoot(trimmed)\n}\n\nconst buildDefaultPathConfig = (\n normalizedSecretsRoot: string | undefined\n): DefaultPathConfig =>\n normalizedSecretsRoot === undefined\n ? {\n dockerGitPath: defaultTemplateConfig.dockerGitPath,\n authorizedKeysPath: defaultTemplateConfig.authorizedKeysPath,\n envGlobalPath: defaultTemplateConfig.envGlobalPath,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: defaultTemplateConfig.codexAuthPath\n }\n : {\n // NOTE: Keep docker-git root mount stable (projects root) so caches like\n // `.cache/git-mirrors` remain outside the secrets dir.\n dockerGitPath: defaultTemplateConfig.dockerGitPath,\n authorizedKeysPath: defaultTemplateConfig.authorizedKeysPath,\n envGlobalPath: `${normalizedSecretsRoot}/global.env`,\n envProjectPath: defaultTemplateConfig.envProjectPath,\n codexAuthPath: `${normalizedSecretsRoot}/codex`\n }\n\nconst resolvePaths = (\n raw: RawOptions,\n repoPath: string\n): Either.Either<PathConfig, ParseError> =>\n Either.gen(function*(_) {\n const normalizedSecretsRoot = resolveNormalizedSecretsRoot(raw.secretsRoot)\n const defaults = buildDefaultPathConfig(normalizedSecretsRoot)\n const dockerGitPath = defaults.dockerGitPath\n const authorizedKeysPath = yield* _(\n nonEmpty(\"--authorized-keys\", raw.authorizedKeysPath, defaults.authorizedKeysPath)\n )\n const envGlobalPath = yield* _(nonEmpty(\"--env-global\", raw.envGlobalPath, defaults.envGlobalPath))\n const envProjectPath = yield* _(\n nonEmpty(\"--env-project\", raw.envProjectPath, defaults.envProjectPath)\n )\n const codexAuthPath = yield* _(\n nonEmpty(\"--codex-auth\", raw.codexAuthPath, defaults.codexAuthPath)\n )\n const codexSharedAuthPath = codexAuthPath\n const codexHome = yield* _(nonEmpty(\"--codex-home\", raw.codexHome, defaultTemplateConfig.codexHome))\n const outDir = yield* _(nonEmpty(\"--out-dir\", raw.outDir, `.docker-git/${repoPath}`))\n\n return {\n dockerGitPath,\n authorizedKeysPath,\n envGlobalPath,\n envProjectPath,\n codexAuthPath,\n codexSharedAuthPath,\n codexHome,\n outDir\n }\n })\n\ntype CreateBehavior = {\n readonly runUp: boolean\n readonly openSsh: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n readonly enableMcpPlaywright: boolean\n}\n\nconst resolveCreateBehavior = (raw: RawOptions): CreateBehavior => ({\n runUp: raw.up ?? true,\n openSsh: raw.openSsh ?? false,\n force: raw.force ?? false,\n forceEnv: raw.forceEnv ?? false,\n enableMcpPlaywright: raw.enableMcpPlaywright ?? false\n})\n\ntype BuildTemplateConfigInput = {\n readonly repo: RepoBasics\n readonly names: NameConfig\n readonly paths: PathConfig\n readonly dockerNetworkMode: CreateCommand[\"config\"][\"dockerNetworkMode\"]\n readonly dockerSharedNetworkName: string\n readonly gitTokenLabel: string | undefined\n readonly codexAuthLabel: string | undefined\n readonly claudeAuthLabel: string | undefined\n readonly enableMcpPlaywright: boolean\n}\n\nconst buildTemplateConfig = ({\n claudeAuthLabel,\n codexAuthLabel,\n dockerNetworkMode,\n dockerSharedNetworkName,\n enableMcpPlaywright,\n gitTokenLabel,\n names,\n paths,\n repo\n}: BuildTemplateConfigInput): CreateCommand[\"config\"] => ({\n containerName: names.containerName,\n serviceName: names.serviceName,\n sshUser: repo.sshUser,\n sshPort: repo.sshPort,\n repoUrl: repo.repoUrl,\n repoRef: repo.repoRef,\n gitTokenLabel,\n codexAuthLabel,\n claudeAuthLabel,\n targetDir: repo.targetDir,\n volumeName: names.volumeName,\n dockerGitPath: paths.dockerGitPath,\n authorizedKeysPath: paths.authorizedKeysPath,\n envGlobalPath: paths.envGlobalPath,\n envProjectPath: paths.envProjectPath,\n codexAuthPath: paths.codexAuthPath,\n codexSharedAuthPath: paths.codexSharedAuthPath,\n codexHome: paths.codexHome,\n dockerNetworkMode,\n dockerSharedNetworkName,\n enableMcpPlaywright,\n pnpmVersion: defaultTemplateConfig.pnpmVersion\n})\n\n// CHANGE: build a typed create command from raw options (CLI or API)\n// WHY: share deterministic command construction across CLI and server\n// QUOTE(ТЗ): \"В lib ты оставляешь бизнес логику, а все CLI морду хранишь в app\"\n// REF: user-request-2026-02-02-cli-split\n// SOURCE: n/a\n// FORMAT THEOREM: forall raw: build(raw) -> deterministic(command)\n// PURITY: CORE\n// EFFECT: Effect<CreateCommand, ParseError, never>\n// INVARIANT: uses defaults for unset fields\n// COMPLEXITY: O(1)\nexport const buildCreateCommand = (\n raw: RawOptions\n): Either.Either<CreateCommand, ParseError> =>\n Either.gen(function*(_) {\n const repo = yield* _(resolveRepoBasics(raw))\n const names = yield* _(resolveNames(raw, repo.projectSlug))\n const paths = yield* _(resolvePaths(raw, repo.repoPath))\n const behavior = resolveCreateBehavior(raw)\n const gitTokenLabel = normalizeGitTokenLabel(raw.gitTokenLabel)\n const codexAuthLabel = normalizeAuthLabel(raw.codexTokenLabel)\n const claudeAuthLabel = normalizeAuthLabel(raw.claudeTokenLabel)\n const dockerNetworkMode = yield* _(parseDockerNetworkMode(raw.dockerNetworkMode))\n const dockerSharedNetworkName = yield* _(\n nonEmpty(\"--shared-network\", raw.dockerSharedNetworkName, defaultTemplateConfig.dockerSharedNetworkName)\n )\n\n return {\n _tag: \"Create\",\n outDir: paths.outDir,\n runUp: behavior.runUp,\n openSsh: behavior.openSsh,\n force: behavior.force,\n forceEnv: behavior.forceEnv,\n waitForClone: false,\n config: buildTemplateConfig({\n repo,\n names,\n paths,\n dockerNetworkMode,\n dockerSharedNetworkName,\n gitTokenLabel,\n codexAuthLabel,\n claudeAuthLabel,\n enableMcpPlaywright: behavior.enableMcpPlaywright\n })\n }\n })\n","import { Either } from \"effect\"\n\nimport { buildCreateCommand, nonEmpty } from \"@effect-template/lib/core/command-builders\"\nimport type { RawOptions } from \"@effect-template/lib/core/command-options\"\nimport { type Command, type ParseError, resolveRepoInput } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\nimport { resolveWorkspaceRepoPath, splitPositionalRepo } from \"./parser-shared.js\"\n\nconst applyCloneDefaults = (\n raw: RawOptions,\n rawRepoUrl: string,\n resolvedRepo: ReturnType<typeof resolveRepoInput>\n): RawOptions => {\n const repoPath = resolveWorkspaceRepoPath(resolvedRepo)\n const targetHome = \"~\"\n return {\n ...raw,\n repoUrl: rawRepoUrl,\n outDir: raw.outDir ?? `.docker-git/${repoPath}`,\n targetDir: raw.targetDir ?? `${targetHome}/workspaces/${repoPath}`\n }\n}\n\n// CHANGE: parse clone command with positional repo url\n// WHY: allow \"docker-git clone <url>\" to build + run a container\n// QUOTE(ТЗ): \"docker-git clone url\"\n// REF: user-request-2026-01-27\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseClone(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: first positional arg is treated as repo url\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseClone = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const { positionalRepoUrl, restArgs } = splitPositionalRepo(args)\n\n return Either.gen(function*(_) {\n const raw = yield* _(parseRawOptions(restArgs))\n const rawRepoUrl = yield* _(nonEmpty(\"--repo-url\", raw.repoUrl ?? positionalRepoUrl))\n const resolvedRepo = resolveRepoInput(rawRepoUrl)\n const withDefaults = applyCloneDefaults(raw, rawRepoUrl, resolvedRepo)\n const withRef = resolvedRepo.repoRef !== undefined && raw.repoRef === undefined\n ? { ...withDefaults, repoRef: resolvedRepo.repoRef }\n : withDefaults\n const openSsh = raw.openSsh ?? true\n const create = yield* _(buildCreateCommand(withRef))\n return { ...create, waitForClone: true, openSsh }\n })\n}\n","import { Either } from \"effect\"\n\nimport { type McpPlaywrightUpCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\n// CHANGE: parse \"mcp-playwright\" command for existing docker-git projects\n// WHY: allow enabling Playwright MCP in an already created container/project dir\n// QUOTE(ТЗ): \"Добавить возможность поднимать MCP Playrgiht в контейнере который уже создан\"\n// REF: issue-29\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseMcpPlaywright(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<McpPlaywrightUpCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseMcpPlaywright = (\n args: ReadonlyArray<string>\n): Either.Either<McpPlaywrightUpCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"McpPlaywrightUp\",\n projectDir,\n runUp: raw.up ?? true\n }))\n","import { Either } from \"effect\"\n\nimport { type PanesCommand, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirArgs } from \"./parser-shared.js\"\n\n// CHANGE: parse panes command into a project selection\n// WHY: allow listing tmux panes without attaching\n// QUOTE(ТЗ): \"покажи команду ... отобразит терминалы\"\n// REF: user-request-2026-02-02-panes\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parsePanes(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<PanesCommand, ParseError, never>\n// INVARIANT: projectDir is never empty\n// COMPLEXITY: O(n) where n = |argv|\nexport const parsePanes = (args: ReadonlyArray<string>): Either.Either<PanesCommand, ParseError> => {\n return Either.map(parseProjectDirArgs(args), ({ projectDir }) => ({\n _tag: \"Panes\",\n projectDir\n }))\n}\n","import { Either, Match } from \"effect\"\n\nimport type { Command, ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\nconst missingRequired = (option: string): ParseError => ({\n _tag: \"MissingRequiredOption\",\n option\n})\n\nconst invalidScrapAction = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"scrap\",\n reason: `unknown action: ${value}`\n})\n\nconst defaultSessionArchiveDir = \".orch/scrap/session\"\n\nconst invalidScrapMode = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"--mode\",\n reason: `unknown value: ${value} (expected session)`\n})\n\nconst parseScrapMode = (raw: string | undefined): Either.Either<\"session\", ParseError> => {\n const value = raw?.trim()\n if (!value || value.length === 0) {\n return Either.right(\"session\")\n }\n if (value === \"session\") {\n return Either.right(\"session\")\n }\n if (value === \"recipe\") {\n // Backwards/semantic alias: \"recipe\" behaves like \"session\" (git state + rebuildable deps).\n return Either.right(\"session\")\n }\n return Either.left(invalidScrapMode(value))\n}\n\nconst makeScrapExportCommand = (projectDir: string, archivePath: string, mode: \"session\"): Command => ({\n _tag: \"ScrapExport\",\n projectDir,\n archivePath,\n mode\n})\n\nconst makeScrapImportCommand = (\n projectDir: string,\n archivePath: string,\n wipe: boolean,\n mode: \"session\"\n): Command => ({\n _tag: \"ScrapImport\",\n projectDir,\n archivePath,\n wipe,\n mode\n})\n\n// CHANGE: parse scrap session export/import commands\n// WHY: store a small reproducible snapshot (git state + secrets) instead of large caches like node_modules\n// QUOTE(ТЗ): \"не должно быть старого режима где он качает весь шлак типо node_modules\"\n// REF: user-request-2026-02-15\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseScrap(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: export/import always resolves a projectDir\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseScrap = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const action = args[0]?.trim()\n if (!action || action.length === 0) {\n return Either.left(missingRequired(\"scrap <action>\"))\n }\n\n const rest = args.slice(1)\n\n return Match.value(action).pipe(\n Match.when(\n \"export\",\n () =>\n Either.flatMap(\n parseProjectDirWithOptions(rest),\n ({ projectDir, raw }) =>\n Either.map(parseScrapMode(raw.scrapMode), (mode) => {\n const archivePathRaw = raw.archivePath?.trim()\n if (archivePathRaw && archivePathRaw.length > 0) {\n return makeScrapExportCommand(projectDir, archivePathRaw, mode)\n }\n return makeScrapExportCommand(projectDir, defaultSessionArchiveDir, mode)\n })\n )\n ),\n Match.when(\"import\", () =>\n Either.flatMap(parseProjectDirWithOptions(rest), ({ projectDir, raw }) => {\n const archivePath = raw.archivePath?.trim()\n if (!archivePath || archivePath.length === 0) {\n return Either.left(missingRequired(\"--archive\"))\n }\n return Either.map(parseScrapMode(raw.scrapMode), (mode) =>\n makeScrapImportCommand(projectDir, archivePath, raw.wipe ?? true, mode))\n })),\n Match.orElse(() => Either.left(invalidScrapAction(action)))\n )\n}\n","import { Either, Match } from \"effect\"\n\nimport { type ParseError, type SessionsCommand } from \"@effect-template/lib/core/domain\"\n\nimport { parseProjectDirWithOptions } from \"./parser-shared.js\"\n\nconst defaultLines = 200\n\nconst parsePositiveInt = (\n option: string,\n raw: string\n): Either.Either<number, ParseError> => {\n const value = Number.parseInt(raw, 10)\n if (!Number.isFinite(value) || value <= 0) {\n const error: ParseError = {\n _tag: \"InvalidOption\",\n option,\n reason: \"expected positive integer\"\n }\n return Either.left(error)\n }\n return Either.right(value)\n}\n\nconst parseList = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.map(parseProjectDirWithOptions(args), ({ projectDir, raw }) => ({\n _tag: \"SessionsList\",\n projectDir,\n includeDefault: raw.includeDefault === true\n }))\n\nconst parsePidContext = (\n args: ReadonlyArray<string>\n): Either.Either<\n { readonly pid: number; readonly projectDir: string; readonly raw: { readonly lines?: string } },\n ParseError\n> =>\n Either.gen(function*(_) {\n const pidRaw = args[0]\n if (!pidRaw) {\n const error: ParseError = { _tag: \"MissingRequiredOption\", option: \"pid\" }\n return yield* _(Either.left(error))\n }\n const pid = yield* _(parsePositiveInt(\"pid\", pidRaw))\n const { projectDir, raw } = yield* _(parseProjectDirWithOptions(args.slice(1)))\n return { pid, projectDir, raw }\n })\n\nconst parseKill = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.map(parsePidContext(args), ({ pid, projectDir }) => ({\n _tag: \"SessionsKill\",\n projectDir,\n pid\n }))\n\nconst parseLogs = (args: ReadonlyArray<string>): Either.Either<SessionsCommand, ParseError> =>\n Either.gen(function*(_) {\n const { pid, projectDir, raw } = yield* _(parsePidContext(args))\n const lines = raw.lines ? yield* _(parsePositiveInt(\"--lines\", raw.lines)) : defaultLines\n return { _tag: \"SessionsLogs\", projectDir, pid, lines }\n })\n\n// CHANGE: parse sessions command into list/kill/logs actions\n// WHY: surface container terminal sessions and background processes from CLI\n// QUOTE(ТЗ): \"CLI команду которая из докера вернёт запущенные терминал сессии\"\n// REF: user-request-2026-02-04-terminal-sessions\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parseSessions(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<SessionsCommand, ParseError, never>\n// INVARIANT: pid/lines must be positive integers\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseSessions = (\n args: ReadonlyArray<string>\n): Either.Either<SessionsCommand, ParseError> => {\n if (args.length === 0) {\n return parseList(args)\n }\n\n const first = args[0] ?? \"\"\n if (first.startsWith(\"-\")) {\n return parseList(args)\n }\n\n const rest = args.slice(1)\n return Match.value(first).pipe(\n Match.when(\"list\", () => parseList(rest)),\n Match.when(\"kill\", () => parseKill(rest)),\n Match.when(\"stop\", () => parseKill(rest)),\n Match.when(\"logs\", () => parseLogs(rest)),\n Match.when(\"log\", () => parseLogs(rest)),\n Match.orElse(() => {\n const error: ParseError = {\n _tag: \"InvalidOption\",\n option: \"sessions\",\n reason: `unknown action ${first}`\n }\n return Either.left(error)\n })\n )\n}\n","import { Either, Match } from \"effect\"\n\nimport type { Command, ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseRawOptions } from \"./parser-options.js\"\n\nconst invalidStateAction = (value: string): ParseError => ({\n _tag: \"InvalidOption\",\n option: \"state\",\n reason: `unknown action: ${value}`\n})\n\nconst unexpectedArgs = (value: string): Either.Either<Command, ParseError> =>\n Either.left({ _tag: \"UnexpectedArgument\", value })\n\nconst parseStateInit = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => {\n const repoUrl = raw.repoUrl?.trim()\n if (!repoUrl || repoUrl.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"--repo-url\" })\n }\n return Either.right({\n _tag: \"StateInit\",\n repoUrl,\n repoRef: raw.repoRef?.trim() && raw.repoRef.trim().length > 0 ? raw.repoRef.trim() : \"main\"\n })\n })\n\nconst parseStateCommit = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => {\n const message = raw.message?.trim()\n if (!message || message.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"--message\" })\n }\n return Either.right({ _tag: \"StateCommit\", message })\n })\n\nconst parseStateSync = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.map(parseRawOptions(args), (raw) => {\n const message = raw.message?.trim()\n return { _tag: \"StateSync\", message: message && message.length > 0 ? message : null }\n })\n\nexport const parseState = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n const action = args[0]?.trim()\n if (!action || action.length === 0) {\n return Either.left({ _tag: \"MissingRequiredOption\", option: \"state <action>\" })\n }\n\n const rest = args.slice(1)\n\n return Match.value(action).pipe(\n Match.when(\"path\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePath\" }\n return Either.right(command)\n }),\n Match.when(\"init\", () => parseStateInit(rest)),\n Match.when(\"pull\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePull\" }\n return Either.right(command)\n }),\n Match.when(\"push\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StatePush\" }\n return Either.right(command)\n }),\n Match.when(\"status\", () => {\n if (rest.length > 0) {\n return unexpectedArgs(rest[0] ?? \"\")\n }\n const command: Command = { _tag: \"StateStatus\" }\n return Either.right(command)\n }),\n Match.when(\"commit\", () => parseStateCommit(rest)),\n Match.when(\"sync\", () => parseStateSync(rest)),\n Match.orElse(() => Either.left(invalidStateAction(action)))\n )\n}\n","import { Match } from \"effect\"\n\nimport type { ParseError } from \"@effect-template/lib/core/domain\"\n\nexport const usageText = `docker-git menu\ndocker-git create [--repo-url <url>] [options]\ndocker-git clone <url> [options]\ndocker-git open [<url>] [options]\ndocker-git apply [<url>] [options]\ndocker-git mcp-playwright [<url>] [options]\ndocker-git attach [<url>] [options]\ndocker-git panes [<url>] [options]\ndocker-git scrap <action> [<url>] [options]\ndocker-git sessions [list] [<url>] [options]\ndocker-git sessions kill <pid> [<url>] [options]\ndocker-git sessions logs <pid> [<url>] [options]\ndocker-git ps\ndocker-git down-all\ndocker-git auth <provider> <action> [options]\ndocker-git state <action> [options]\n\nCommands:\n menu Interactive menu (default when no args)\n create, init Generate docker development environment (repo URL optional)\n clone Create + run container and clone repo\n open Open existing docker-git project workspace\n apply Apply docker-git config to an existing project/container (current dir by default)\n mcp-playwright Enable Playwright MCP + Chromium sidecar for an existing project dir\n attach, tmux Alias for open\n panes, terms List tmux panes for a docker-git project\n scrap Export/import project scrap (session snapshot + rebuildable deps)\n sessions List/kill/log container terminal processes\n ps, status Show docker compose status for all docker-git projects\n down-all Stop all docker-git containers (docker compose down)\n auth Manage GitHub/Codex/Claude Code auth for docker-git\n state Manage docker-git state directory via git (sync across machines)\n\nOptions:\n --repo-url <url> Repository URL (create: optional; clone: required via positional arg or flag)\n --repo-ref <ref> Git ref/branch (default: main)\n --branch, -b <ref> Alias for --repo-ref\n --target-dir <path> Target dir inside container (create default: /home/dev/app, clone default: ~/workspaces/<org>/<repo>[/issue-<id>|/pr-<id>])\n --ssh-port <port> Local SSH port (default: 2222)\n --ssh-user <user> SSH user inside container (default: dev)\n --container-name <name> Docker container name (default: dg-<repo>)\n --service-name <name> Compose service name (default: dg-<repo>)\n --volume-name <name> Docker volume name (default: dg-<repo>-home)\n --authorized-keys <path> Host path to authorized_keys (default: <projectsRoot>/authorized_keys)\n --env-global <path> Host path to shared env file (default: <projectsRoot>/.orch/env/global.env)\n --env-project <path> Host path to project env file (default: ./.orch/env/project.env)\n --codex-auth <path> Host path for Codex auth cache (default: <projectsRoot>/.orch/auth/codex)\n --codex-home <path> Container path for Codex auth (default: /home/dev/.codex)\n --network-mode <mode> Compose network mode: shared|project (default: shared)\n --shared-network <name> Shared Docker network name when network-mode=shared (default: docker-git-shared)\n --out-dir <path> Output directory (default: <projectsRoot>/<org>/<repo>[/issue-<id>|/pr-<id>])\n --project-dir <path> Project directory for open/attach (default: .)\n --archive <path> Scrap snapshot directory (default: .orch/scrap/session)\n --mode <session> Scrap mode (default: session)\n --git-token <label> Token label for clone/create (maps to GITHUB_TOKEN__<LABEL>, example: agiens)\n --codex-token <label> Codex auth label for clone/create (maps to CODEX_AUTH_LABEL, example: agien)\n --claude-token <label> Claude auth label for clone/create (maps to CLAUDE_AUTH_LABEL, example: agien)\n --wipe | --no-wipe Wipe workspace before scrap import (default: --wipe)\n --lines <n> Tail last N lines for sessions logs (default: 200)\n --include-default Show default/system processes in sessions list\n --up | --no-up Run docker compose up after init (default: --up)\n --ssh | --no-ssh Auto-open SSH after create/clone (default: clone=--ssh, create=--no-ssh)\n --mcp-playwright | --no-mcp-playwright Enable Playwright MCP + Chromium sidecar (default: --no-mcp-playwright)\n --force Overwrite existing files and wipe compose volumes (docker compose down -v)\n --force-env Reset project env defaults only (keep workspace volume/data)\n -h, --help Show this help\n\nContainer runtime env (set via .orch/env/project.env):\n CODEX_SHARE_AUTH=1|0 Share Codex auth.json across projects (default: 1)\n CODEX_AUTO_UPDATE=1|0 Auto-update Codex CLI on container start (default: 1)\n CLAUDE_AUTO_SYSTEM_PROMPT=1|0 Auto-attach docker-git managed system prompt to claude (default: 1)\n DOCKER_GIT_ZSH_AUTOSUGGEST=1|0 Enable zsh-autosuggestions (default: 1)\n DOCKER_GIT_ZSH_AUTOSUGGEST_STYLE=... zsh-autosuggestions highlight style (default: fg=8,italic)\n DOCKER_GIT_ZSH_AUTOSUGGEST_STRATEGY=... Suggestion sources (default: history completion)\n MCP_PLAYWRIGHT_ISOLATED=1|0 Isolated browser contexts (recommended for many Codex; default: 1)\n MCP_PLAYWRIGHT_CDP_ENDPOINT=http://... Override CDP endpoint (default: http://dg-<repo>-browser:9223)\n\nAuth providers:\n github, gh GitHub CLI auth (tokens saved to env file)\n codex Codex CLI auth (stored under .orch/auth/codex)\n claude, cc Claude Code CLI auth (OAuth cache stored under .orch/auth/claude)\n\nAuth actions:\n login Run login flow and store credentials\n status Show current auth status\n logout Remove stored credentials\n\nAuth options:\n --label <label> Account label (default: default)\n --token <token> GitHub token override (login only; useful for non-interactive/CI)\n --web Force OAuth web flow (login only; ignores --token)\n --scopes <scopes> GitHub scopes (login only, default: repo,workflow,read:org)\n --env-global <path> Env file path for GitHub tokens (default: <projectsRoot>/.orch/env/global.env)\n --codex-auth <path> Codex auth root path (default: <projectsRoot>/.orch/auth/codex)\n\nState actions:\n state path Print current projects root (default: ~/.docker-git; override via DOCKER_GIT_PROJECTS_ROOT)\n state init --repo-url <url> [-b] Init / bind state dir to a git remote (use a private repo)\n state status Show git status for the state dir\n state pull git pull (state dir)\n state commit -m <message> Commit all changes in the state dir\n state sync [-m <message>] Commit (if needed) + fetch/rebase + push (state dir); on conflict pushes a PR branch\n state push git push (state dir)\n\nState options:\n --message, -m <message> Commit message for state commit\n`\n\n// CHANGE: normalize parse errors into user-facing messages\n// WHY: keep formatting deterministic and centralized\n// QUOTE(ТЗ): \"Надо написать CLI команду\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall e: format(e) = s -> deterministic(s)\n// PURITY: CORE\n// EFFECT: Effect<string, never, never>\n// INVARIANT: each ParseError maps to exactly one message\n// COMPLEXITY: O(1)\nexport const formatParseError = (error: ParseError): string =>\n Match.value(error).pipe(\n Match.when({ _tag: \"UnknownCommand\" }, ({ command }) => `Unknown command: ${command}`),\n Match.when({ _tag: \"UnknownOption\" }, ({ option }) => `Unknown option: ${option}`),\n Match.when({ _tag: \"MissingOptionValue\" }, ({ option }) => `Missing value for option: ${option}`),\n Match.when({ _tag: \"MissingRequiredOption\" }, ({ option }) => `Missing required option: ${option}`),\n Match.when({ _tag: \"InvalidOption\" }, ({ option, reason }) => `Invalid option ${option}: ${reason}`),\n Match.when({ _tag: \"UnexpectedArgument\" }, ({ value }) => `Unexpected argument: ${value}`),\n Match.exhaustive\n )\n","import { Either, Match } from \"effect\"\n\nimport { type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseApply } from \"./parser-apply.js\"\nimport { parseAttach } from \"./parser-attach.js\"\nimport { parseAuth } from \"./parser-auth.js\"\nimport { parseClone } from \"./parser-clone.js\"\nimport { buildCreateCommand } from \"./parser-create.js\"\nimport { parseMcpPlaywright } from \"./parser-mcp-playwright.js\"\nimport { parseRawOptions } from \"./parser-options.js\"\nimport { parsePanes } from \"./parser-panes.js\"\nimport { parseScrap } from \"./parser-scrap.js\"\nimport { parseSessions } from \"./parser-sessions.js\"\nimport { parseState } from \"./parser-state.js\"\nimport { usageText } from \"./usage.js\"\n\nconst isHelpFlag = (token: string): boolean => token === \"--help\" || token === \"-h\"\n\nconst helpCommand: Command = { _tag: \"Help\", message: usageText }\nconst menuCommand: Command = { _tag: \"Menu\" }\nconst statusCommand: Command = { _tag: \"Status\" }\nconst downAllCommand: Command = { _tag: \"DownAll\" }\n\nconst parseCreate = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> =>\n Either.flatMap(parseRawOptions(args), (raw) => buildCreateCommand(raw))\n\n// CHANGE: parse CLI arguments into a typed command\n// WHY: enforce deterministic, pure parsing before any effects run\n// QUOTE(ТЗ): \"Надо написать CLI команду с помощью которой мы будем создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: parse(argv) = cmd -> deterministic(cmd)\n// PURITY: CORE\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: parse does not perform IO and returns the same result for same argv\n// COMPLEXITY: O(n) where n = |argv|\nexport const parseArgs = (args: ReadonlyArray<string>): Either.Either<Command, ParseError> => {\n if (args.length === 0) {\n return Either.right(menuCommand)\n }\n\n if (args.some((arg) => isHelpFlag(arg))) {\n return Either.right(helpCommand)\n }\n\n const command = args[0]\n const rest = args.slice(1)\n const unknownCommandError: ParseError = {\n _tag: \"UnknownCommand\",\n command: command ?? \"\"\n }\n\n return Match.value(command)\n .pipe(\n Match.when(\"create\", () => parseCreate(rest)),\n Match.when(\"init\", () => parseCreate(rest)),\n Match.when(\"clone\", () => parseClone(rest)),\n Match.when(\"attach\", () => parseAttach(rest)),\n Match.when(\"tmux\", () => parseAttach(rest)),\n Match.when(\"panes\", () => parsePanes(rest)),\n Match.when(\"terms\", () => parsePanes(rest)),\n Match.when(\"terminals\", () => parsePanes(rest)),\n Match.when(\"sessions\", () => parseSessions(rest)),\n Match.when(\"scrap\", () => parseScrap(rest)),\n Match.when(\"mcp-playwright\", () => parseMcpPlaywright(rest)),\n Match.when(\"help\", () => Either.right(helpCommand)),\n Match.when(\"ps\", () => Either.right(statusCommand)),\n Match.when(\"status\", () => Either.right(statusCommand)),\n Match.when(\"down-all\", () => Either.right(downAllCommand)),\n Match.when(\"stop-all\", () => Either.right(downAllCommand)),\n Match.when(\"kill-all\", () => Either.right(downAllCommand)),\n Match.when(\"menu\", () => Either.right(menuCommand)),\n Match.when(\"ui\", () => Either.right(menuCommand)),\n Match.when(\"auth\", () => parseAuth(rest))\n )\n .pipe(\n Match.when(\"open\", () => parseAttach(rest)),\n Match.when(\"apply\", () => parseApply(rest)),\n Match.when(\"state\", () => parseState(rest)),\n Match.orElse(() => Either.left(unknownCommandError))\n )\n}\n","import { Effect, Either, pipe } from \"effect\"\n\nimport { type Command, type ParseError } from \"@effect-template/lib/core/domain\"\n\nimport { parseArgs } from \"./parser.js\"\n\n// CHANGE: read and parse CLI arguments from process.argv\n// WHY: keep IO at the boundary and delegate parsing to CORE\n// QUOTE(ТЗ): \"Надо написать CLI команду\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall argv: read(argv) -> parse(argv)\n// PURITY: SHELL\n// EFFECT: Effect<Command, ParseError, never>\n// INVARIANT: errors are typed as ParseError\n// COMPLEXITY: O(n) where n = |argv|\nexport const readCommand: Effect.Effect<Command, ParseError> = pipe(\n Effect.sync(() => process.argv.slice(2)),\n Effect.map((args) => parseArgs(args)),\n Effect.flatMap((result) =>\n Either.match(result, {\n onLeft: (error) => Effect.fail(error),\n onRight: (command) => Effect.succeed(command)\n })\n )\n)\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { AttachCommand, PanesCommand } from \"@effect-template/lib/core/domain\"\nimport { deriveRepoPathParts, deriveRepoSlug } from \"@effect-template/lib/core/domain\"\nimport {\n runCommandCapture,\n runCommandExitCode,\n runCommandWithExitCodes\n} from \"@effect-template/lib/shell/command-runner\"\nimport { readProjectConfig } from \"@effect-template/lib/shell/config\"\nimport type {\n ConfigDecodeError,\n ConfigNotFoundError,\n DockerCommandError,\n FileExistsError,\n PortProbeError\n} from \"@effect-template/lib/shell/errors\"\nimport { CommandFailedError } from \"@effect-template/lib/shell/errors\"\nimport { resolveBaseDir } from \"@effect-template/lib/shell/paths\"\nimport { findSshPrivateKey } from \"@effect-template/lib/usecases/path-helpers\"\nimport { buildSshCommand } from \"@effect-template/lib/usecases/projects\"\nimport { runDockerComposeUpWithPortCheck } from \"@effect-template/lib/usecases/projects-up\"\n\nconst tmuxOk = [0]\nconst layoutVersion = \"v14\"\n\nconst makeTmuxSpec = (args: ReadonlyArray<string>) => ({\n cwd: process.cwd(),\n command: \"tmux\",\n args\n})\n\nconst runTmux = (\n args: ReadonlyArray<string>\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandWithExitCodes(\n makeTmuxSpec(args),\n tmuxOk,\n (exitCode) => new CommandFailedError({ command: \"tmux\", exitCode })\n )\n\nconst runTmuxExitCode = (\n args: ReadonlyArray<string>\n): Effect.Effect<number, PlatformError, CommandExecutor.CommandExecutor> => runCommandExitCode(makeTmuxSpec(args))\n\nconst runTmuxCapture = (\n args: ReadonlyArray<string>\n): Effect.Effect<string, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n runCommandCapture(\n makeTmuxSpec(args),\n tmuxOk,\n (exitCode) => new CommandFailedError({ command: \"tmux\", exitCode })\n )\n\nconst sendKeys = (\n session: string,\n pane: string,\n text: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n pipe(\n runTmux([\"send-keys\", \"-t\", `${session}:0.${pane}`, \"-l\", text]),\n Effect.zipRight(runTmux([\"send-keys\", \"-t\", `${session}:0.${pane}`, \"C-m\"]))\n )\n\nconst shellEscape = (value: string): string => {\n if (value.length === 0) {\n return \"''\"\n }\n if (!/[^\\w@%+=:,./-]/.test(value)) {\n return value\n }\n const escaped = value.replaceAll(\"'\", \"'\\\"'\\\"'\")\n return `'${escaped}'`\n}\n\nconst wrapBash = (command: string): string => `bash -lc ${shellEscape(command)}`\n\nconst buildJobsCommand = (containerName: string): string =>\n [\n \"while true; do\",\n \"clear\",\n \"echo \\\"LIVE TERMINALS / JOBS (container, refresh 1s)\\\"\",\n \"echo \\\"\\\"\",\n `docker exec ${containerName} ps -eo pid,tty,cmd,etime --sort=start_time 2>/dev/null | awk 'NR==1 {print; next} $2 != \"?\" && $3 !~ /(sshd|^-?bash$|^bash$|^sh$|^zsh$|^fish$)/ {print; found=1} END { if (!found) print \"(no interactive jobs)\" }'`,\n \"|| echo \\\"container not running\\\"\",\n \"sleep 1\",\n \"done\"\n ].join(\"; \")\n\nconst readLayoutVersion = (\n session: string\n): Effect.Effect<string | null, PlatformError, CommandExecutor.CommandExecutor> =>\n runTmuxCapture([\"show-options\", \"-t\", session, \"-v\", \"@docker-git-layout\"]).pipe(\n Effect.map((value) => value.trim()),\n Effect.catchTag(\"CommandFailedError\", () => Effect.succeed(null))\n )\n\nconst buildBottomBarCommand = (): string =>\n [\n \"clear\",\n \"echo \\\"[Focus: Alt+1/2/3] [Select: Alt+s] [Detach: Alt+d]\\\"\",\n \"echo \\\"Tip: Mouse click = focus pane, Ctrl+a z = zoom\\\"\",\n \"while true; do sleep 3600; done\"\n ].join(\"; \")\n\nconst formatRepoRefLabel = (repoRef: string): string => {\n const match = /refs\\/pull\\/(\\d+)\\/head/.exec(repoRef)\n const pr = match?.[1]\n return pr ? `PR#${pr}` : repoRef\n}\n\nconst formatRepoDisplayName = (repoUrl: string): string => {\n const parts = deriveRepoPathParts(repoUrl)\n return parts.pathParts.length > 0 ? parts.pathParts.join(\"/\") : repoUrl\n}\n\ntype PaneRow = {\n readonly id: string\n readonly window: string\n readonly title: string\n readonly command: string\n}\n\nconst normalizePaneCell = (value: string | undefined): string => value?.trim() ?? \"-\"\n\nconst parsePaneRow = (line: string): PaneRow => {\n const [id, window, title, command] = line.split(\"\\t\")\n return {\n id: normalizePaneCell(id),\n window: normalizePaneCell(window),\n title: normalizePaneCell(title),\n command: normalizePaneCell(command)\n }\n}\n\nconst renderPaneRow = (row: PaneRow): string =>\n `- ${row.id} ${row.window} ${row.title === \"-\" ? row.command : row.title} ${row.command}`\n\nconst configureSession = (\n session: string,\n repoDisplayName: string,\n statusRight: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(runTmux([\"set-option\", \"-t\", session, \"@docker-git-layout\", layoutVersion]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"window-size\", \"largest\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"aggressive-resize\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"mouse\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"focus-events\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"prefix\", \"C-a\"]))\n yield* _(runTmux([\"unbind-key\", \"C-b\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status\", \"on\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-position\", \"top\"]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-left\", ` docker-git :: ${repoDisplayName} `]))\n yield* _(runTmux([\"set-option\", \"-t\", session, \"status-right\", ` ${statusRight} `]))\n })\n\nconst createLayout = (\n session: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n yield* _(runTmux([\"new-session\", \"-d\", \"-s\", session, \"-n\", \"main\"]))\n yield* _(runTmux([\"split-window\", \"-v\", \"-p\", \"12\", \"-t\", `${session}:0`]))\n yield* _(runTmux([\"split-window\", \"-h\", \"-p\", \"35\", \"-t\", `${session}:0.0`]))\n })\n\nconst setupPanes = (\n session: string,\n sshCommand: string,\n containerName: string\n): Effect.Effect<void, CommandFailedError | PlatformError, CommandExecutor.CommandExecutor> =>\n Effect.gen(function*(_) {\n const leftPane = \"0\"\n const bottomPane = \"1\"\n const rightPane = \"2\"\n yield* _(sendKeys(session, leftPane, sshCommand))\n yield* _(sendKeys(session, rightPane, wrapBash(buildJobsCommand(containerName))))\n yield* _(sendKeys(session, bottomPane, wrapBash(buildBottomBarCommand())))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-1\", \"select-pane\", \"-t\", `${session}:0.${leftPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-2\", \"select-pane\", \"-t\", `${session}:0.${rightPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-3\", \"select-pane\", \"-t\", `${session}:0.${bottomPane}`]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-d\", \"detach-client\"]))\n yield* _(runTmux([\"bind-key\", \"-n\", \"M-s\", \"choose-tree\", \"-Z\"]))\n yield* _(runTmux([\"select-pane\", \"-t\", `${session}:0.${leftPane}`]))\n })\n\n// CHANGE: list tmux panes for a docker-git project\n// WHY: allow non-interactive inspection of terminal panes (CI/automation friendly)\n// QUOTE(ТЗ): \"сделай команду ... которая отобразит терминалы в докере\"\n// REF: user-request-2026-02-02-panes\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: panes(p) -> deterministic output\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: session name is deterministic from repo url\n// COMPLEXITY: O(n) where n = number of panes\nexport const listTmuxPanes = (\n command: PanesCommand\n): Effect.Effect<\n void,\n CommandFailedError | ConfigNotFoundError | ConfigDecodeError | PlatformError,\n CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { resolved } = yield* _(resolveBaseDir(command.projectDir))\n const config = yield* _(readProjectConfig(resolved))\n const session = `dg-${deriveRepoSlug(config.template.repoUrl)}`\n const hasSessionCode = yield* _(runTmuxExitCode([\"has-session\", \"-t\", session]))\n if (hasSessionCode !== 0) {\n yield* _(Effect.logWarning(`tmux session ${session} not found. Run 'docker-git attach' first.`))\n return\n }\n const raw = yield* _(\n runTmuxCapture([\n \"list-panes\",\n \"-s\",\n \"-t\",\n session,\n \"-F\",\n \"#{pane_id}\\t#{window_name}\\t#{pane_title}\\t#{pane_current_command}\"\n ])\n )\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trimEnd())\n .filter((line) => line.length > 0)\n const rows = lines.map((line) => parsePaneRow(line))\n yield* _(Effect.log(`Project: ${resolved}`))\n yield* _(Effect.log(`Session: ${session}`))\n if (rows.length === 0) {\n yield* _(Effect.log(\"No panes found.\"))\n return\n }\n for (const row of rows) {\n yield* _(Effect.log(renderPaneRow(row)))\n }\n })\n\n// CHANGE: attach a tmux workspace for a docker-git project\n// WHY: provide multi-pane terminal layout for sandbox work\n// QUOTE(ТЗ): \"окей Давай подключим tmux\"\n// REF: user-request-2026-02-02-tmux\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: attach(p) -> tmux(p)\n// PURITY: SHELL\n// EFFECT: Effect<void, CommandFailedError | DockerCommandError | ConfigNotFoundError | ConfigDecodeError | FileExistsError | PortProbeError | PlatformError, CommandExecutor | FileSystem | Path>\n// INVARIANT: tmux session name is deterministic from repo url\n// COMPLEXITY: O(1)\nexport const attachTmux = (\n command: AttachCommand\n): Effect.Effect<\n void,\n | CommandFailedError\n | DockerCommandError\n | ConfigNotFoundError\n | ConfigDecodeError\n | FileExistsError\n | PortProbeError\n | PlatformError,\n CommandExecutor.CommandExecutor | FileSystem.FileSystem | Path.Path\n> =>\n Effect.gen(function*(_) {\n const { fs, path, resolved } = yield* _(resolveBaseDir(command.projectDir))\n const sshKey = yield* _(findSshPrivateKey(fs, path, process.cwd()))\n const template = yield* _(runDockerComposeUpWithPortCheck(resolved))\n const sshCommand = buildSshCommand(template, sshKey)\n const repoDisplayName = formatRepoDisplayName(template.repoUrl)\n const refLabel = formatRepoRefLabel(template.repoRef)\n const statusRight =\n `SSH: ${template.sshUser}@localhost:${template.sshPort} | Repo: ${repoDisplayName} | Ref: ${refLabel} | Status: Running`\n const session = `dg-${deriveRepoSlug(template.repoUrl)}`\n const hasSessionCode = yield* _(runTmuxExitCode([\"has-session\", \"-t\", session]))\n\n if (hasSessionCode === 0) {\n const existingLayout = yield* _(readLayoutVersion(session))\n if (existingLayout === layoutVersion) {\n yield* _(runTmux([\"attach\", \"-t\", session]))\n return\n }\n yield* _(Effect.logWarning(`tmux session ${session} uses an old layout; recreating.`))\n yield* _(runTmux([\"kill-session\", \"-t\", session]))\n }\n\n yield* _(createLayout(session))\n yield* _(configureSession(session, repoDisplayName, statusRight))\n yield* _(setupPanes(session, sshCommand, template.containerName))\n yield* _(runTmux([\"attach\", \"-t\", session]))\n })\n","export type BufferInputKey = {\n readonly backspace?: boolean\n readonly delete?: boolean\n}\n\nexport const nextBufferValue = (\n input: string,\n key: BufferInputKey,\n buffer: string\n): string | null => {\n if (key.backspace || key.delete) {\n return buffer.slice(0, -1)\n }\n if (input.length > 0) {\n return buffer + input\n }\n return null\n}\n","import type { MenuViewContext, ViewState } from \"./menu-types.js\"\n\nimport { Effect, pipe } from \"effect\"\n\n// CHANGE: share menu escape handling across flows\n// WHY: avoid duplicated logic in TUI handlers\n// QUOTE(ТЗ): \"А ты можешь сделать удобный выбор проектов?\"\n// REF: user-request-2026-02-02-select-project\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: escape(s) -> menu(s)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: always resets message on escape\n// COMPLEXITY: O(1)\n\ntype MenuResetContext = Pick<MenuViewContext, \"setView\" | \"setMessage\">\n\ntype OutputWrite = typeof process.stdout.write\n\nlet stdoutPatched = false\nlet stdoutMuted = false\nlet baseStdoutWrite: OutputWrite | null = null\nlet baseStderrWrite: OutputWrite | null = null\n\nconst wrapWrite = (baseWrite: OutputWrite): OutputWrite =>\n(\n chunk: string | Uint8Array,\n encoding?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void\n) => {\n if (stdoutMuted) {\n const callback = typeof encoding === \"function\" ? encoding : cb\n if (typeof callback === \"function\") {\n callback()\n }\n return true\n }\n if (typeof encoding === \"function\") {\n return baseWrite(chunk, encoding)\n }\n return baseWrite(chunk, encoding, cb)\n}\n\nconst disableTerminalInputModes = (): void => {\n // Disable mouse/input modes that can leak across TUI <-> SSH transitions.\n process.stdout.write(\n \"\\u001B[0m\" +\n \"\\u001B[?25h\" +\n \"\\u001B[?1l\" +\n \"\\u001B>\" +\n \"\\u001B[?1000l\\u001B[?1002l\\u001B[?1003l\\u001B[?1005l\\u001B[?1006l\\u001B[?1015l\\u001B[?1007l\" +\n \"\\u001B[?1004l\\u001B[?2004l\" +\n \"\\u001B[>4;0m\\u001B[>4m\\u001B[<u\"\n )\n}\n\n// CHANGE: mute Ink stdout writes while SSH is active\n// WHY: prevent Ink resize re-renders from corrupting the SSH terminal buffer\n// QUOTE(ТЗ): \"при изменении разершения он всё ломает?\"\n// REF: user-request-2026-02-05-ssh-resize\n// SOURCE: n/a\n// FORMAT THEOREM: ∀w: muted(w) → ¬writes(ink, stdout)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: wrapper preserves original stdout write when not muted\n// COMPLEXITY: O(1)\nconst ensureStdoutPatched = (): void => {\n if (stdoutPatched) {\n return\n }\n baseStdoutWrite = process.stdout.write.bind(process.stdout)\n baseStderrWrite = process.stderr.write.bind(process.stderr)\n\n process.stdout.write = wrapWrite(baseStdoutWrite)\n process.stderr.write = wrapWrite(baseStderrWrite)\n stdoutPatched = true\n}\n\n// CHANGE: allow writing to the terminal even while stdout is muted\n// WHY: we mute Ink renders during interactive commands, but still need to show prompts/errors\n// REF: user-request-2026-02-18-tui-output-hidden\n// SOURCE: n/a\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: bypasses the mute wrapper safely\nexport const writeToTerminal = (text: string): void => {\n ensureStdoutPatched()\n const write = baseStdoutWrite ?? process.stdout.write.bind(process.stdout)\n write(text)\n}\n\n// CHANGE: keep the user on the primary screen until they acknowledge\n// WHY: otherwise output from failed docker/gh commands gets hidden again when TUI resumes\n// REF: user-request-2026-02-18-tui-output-hidden\n// SOURCE: n/a\n// PURITY: SHELL\n// EFFECT: Effect<void, never, never>\n// INVARIANT: no-op when stdin/stdout aren't TTY (CI/e2e)\nexport const pauseForEnter = (\n prompt = \"Press Enter to return to docker-git...\"\n): Effect.Effect<void> => {\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return Effect.void\n }\n\n return Effect.async((resume) => {\n // Ensure the prompt isn't glued to the last command line.\n writeToTerminal(`\\n${prompt}\\n`)\n process.stdin.resume()\n\n const cleanup = () => {\n process.stdin.off(\"data\", onData)\n }\n\n const onData = () => {\n cleanup()\n resume(Effect.void)\n }\n\n process.stdin.on(\"data\", onData)\n\n return Effect.sync(() => {\n cleanup()\n })\n }).pipe(Effect.asVoid)\n}\n\nexport const writeErrorAndPause = (renderedError: string): Effect.Effect<void> =>\n pipe(\n Effect.sync(() => {\n writeToTerminal(`\\n[docker-git] ${renderedError}\\n`)\n }),\n Effect.zipRight(pauseForEnter()),\n Effect.asVoid\n )\n\nexport const withSuspendedTui = <A, E, R>(\n effect: Effect.Effect<A, E, R>,\n options?: {\n readonly onError?: (error: E) => Effect.Effect<void>\n readonly onResume?: () => void\n }\n): Effect.Effect<A, E, R> => {\n const withError = options?.onError\n ? pipe(effect, Effect.tapError((error) => Effect.ignore(options.onError?.(error) ?? Effect.void)))\n : effect\n\n return pipe(\n Effect.sync(suspendTui),\n Effect.zipRight(withError),\n Effect.ensuring(\n Effect.sync(() => {\n resumeTui()\n options?.onResume?.()\n })\n )\n )\n}\n\nexport type SkipInputsContext = {\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\nexport type SshActiveContext = {\n readonly setSshActive: (active: boolean) => void\n}\n\nexport const resumeWithSkipInputs = (context: SkipInputsContext, extra?: () => void) => () => {\n extra?.()\n context.setSkipInputs(() => 2)\n}\n\nexport const resumeSshWithSkipInputs = (context: SkipInputsContext & SshActiveContext) =>\n resumeWithSkipInputs(context, () => {\n context.setSshActive(false)\n })\n\nexport const pauseOnError = <E>(render: (error: E) => string) => (error: E): Effect.Effect<void> =>\n writeErrorAndPause(render(error))\n\n// CHANGE: toggle stdout write muting for Ink rendering\n// WHY: allow SSH sessions to own the terminal without TUI redraws\n// QUOTE(ТЗ): \"при изменении разершения он всё ломает?\"\n// REF: user-request-2026-02-05-ssh-resize\n// SOURCE: n/a\n// FORMAT THEOREM: ∀m ∈ {true,false}: muted = m\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: stdout wrapper is installed at most once\n// COMPLEXITY: O(1)\nconst setStdoutMuted = (muted: boolean): void => {\n ensureStdoutPatched()\n stdoutMuted = muted\n}\n\n// CHANGE: temporarily suspend TUI rendering when running interactive commands\n// WHY: avoid mixed output from docker/ssh and the Ink UI\n// QUOTE(ТЗ): \"Почему так кривокосо всё отображается?\"\n// REF: user-request-2026-02-02-tui-output\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: suspend -> cleanOutput(cmd)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: only toggles when TTY is available\n// COMPLEXITY: O(1)\nexport const suspendTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n disableTerminalInputModes()\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(false)\n }\n // Switch back to the primary screen so interactive commands (ssh/gh/codex)\n // can render normally. Do not clear it: users may need scrollback (OAuth codes/URLs).\n process.stdout.write(\"\\u001B[?1049l\")\n setStdoutMuted(true)\n}\n\n// CHANGE: restore TUI rendering after interactive commands\n// WHY: return to Ink UI without broken terminal state\n// QUOTE(ТЗ): \"Почему так кривокосо всё отображается?\"\n// REF: user-request-2026-02-02-tui-output\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: resume -> tuiVisible(cmd)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: only toggles when TTY is available\n// COMPLEXITY: O(1)\nexport const resumeTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n setStdoutMuted(false)\n disableTerminalInputModes()\n // Return to the alternate screen for Ink rendering.\n process.stdout.write(\"\\u001B[?1049h\\u001B[2J\\u001B[H\")\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(true)\n }\n disableTerminalInputModes()\n}\n\nexport const leaveTui = (): void => {\n if (!process.stdout.isTTY) {\n return\n }\n // Ensure we don't leave the terminal in a broken \"mouse reporting\" mode.\n setStdoutMuted(false)\n disableTerminalInputModes()\n // Restore the primary screen on exit without clearing it (keeps useful scrollback).\n process.stdout.write(\"\\u001B[?1049l\")\n if (process.stdin.isTTY && typeof process.stdin.setRawMode === \"function\") {\n process.stdin.setRawMode(false)\n }\n}\n\nexport const resetToMenu = (context: MenuResetContext): void => {\n const view: ViewState = { _tag: \"Menu\" }\n context.setView(view)\n context.setMessage(null)\n}\n","import type * as CommandExecutor from \"@effect/platform/CommandExecutor\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport type * as Effect from \"effect/Effect\"\n\nimport type { MenuAction } from \"@effect-template/lib/core/domain\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\n// CHANGE: isolate TUI types/constants into a shared module\n// WHY: keep menu rendering and input handling small and focused\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: state(s) -> wellTyped(s)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: createSteps is ordered and total over CreateStep\n// COMPLEXITY: O(1)\n\nexport type MenuState = {\n readonly cwd: string\n readonly activeDir: string | null\n}\n\nexport type MenuEnv = FileSystem.FileSystem | Path.Path | CommandExecutor.CommandExecutor\n\nexport type MenuRunner = {\n readonly runEffect: (effect: Effect.Effect<void, AppError, MenuEnv>) => void\n}\n\nexport type MenuViewContext = {\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly setActiveDir: (dir: string | null) => void\n}\n\nexport type MenuKeyInput = {\n readonly upArrow?: boolean\n readonly downArrow?: boolean\n readonly return?: boolean\n readonly escape?: boolean\n readonly backspace?: boolean\n readonly delete?: boolean\n}\n\nexport type CreateInputs = {\n readonly repoUrl: string\n readonly repoRef: string\n readonly outDir: string\n readonly runUp: boolean\n readonly enableMcpPlaywright: boolean\n readonly force: boolean\n readonly forceEnv: boolean\n}\n\nexport type CreateStep =\n | \"repoUrl\"\n | \"repoRef\"\n | \"outDir\"\n | \"runUp\"\n | \"mcpPlaywright\"\n | \"force\"\n\nexport const createSteps: ReadonlyArray<CreateStep> = [\n \"repoUrl\",\n \"repoRef\",\n \"outDir\",\n \"runUp\",\n \"mcpPlaywright\",\n \"force\"\n]\n\nexport type AuthFlow =\n | \"GithubOauth\"\n | \"GithubRemove\"\n | \"GitSet\"\n | \"GitRemove\"\n | \"ClaudeOauth\"\n | \"ClaudeLogout\"\n\nexport interface AuthSnapshot {\n readonly globalEnvPath: string\n readonly claudeAuthPath: string\n readonly totalEntries: number\n readonly githubTokenEntries: number\n readonly gitTokenEntries: number\n readonly gitUserEntries: number\n readonly claudeAuthEntries: number\n}\n\nexport type ProjectAuthFlow =\n | \"ProjectGithubConnect\"\n | \"ProjectGithubDisconnect\"\n | \"ProjectGitConnect\"\n | \"ProjectGitDisconnect\"\n | \"ProjectClaudeConnect\"\n | \"ProjectClaudeDisconnect\"\n\nexport interface ProjectAuthSnapshot {\n readonly projectDir: string\n readonly projectName: string\n readonly envGlobalPath: string\n readonly envProjectPath: string\n readonly claudeAuthPath: string\n readonly githubTokenEntries: number\n readonly gitTokenEntries: number\n readonly claudeAuthEntries: number\n readonly activeGithubLabel: string | null\n readonly activeGitLabel: string | null\n readonly activeClaudeLabel: string | null\n}\n\nexport type ViewState =\n | { readonly _tag: \"Menu\" }\n | { readonly _tag: \"Create\"; readonly step: number; readonly buffer: string; readonly values: Partial<CreateInputs> }\n | { readonly _tag: \"AuthMenu\"; readonly selected: number; readonly snapshot: AuthSnapshot }\n | {\n readonly _tag: \"AuthPrompt\"\n readonly flow: AuthFlow\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n readonly snapshot: AuthSnapshot\n }\n | {\n readonly _tag: \"ProjectAuthMenu\"\n readonly selected: number\n readonly project: ProjectItem\n readonly snapshot: ProjectAuthSnapshot\n }\n | {\n readonly _tag: \"ProjectAuthPrompt\"\n readonly flow: ProjectAuthFlow\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n readonly project: ProjectItem\n readonly snapshot: ProjectAuthSnapshot\n }\n | {\n readonly _tag: \"SelectProject\"\n readonly purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\"\n readonly items: ReadonlyArray<ProjectItem>\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly selected: number\n readonly confirmDelete: boolean\n readonly connectEnableMcpPlaywright: boolean\n }\n\nexport type SelectProjectRuntime = {\n readonly running: boolean\n readonly sshSessions: number\n readonly startedAtIso: string | null\n readonly startedAtEpochMs: number | null\n}\n\nexport const menuItems: ReadonlyArray<{ readonly id: MenuAction; readonly label: string }> = [\n { id: { _tag: \"Create\" }, label: \"Create project\" },\n { id: { _tag: \"Select\" }, label: \"Select project\" },\n { id: { _tag: \"Auth\" }, label: \"Auth profiles (keys)\" },\n { id: { _tag: \"ProjectAuth\" }, label: \"Project auth (bind labels)\" },\n { id: { _tag: \"Info\" }, label: \"Show connection info\" },\n { id: { _tag: \"Status\" }, label: \"docker compose ps\" },\n { id: { _tag: \"Logs\" }, label: \"docker compose logs --tail=200\" },\n { id: { _tag: \"Down\" }, label: \"docker compose down\" },\n { id: { _tag: \"DownAll\" }, label: \"docker compose down (ALL projects)\" },\n { id: { _tag: \"Delete\" }, label: \"Delete project (folder + container)\" },\n { id: { _tag: \"Quit\" }, label: \"Quit\" }\n]\n","import { type CreateCommand, deriveRepoPathParts, resolveRepoInput } from \"@effect-template/lib/core/domain\"\nimport { createProject } from \"@effect-template/lib/usecases/actions\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Either, Match, pipe } from \"effect\"\nimport { parseArgs } from \"./cli/parser.js\"\nimport { formatParseError, usageText } from \"./cli/usage.js\"\n\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport {\n type CreateInputs,\n type CreateStep,\n createSteps,\n type MenuEnv,\n type MenuState,\n type ViewState\n} from \"./menu-types.js\"\n\n// CHANGE: move create-flow handling into a dedicated module\n// WHY: keep TUI entry slim and satisfy lint constraints\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: step(s) -> step'(s)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: outDir resolves to a stable repo path\n// COMPLEXITY: O(1) per keypress\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype CreateRunner = { readonly runEffect: (effect: Effect.Effect<void, AppError, MenuEnv>) => void }\n\ntype CreateContext = {\n readonly state: MenuState\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly runner: CreateRunner\n readonly setActiveDir: (dir: string | null) => void\n}\n\ntype CreateReturnContext = CreateContext & {\n readonly view: Extract<ViewState, { readonly _tag: \"Create\" }>\n}\n\nexport const buildCreateArgs = (input: CreateInputs): ReadonlyArray<string> => {\n const args: Array<string> = [\"create\"]\n if (input.repoUrl.length > 0) {\n args.push(\"--repo-url\", input.repoUrl)\n }\n if (input.repoRef.length > 0) {\n args.push(\"--repo-ref\", input.repoRef)\n }\n if (input.outDir.length > 0) {\n args.push(\"--out-dir\", input.outDir)\n }\n if (!input.runUp) {\n args.push(\"--no-up\")\n }\n if (input.enableMcpPlaywright) {\n args.push(\"--mcp-playwright\")\n }\n if (input.force) {\n args.push(\"--force\")\n }\n if (input.forceEnv) {\n args.push(\"--force-env\")\n }\n return args\n}\n\nconst trimLeftSlash = (value: string): string => {\n let start = 0\n while (start < value.length && value[start] === \"/\") {\n start += 1\n }\n return value.slice(start)\n}\n\nconst trimRightSlash = (value: string): string => {\n let end = value.length\n while (end > 0 && value[end - 1] === \"/\") {\n end -= 1\n }\n return value.slice(0, end)\n}\n\nconst joinPath = (...parts: ReadonlyArray<string>): string => {\n const cleaned = parts\n .filter((part) => part.length > 0)\n .map((part, index) => {\n if (index === 0) {\n return trimRightSlash(part)\n }\n return trimRightSlash(trimLeftSlash(part))\n })\n return cleaned.join(\"/\")\n}\n\nconst resolveDefaultOutDir = (cwd: string, repoUrl: string): string => {\n const resolvedRepo = resolveRepoInput(repoUrl)\n const baseParts = deriveRepoPathParts(resolvedRepo.repoUrl).pathParts\n const projectParts = resolvedRepo.workspaceSuffix ? [...baseParts, resolvedRepo.workspaceSuffix] : baseParts\n return joinPath(defaultProjectsRoot(cwd), ...projectParts)\n}\n\nexport const resolveCreateInputs = (\n cwd: string,\n values: Partial<CreateInputs>\n): CreateInputs => {\n const repoUrl = values.repoUrl ?? \"\"\n const resolvedRepoRef = resolveRepoInput(repoUrl).repoRef\n const outDir = values.outDir ?? resolveDefaultOutDir(cwd, repoUrl)\n\n return {\n repoUrl,\n repoRef: values.repoRef ?? resolvedRepoRef ?? \"main\",\n outDir,\n runUp: values.runUp !== false,\n enableMcpPlaywright: values.enableMcpPlaywright === true,\n force: values.force === true,\n forceEnv: values.forceEnv === true\n }\n}\n\nconst parseYesDefault = (input: string, fallback: boolean): boolean => {\n const normalized = input.trim().toLowerCase()\n if (normalized === \"y\" || normalized === \"yes\") {\n return true\n }\n if (normalized === \"n\" || normalized === \"no\") {\n return false\n }\n return fallback\n}\n\nconst applyCreateCommand = (\n state: MenuState,\n create: CreateCommand\n): Effect.Effect<{ readonly _tag: \"Continue\"; readonly state: MenuState }, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const path = yield* _(Path.Path)\n const resolvedOutDir = path.resolve(create.outDir)\n yield* _(createProject(create))\n return { _tag: \"Continue\", state: { ...state, activeDir: resolvedOutDir } }\n })\n\nconst isCreateCommand = (command: { readonly _tag: string }): command is CreateCommand => command._tag === \"Create\"\n\nconst buildCreateEffect = (\n command: { readonly _tag: string },\n state: MenuState,\n setActiveDir: (dir: string | null) => void,\n setMessage: (message: string | null) => void\n): Effect.Effect<void, AppError, MenuEnv> => {\n if (isCreateCommand(command)) {\n return pipe(\n applyCreateCommand(state, command),\n Effect.tap((outcome) =>\n Effect.sync(() => {\n setActiveDir(outcome.state.activeDir)\n })\n ),\n Effect.asVoid\n )\n }\n if (command._tag === \"Help\") {\n return Effect.sync(() => {\n setMessage(usageText)\n })\n }\n return Effect.void\n}\n\nconst applyCreateStep = (input: {\n readonly step: CreateStep\n readonly buffer: string\n readonly currentDefaults: CreateInputs\n readonly nextValues: Partial<Mutable<CreateInputs>>\n readonly cwd: string\n readonly setMessage: (message: string | null) => void\n}): boolean =>\n Match.value(input.step).pipe(\n Match.when(\"repoUrl\", () => {\n input.nextValues.repoUrl = input.buffer\n input.nextValues.outDir = resolveDefaultOutDir(input.cwd, input.buffer)\n return true\n }),\n Match.when(\"repoRef\", () => {\n input.nextValues.repoRef = input.buffer.length > 0 ? input.buffer : input.currentDefaults.repoRef\n return true\n }),\n Match.when(\"outDir\", () => {\n input.nextValues.outDir = input.buffer.length > 0 ? input.buffer : input.currentDefaults.outDir\n return true\n }),\n Match.when(\"runUp\", () => {\n input.nextValues.runUp = parseYesDefault(input.buffer, input.currentDefaults.runUp)\n return true\n }),\n Match.when(\"mcpPlaywright\", () => {\n input.nextValues.enableMcpPlaywright = parseYesDefault(\n input.buffer,\n input.currentDefaults.enableMcpPlaywright\n )\n return true\n }),\n Match.when(\"force\", () => {\n input.nextValues.force = parseYesDefault(input.buffer, input.currentDefaults.force)\n return true\n }),\n Match.exhaustive\n )\n\nconst finalizeCreateFlow = (input: {\n readonly state: MenuState\n readonly nextValues: Partial<CreateInputs>\n readonly setView: (view: ViewState) => void\n readonly setMessage: (message: string | null) => void\n readonly runner: CreateRunner\n readonly setActiveDir: (dir: string | null) => void\n}) => {\n const inputs = resolveCreateInputs(input.state.cwd, input.nextValues)\n const parsed = parseArgs(buildCreateArgs(inputs))\n if (Either.isLeft(parsed)) {\n input.setMessage(formatParseError(parsed.left))\n input.setView({ _tag: \"Menu\" })\n return\n }\n\n const effect = buildCreateEffect(parsed.right, input.state, input.setActiveDir, input.setMessage)\n input.runner.runEffect(effect)\n input.setView({ _tag: \"Menu\" })\n input.setMessage(null)\n}\n\nconst handleCreateReturn = (context: CreateReturnContext) => {\n const step = createSteps[context.view.step]\n if (!step) {\n context.setView({ _tag: \"Menu\" })\n return\n }\n\n const buffer = context.view.buffer.trim()\n const currentDefaults = resolveCreateInputs(context.state.cwd, context.view.values)\n const nextValues: Partial<Mutable<CreateInputs>> = { ...context.view.values }\n const updated = applyCreateStep({\n step,\n buffer,\n currentDefaults,\n nextValues,\n cwd: context.state.cwd,\n setMessage: context.setMessage\n })\n if (!updated) {\n return\n }\n\n const nextStep = context.view.step + 1\n if (nextStep < createSteps.length) {\n context.setView({ _tag: \"Create\", step: nextStep, buffer: \"\", values: nextValues })\n context.setMessage(null)\n return\n }\n\n finalizeCreateFlow({\n state: context.state,\n nextValues,\n setView: context.setView,\n setMessage: context.setMessage,\n runner: context.runner,\n setActiveDir: context.setActiveDir\n })\n}\n\nexport const startCreateView = (\n setView: (view: ViewState) => void,\n setMessage: (message: string | null) => void,\n buffer = \"\"\n) => {\n setView({ _tag: \"Create\", step: 0, buffer, values: {} })\n setMessage(null)\n}\n\nexport const handleCreateInput = (\n input: string,\n key: {\n readonly escape?: boolean\n readonly return?: boolean\n readonly backspace?: boolean\n readonly delete?: boolean\n },\n view: Extract<ViewState, { readonly _tag: \"Create\" }>,\n context: CreateContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.return) {\n handleCreateReturn({ ...context, view })\n return\n }\n const nextBuffer = nextBufferValue(input, key, view.buffer)\n if (nextBuffer !== null) {\n context.setView({ ...view, buffer: nextBuffer })\n }\n}\n","import type * as FileSystem from \"@effect/platform/FileSystem\"\nimport type * as Path from \"@effect/platform/Path\"\nimport { Effect } from \"effect\"\n\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\n\nexport const countAuthAccountDirectories = (\n fs: FileSystem.FileSystem,\n path: Path.Path,\n root: string\n): Effect.Effect<number, AppError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(root))\n if (!exists) {\n return 0\n }\n const entries = yield* _(fs.readDirectory(root))\n let count = 0\n for (const entry of entries) {\n if (entry === \".image\") {\n continue\n }\n const fullPath = path.join(root, entry)\n const info = yield* _(fs.stat(fullPath))\n if (info.type === \"Directory\") {\n count += 1\n }\n }\n return count\n })\n","import { parseEnvEntries } from \"@effect-template/lib/usecases/env-file\"\n\nexport const normalizeLabel = (value: string): string => {\n const trimmed = value.trim()\n if (trimmed.length === 0) {\n return \"\"\n }\n const normalized = trimmed\n .toUpperCase()\n .replaceAll(/[^A-Z0-9]+/g, \"_\")\n\n let start = 0\n while (start < normalized.length && normalized[start] === \"_\") {\n start += 1\n }\n let end = normalized.length\n while (end > start && normalized[end - 1] === \"_\") {\n end -= 1\n }\n const cleaned = normalized.slice(start, end)\n return cleaned.length > 0 ? cleaned : \"\"\n}\n\nexport const buildLabeledEnvKey = (baseKey: string, label: string): string => {\n const normalized = normalizeLabel(label)\n if (normalized.length === 0 || normalized === \"DEFAULT\") {\n return baseKey\n }\n return `${baseKey}__${normalized}`\n}\n\nexport const countKeyEntries = (envText: string, baseKey: string): number => {\n const prefix = `${baseKey}__`\n return parseEnvEntries(envText)\n .filter((entry) => entry.value.trim().length > 0 && (entry.key === baseKey || entry.key.startsWith(prefix)))\n .length\n}\n","import * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { ensureEnvFile, parseEnvEntries, readEnvText, upsertEnvKey } from \"@effect-template/lib/usecases/env-file\"\nimport { type AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport { autoSyncState } from \"@effect-template/lib/usecases/state-repo\"\n\nimport { countAuthAccountDirectories } from \"./menu-auth-helpers.js\"\nimport { buildLabeledEnvKey, countKeyEntries, normalizeLabel } from \"./menu-labeled-env.js\"\nimport type { AuthFlow, AuthSnapshot, MenuEnv } from \"./menu-types.js\"\n\nexport type AuthMenuAction = AuthFlow | \"Refresh\" | \"Back\"\n\ntype AuthMenuItem = {\n readonly action: AuthMenuAction\n readonly label: string\n}\n\nexport type AuthEnvFlow = Extract<AuthFlow, \"GithubRemove\" | \"GitSet\" | \"GitRemove\">\n\nexport type AuthPromptStep = {\n readonly key: \"label\" | \"token\" | \"user\"\n readonly label: string\n readonly required: boolean\n readonly secret: boolean\n}\n\nconst authMenuItems: ReadonlyArray<AuthMenuItem> = [\n { action: \"GithubOauth\", label: \"GitHub: login via OAuth (web)\" },\n { action: \"GithubRemove\", label: \"GitHub: remove token\" },\n { action: \"GitSet\", label: \"Git: add/update credentials\" },\n { action: \"GitRemove\", label: \"Git: remove credentials\" },\n { action: \"ClaudeOauth\", label: \"Claude Code: login via OAuth (web)\" },\n { action: \"ClaudeLogout\", label: \"Claude Code: logout (clear cache)\" },\n { action: \"Refresh\", label: \"Refresh snapshot\" },\n { action: \"Back\", label: \"Back to main menu\" }\n]\n\nconst flowSteps: Readonly<Record<AuthFlow, ReadonlyArray<AuthPromptStep>>> = {\n GithubOauth: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n GithubRemove: [\n { key: \"label\", label: \"Label to remove (empty = default)\", required: false, secret: false }\n ],\n GitSet: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false },\n { key: \"token\", label: \"Git auth token\", required: true, secret: true },\n { key: \"user\", label: \"Git auth user (empty = x-access-token)\", required: false, secret: false }\n ],\n GitRemove: [\n { key: \"label\", label: \"Label to remove (empty = default)\", required: false, secret: false }\n ],\n ClaudeOauth: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ClaudeLogout: [\n { key: \"label\", label: \"Label to logout (empty = default)\", required: false, secret: false }\n ]\n}\n\nconst flowTitle = (flow: AuthFlow): string =>\n Match.value(flow).pipe(\n Match.when(\"GithubOauth\", () => \"GitHub OAuth\"),\n Match.when(\"GithubRemove\", () => \"GitHub remove\"),\n Match.when(\"GitSet\", () => \"Git credentials\"),\n Match.when(\"GitRemove\", () => \"Git remove\"),\n Match.when(\"ClaudeOauth\", () => \"Claude Code OAuth\"),\n Match.when(\"ClaudeLogout\", () => \"Claude Code logout\"),\n Match.exhaustive\n )\n\nexport const successMessage = (flow: AuthFlow, label: string): string =>\n Match.value(flow).pipe(\n Match.when(\"GithubOauth\", () => `Saved GitHub token (${label}).`),\n Match.when(\"GithubRemove\", () => `Removed GitHub token (${label}).`),\n Match.when(\"GitSet\", () => `Saved Git credentials (${label}).`),\n Match.when(\"GitRemove\", () => `Removed Git credentials (${label}).`),\n Match.when(\"ClaudeOauth\", () => `Saved Claude Code login (${label}).`),\n Match.when(\"ClaudeLogout\", () => `Logged out Claude Code (${label}).`),\n Match.exhaustive\n )\n\nconst buildGlobalEnvPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/env/global.env`\nconst buildClaudeAuthPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/auth/claude`\n\ntype AuthEnvText = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly globalEnvPath: string\n readonly claudeAuthPath: string\n readonly envText: string\n}\n\nconst loadAuthEnvText = (\n cwd: string\n): Effect.Effect<AuthEnvText, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const globalEnvPath = buildGlobalEnvPath(cwd)\n const claudeAuthPath = buildClaudeAuthPath(cwd)\n yield* _(ensureEnvFile(fs, path, globalEnvPath))\n const envText = yield* _(readEnvText(fs, globalEnvPath))\n return { fs, path, globalEnvPath, claudeAuthPath, envText }\n })\n\nexport const readAuthSnapshot = (\n cwd: string\n): Effect.Effect<AuthSnapshot, AppError, MenuEnv> =>\n pipe(\n loadAuthEnvText(cwd),\n Effect.flatMap(({ claudeAuthPath, envText, fs, globalEnvPath, path }) =>\n pipe(\n countAuthAccountDirectories(fs, path, claudeAuthPath),\n Effect.map((claudeAuthEntries) => ({\n globalEnvPath,\n claudeAuthPath,\n totalEntries: parseEnvEntries(envText).filter((entry) => entry.value.trim().length > 0).length,\n githubTokenEntries: countKeyEntries(envText, \"GITHUB_TOKEN\"),\n gitTokenEntries: countKeyEntries(envText, \"GIT_AUTH_TOKEN\"),\n gitUserEntries: countKeyEntries(envText, \"GIT_AUTH_USER\"),\n claudeAuthEntries\n }))\n )\n )\n )\n\nexport const writeAuthFlow = (\n cwd: string,\n flow: AuthEnvFlow,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n loadAuthEnvText(cwd),\n Effect.flatMap(({ envText, fs, globalEnvPath }) => {\n const label = values[\"label\"] ?? \"\"\n const canonicalLabel = (() => {\n const normalized = normalizeLabel(label)\n return normalized.length === 0 || normalized === \"DEFAULT\" ? \"default\" : normalized\n })()\n const token = (values[\"token\"] ?? \"\").trim()\n const user = (values[\"user\"] ?? \"\").trim()\n const nextText = Match.value(flow).pipe(\n Match.when(\"GithubRemove\", () => upsertEnvKey(envText, buildLabeledEnvKey(\"GITHUB_TOKEN\", label), \"\")),\n Match.when(\"GitSet\", () => {\n const withToken = upsertEnvKey(envText, buildLabeledEnvKey(\"GIT_AUTH_TOKEN\", label), token)\n const resolvedUser = user.length > 0 ? user : \"x-access-token\"\n return upsertEnvKey(withToken, buildLabeledEnvKey(\"GIT_AUTH_USER\", label), resolvedUser)\n }),\n Match.when(\"GitRemove\", () => {\n const withoutToken = upsertEnvKey(envText, buildLabeledEnvKey(\"GIT_AUTH_TOKEN\", label), \"\")\n return upsertEnvKey(withoutToken, buildLabeledEnvKey(\"GIT_AUTH_USER\", label), \"\")\n }),\n Match.exhaustive\n )\n const syncMessage = Match.value(flow).pipe(\n Match.when(\"GithubRemove\", () => `chore(state): auth gh logout ${canonicalLabel}`),\n Match.when(\"GitSet\", () => `chore(state): auth git ${canonicalLabel}`),\n Match.when(\"GitRemove\", () => `chore(state): auth git logout ${canonicalLabel}`),\n Match.exhaustive\n )\n return pipe(\n fs.writeFileString(globalEnvPath, nextText),\n Effect.zipRight(autoSyncState(syncMessage))\n )\n }),\n Effect.asVoid\n )\n\nexport const authViewTitle = (flow: AuthFlow): string => flowTitle(flow)\n\nexport const authViewSteps = (flow: AuthFlow): ReadonlyArray<AuthPromptStep> => flowSteps[flow]\n\nexport const authMenuLabels = (): ReadonlyArray<string> => authMenuItems.map((item) => item.label)\n\nexport const authMenuActionByIndex = (index: number): AuthMenuAction | null => {\n const item = authMenuItems[index]\n return item ? item.action : null\n}\n\nexport const authMenuSize = (): number => authMenuItems.length\n","export const parseMenuIndex = (input: string): number | null => {\n const trimmed = input.trim()\n if (trimmed.length === 0) {\n return null\n }\n const parsed = Number(trimmed)\n if (!Number.isInteger(parsed)) {\n return null\n }\n const index = parsed - 1\n return index >= 0 ? index : null\n}\n\ntype PromptStep = {\n readonly key: string\n readonly label: string\n readonly required: boolean\n}\n\ntype PromptView = {\n readonly step: number\n readonly buffer: string\n readonly values: Readonly<Record<string, string>>\n}\n\ntype PromptContext<V extends PromptView> = {\n readonly setView: (view: V) => void\n readonly setMessage: (message: string | null) => void\n}\n\nexport const submitPromptStep = <V extends PromptView>(\n view: V,\n steps: ReadonlyArray<PromptStep>,\n context: PromptContext<V>,\n onCancel: () => void,\n onSubmit: (values: Readonly<Record<string, string>>) => void\n): void => {\n const step = steps[view.step]\n if (!step) {\n onCancel()\n return\n }\n\n const value = view.buffer.trim()\n if (step.required && value.length === 0) {\n context.setMessage(`${step.label} is required.`)\n return\n }\n\n const nextValues: Readonly<Record<string, string>> = { ...view.values, [step.key]: value }\n const nextStep = view.step + 1\n if (nextStep < steps.length) {\n context.setView({ ...view, step: nextStep, buffer: \"\", values: nextValues })\n context.setMessage(null)\n return\n }\n\n onSubmit(nextValues)\n}\n\ntype MenuNumberInputContext = {\n readonly setMessage: (message: string | null) => void\n}\n\nexport const handleMenuNumberInput = <A>(\n input: string,\n context: MenuNumberInputContext,\n actionByIndex: (index: number) => A | null,\n runAction: (action: A) => void\n): void => {\n const index = parseMenuIndex(input)\n if (index === null) {\n if (input.trim().length > 0) {\n context.setMessage(\"Use arrows + Enter, or type a number from the list.\")\n }\n return\n }\n\n const action = actionByIndex(index)\n if (action === null) {\n context.setMessage(`Unknown action: ${input.trim()}`)\n return\n }\n runAction(action)\n}\n","import { Effect, Match, pipe } from \"effect\"\n\nimport { authClaudeLogin, authClaudeLogout, authGithubLogin, claudeAuthRoot } from \"@effect-template/lib/usecases/auth\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\n\nimport {\n type AuthMenuAction,\n authMenuActionByIndex,\n authMenuSize,\n authViewSteps,\n readAuthSnapshot,\n successMessage,\n writeAuthFlow\n} from \"./menu-auth-data.js\"\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { handleMenuNumberInput, submitPromptStep } from \"./menu-input-utils.js\"\nimport { pauseOnError, resetToMenu, resumeSshWithSkipInputs, withSuspendedTui } from \"./menu-shared.js\"\nimport type {\n AuthFlow,\n AuthSnapshot,\n MenuEnv,\n MenuKeyInput,\n MenuRunner,\n MenuState,\n MenuViewContext,\n ViewState\n} from \"./menu-types.js\"\n\ntype AuthContext = MenuViewContext & {\n readonly state: MenuState\n readonly runner: MenuRunner\n}\n\ntype AuthInputContext = AuthContext & {\n readonly setSshActive: (active: boolean) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\ntype AuthPromptView = Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>\n\nconst defaultLabel = (value: string): string => {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : \"default\"\n}\n\nconst startAuthMenuWithSnapshot = (\n snapshot: AuthSnapshot,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({ _tag: \"AuthMenu\", selected: 0, snapshot })\n context.setMessage(null)\n}\n\nconst startAuthPrompt = (\n snapshot: AuthSnapshot,\n flow: AuthFlow,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({\n _tag: \"AuthPrompt\",\n flow,\n step: 0,\n buffer: \"\",\n values: {},\n snapshot\n })\n context.setMessage(null)\n}\n\nconst resolveLabelOption = (values: Readonly<Record<string, string>>): string | null => {\n const labelValue = (values[\"label\"] ?? \"\").trim()\n return labelValue.length > 0 ? labelValue : null\n}\n\nconst resolveAuthPromptEffect = (\n view: AuthPromptView,\n cwd: string,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> => {\n const labelOption = resolveLabelOption(values)\n return Match.value(view.flow).pipe(\n Match.when(\"GithubOauth\", () =>\n authGithubLogin({\n _tag: \"AuthGithubLogin\",\n label: labelOption,\n token: null,\n scopes: null,\n envGlobalPath: view.snapshot.globalEnvPath\n })),\n Match.when(\"ClaudeOauth\", () =>\n authClaudeLogin({\n _tag: \"AuthClaudeLogin\",\n label: labelOption,\n claudeAuthPath: claudeAuthRoot\n })),\n Match.when(\"ClaudeLogout\", () =>\n authClaudeLogout({\n _tag: \"AuthClaudeLogout\",\n label: labelOption,\n claudeAuthPath: claudeAuthRoot\n })),\n Match.when(\"GithubRemove\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.when(\"GitSet\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.when(\"GitRemove\", (flow) => writeAuthFlow(cwd, flow, values)),\n Match.exhaustive\n )\n}\n\nconst runAuthPromptEffect = (\n effect: Effect.Effect<void, AppError, MenuEnv>,\n view: AuthPromptView,\n label: string,\n context: AuthInputContext,\n options: { readonly suspendTui: boolean }\n) => {\n const withOptionalSuspension = options.suspendTui\n ? withSuspendedTui(effect, {\n onError: pauseOnError(renderError),\n onResume: resumeSshWithSkipInputs(context)\n })\n : effect\n\n context.setSshActive(options.suspendTui)\n context.runner.runEffect(\n pipe(\n withOptionalSuspension,\n Effect.zipRight(readAuthSnapshot(context.state.cwd)),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startAuthMenuWithSnapshot(snapshot, context)\n context.setMessage(successMessage(view.flow, label))\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst loadAuthMenuView = (\n cwd: string,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n readAuthSnapshot(cwd),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startAuthMenuWithSnapshot(snapshot, context)\n })\n ),\n Effect.asVoid\n )\n\nconst runAuthAction = (\n action: AuthMenuAction,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n if (action === \"Back\") {\n resetToMenu(context)\n return\n }\n if (action === \"Refresh\") {\n context.runner.runEffect(loadAuthMenuView(context.state.cwd, context))\n return\n }\n startAuthPrompt(view.snapshot, action, context)\n}\n\nconst submitAuthPrompt = (\n view: AuthPromptView,\n context: AuthInputContext\n) => {\n const steps = authViewSteps(view.flow)\n submitPromptStep(\n view,\n steps,\n context,\n () => {\n startAuthMenuWithSnapshot(view.snapshot, context)\n },\n (nextValues) => {\n const label = defaultLabel(nextValues[\"label\"] ?? \"\")\n const effect = resolveAuthPromptEffect(view, context.state.cwd, nextValues)\n runAuthPromptEffect(effect, view, label, context, {\n suspendTui: view.flow === \"GithubOauth\" || view.flow === \"ClaudeOauth\" || view.flow === \"ClaudeLogout\"\n })\n }\n )\n}\n\nconst setAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n selected: number,\n context: AuthContext\n) => {\n context.setView({\n ...view,\n selected\n })\n}\n\nconst shiftAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n delta: number,\n context: AuthContext\n) => {\n const menuSize = authMenuSize()\n const selected = (view.selected + delta + menuSize) % menuSize\n setAuthMenuSelection(view, selected, context)\n}\n\nconst runAuthMenuSelection = (\n selected: number,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n const action = authMenuActionByIndex(selected)\n if (action === null) {\n return\n }\n runAuthAction(action, view, context)\n}\n\nconst handleAuthMenuNumberInput = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n handleMenuNumberInput(input, context, authMenuActionByIndex, (action) => {\n runAuthAction(action, view, context)\n })\n}\n\nconst handleAuthMenuInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" }>,\n context: AuthContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.upArrow) {\n shiftAuthMenuSelection(view, -1, context)\n return\n }\n if (key.downArrow) {\n shiftAuthMenuSelection(view, 1, context)\n return\n }\n if (key.return) {\n runAuthMenuSelection(view.selected, view, context)\n return\n }\n handleAuthMenuNumberInput(input, view, context)\n}\n\nconst handleAuthPromptInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>,\n context: AuthInputContext\n) => {\n if (key.escape) {\n startAuthMenuWithSnapshot(view.snapshot, context)\n return\n }\n if (key.return) {\n submitAuthPrompt(view, context)\n return\n }\n setAuthPromptBuffer({ input, key, view, context })\n}\n\ntype SetAuthPromptBufferArgs = {\n readonly input: string\n readonly key: MenuKeyInput\n readonly view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>\n readonly context: Pick<MenuViewContext, \"setView\">\n}\n\nconst setAuthPromptBuffer = (\n args: SetAuthPromptBufferArgs\n) => {\n const { context, input, key, view } = args\n const nextBuffer = nextBufferValue(input, key, view.buffer)\n if (nextBuffer === null) {\n return\n }\n context.setView({ ...view, buffer: nextBuffer })\n}\n\nexport const openAuthMenu = (context: AuthContext): void => {\n context.setMessage(\"Loading auth profiles...\")\n context.runner.runEffect(loadAuthMenuView(context.state.cwd, context))\n}\n\nexport const handleAuthInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" | \"AuthPrompt\" }>,\n context: AuthInputContext\n) => {\n if (view._tag === \"AuthMenu\") {\n handleAuthMenuInput(input, key, view, context)\n return\n }\n handleAuthPromptInput(input, key, view, context)\n}\n","import { runCommandCapture } from \"@effect-template/lib/shell/command-runner\"\nimport { runDockerPsNames } from \"@effect-template/lib/shell/docker\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport type { MenuEnv, SelectProjectRuntime, ViewState } from \"./menu-types.js\"\n\nconst emptyRuntimeByProject = (): Readonly<Record<string, SelectProjectRuntime>> => ({})\n\nconst stoppedRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst countSshSessionsScript = \"who -u 2>/dev/null | wc -l | tr -d '[:space:]'\"\nconst dockerZeroStartedAt = \"0001-01-01T00:00:00Z\"\n\ntype ContainerStartTime = {\n readonly startedAtIso: string\n readonly startedAtEpochMs: number\n}\n\nconst parseSshSessionCount = (raw: string): number => {\n const parsed = Number.parseInt(raw.trim(), 10)\n if (Number.isNaN(parsed) || parsed < 0) {\n return 0\n }\n return parsed\n}\n\nconst parseContainerStartedAt = (raw: string): ContainerStartTime | null => {\n const trimmed = raw.trim()\n if (trimmed.length === 0 || trimmed === dockerZeroStartedAt) {\n return null\n }\n const startedAtEpochMs = Date.parse(trimmed)\n if (Number.isNaN(startedAtEpochMs)) {\n return null\n }\n return {\n startedAtIso: trimmed,\n startedAtEpochMs\n }\n}\n\nconst toRuntimeMap = (\n entries: ReadonlyArray<readonly [string, SelectProjectRuntime]>\n): Readonly<Record<string, SelectProjectRuntime>> => {\n const runtimeByProject: Record<string, SelectProjectRuntime> = {}\n for (const [projectDir, runtime] of entries) {\n runtimeByProject[projectDir] = runtime\n }\n return runtimeByProject\n}\n\nconst countContainerSshSessions = (\n containerName: string\n): Effect.Effect<number, never, MenuEnv> =>\n pipe(\n runCommandCapture(\n {\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"exec\", containerName, \"bash\", \"-lc\", countSshSessionsScript]\n },\n [0],\n (exitCode) => ({ _tag: \"CommandFailedError\", command: \"docker exec who -u\", exitCode })\n ),\n Effect.match({\n onFailure: () => 0,\n onSuccess: (raw) => parseSshSessionCount(raw)\n })\n )\n\nconst inspectContainerStartedAt = (\n containerName: string\n): Effect.Effect<ContainerStartTime | null, never, MenuEnv> =>\n pipe(\n runCommandCapture(\n {\n cwd: process.cwd(),\n command: \"docker\",\n args: [\"inspect\", \"--format\", \"{{.State.StartedAt}}\", containerName]\n },\n [0],\n (exitCode) => ({ _tag: \"CommandFailedError\", command: \"docker inspect .State.StartedAt\", exitCode })\n ),\n Effect.match({\n onFailure: () => null,\n onSuccess: (raw) => parseContainerStartedAt(raw)\n })\n )\n\n// CHANGE: enrich select items with runtime state and SSH session counts\n// WHY: prevent stopping/deleting containers that are currently used via SSH\n// QUOTE(ТЗ): \"писать скок SSH подключений к контейнеру сейчас\"\n// REF: issue-47\n// SOURCE: n/a\n// FORMAT THEOREM: forall p: runtime(p) -> {running(p), ssh_sessions(p), started_at(p)}\n// PURITY: SHELL\n// EFFECT: Effect<Record<string, SelectProjectRuntime>, never, MenuEnv>\n// INVARIANT: projects without a known container start have startedAt = null\n// COMPLEXITY: O(n + docker_ps + docker_exec + docker_inspect)\nexport const loadRuntimeByProject = (\n items: ReadonlyArray<ProjectItem>\n): Effect.Effect<Readonly<Record<string, SelectProjectRuntime>>, never, MenuEnv> =>\n pipe(\n runDockerPsNames(process.cwd()),\n Effect.flatMap((runningNames) =>\n Effect.forEach(\n items,\n (item) => {\n const running = runningNames.includes(item.containerName)\n const sshSessionsEffect = running\n ? countContainerSshSessions(item.containerName)\n : Effect.succeed(0)\n return pipe(\n Effect.all([sshSessionsEffect, inspectContainerStartedAt(item.containerName)]),\n Effect.map(([sshSessions, startedAt]): SelectProjectRuntime => ({\n running,\n sshSessions,\n startedAtIso: startedAt?.startedAtIso ?? null,\n startedAtEpochMs: startedAt?.startedAtEpochMs ?? null\n })),\n Effect.map((runtime): readonly [string, SelectProjectRuntime] => [item.projectDir, runtime])\n )\n },\n { concurrency: 4 }\n )\n ),\n Effect.map((entries) => toRuntimeMap(entries)),\n Effect.match({\n onFailure: () => emptyRuntimeByProject(),\n onSuccess: (runtimeByProject) => runtimeByProject\n })\n )\n\nexport const runtimeForSelection = (\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n selected: ProjectItem\n): SelectProjectRuntime => view.runtimeByProject[selected.projectDir] ?? stoppedRuntime()\n","import type { PlatformError } from \"@effect/platform/Error\"\nimport type * as FileSystem from \"@effect/platform/FileSystem\"\nimport { Effect } from \"effect\"\n\nconst oauthTokenFileName = \".oauth-token\"\nconst legacyConfigFileName = \".config.json\"\nconst credentialsFileName = \".credentials.json\"\nconst nestedCredentialsFileName = \".claude/.credentials.json\"\n\nconst hasFileAtPath = (\n fs: FileSystem.FileSystem,\n filePath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const exists = yield* _(fs.exists(filePath))\n if (!exists) {\n return false\n }\n const info = yield* _(fs.stat(filePath))\n return info.type === \"File\"\n })\n\nconst hasNonEmptyOauthToken = (\n fs: FileSystem.FileSystem,\n tokenPath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const hasFile = yield* _(hasFileAtPath(fs, tokenPath))\n if (!hasFile) {\n return false\n }\n const tokenValue = yield* _(fs.readFileString(tokenPath), Effect.orElseSucceed(() => \"\"))\n return tokenValue.trim().length > 0\n })\n\nconst hasLegacyClaudeAuthFile = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<boolean, PlatformError> =>\n Effect.gen(function*(_) {\n const entries = yield* _(fs.readDirectory(accountPath))\n for (const entry of entries) {\n if (!entry.startsWith(\".claude\") || !entry.endsWith(\".json\")) {\n continue\n }\n const isFile = yield* _(hasFileAtPath(fs, `${accountPath}/${entry}`))\n if (isFile) {\n return true\n }\n }\n return false\n })\n\nexport const hasClaudeAccountCredentials = (\n fs: FileSystem.FileSystem,\n accountPath: string\n): Effect.Effect<boolean, PlatformError> =>\n hasFileAtPath(fs, `${accountPath}/${credentialsFileName}`).pipe(\n Effect.flatMap((hasCredentialsFile) => {\n if (hasCredentialsFile) {\n return Effect.succeed(true)\n }\n return hasFileAtPath(fs, `${accountPath}/${nestedCredentialsFileName}`)\n }),\n Effect.flatMap((hasNestedCredentialsFile) => {\n if (hasNestedCredentialsFile) {\n return Effect.succeed(true)\n }\n return hasFileAtPath(fs, `${accountPath}/${legacyConfigFileName}`)\n }),\n Effect.flatMap((hasConfig) => {\n if (hasConfig) {\n return Effect.succeed(true)\n }\n return hasNonEmptyOauthToken(fs, `${accountPath}/${oauthTokenFileName}`).pipe(\n Effect.flatMap((hasOauthToken) => {\n if (hasOauthToken) {\n return Effect.succeed(true)\n }\n return hasLegacyClaudeAuthFile(fs, accountPath)\n })\n )\n })\n )\n","import * as FileSystem from \"@effect/platform/FileSystem\"\nimport * as Path from \"@effect/platform/Path\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { AuthError } from \"@effect-template/lib/shell/errors\"\nimport { normalizeAccountLabel } from \"@effect-template/lib/usecases/auth-helpers\"\nimport { ensureEnvFile, findEnvValue, readEnvText, upsertEnvKey } from \"@effect-template/lib/usecases/env-file\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { defaultProjectsRoot } from \"@effect-template/lib/usecases/menu-helpers\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { autoSyncState } from \"@effect-template/lib/usecases/state-repo\"\n\nimport { countAuthAccountDirectories } from \"./menu-auth-helpers.js\"\nimport { buildLabeledEnvKey, countKeyEntries, normalizeLabel } from \"./menu-labeled-env.js\"\nimport { hasClaudeAccountCredentials } from \"./menu-project-auth-claude.js\"\nimport type { MenuEnv, ProjectAuthFlow, ProjectAuthSnapshot } from \"./menu-types.js\"\n\nexport type ProjectAuthMenuAction = ProjectAuthFlow | \"Refresh\" | \"Back\"\n\ntype ProjectAuthMenuItem = {\n readonly action: ProjectAuthMenuAction\n readonly label: string\n}\n\nexport type ProjectAuthPromptStep = {\n readonly key: \"label\"\n readonly label: string\n readonly required: boolean\n readonly secret: boolean\n}\n\nconst projectAuthMenuItems: ReadonlyArray<ProjectAuthMenuItem> = [\n { action: \"ProjectGithubConnect\", label: \"Project: GitHub connect label\" },\n { action: \"ProjectGithubDisconnect\", label: \"Project: GitHub disconnect\" },\n { action: \"ProjectGitConnect\", label: \"Project: Git connect label\" },\n { action: \"ProjectGitDisconnect\", label: \"Project: Git disconnect\" },\n { action: \"ProjectClaudeConnect\", label: \"Project: Claude connect label\" },\n { action: \"ProjectClaudeDisconnect\", label: \"Project: Claude disconnect\" },\n { action: \"Refresh\", label: \"Refresh snapshot\" },\n { action: \"Back\", label: \"Back to main menu\" }\n]\n\nconst flowSteps: Readonly<Record<ProjectAuthFlow, ReadonlyArray<ProjectAuthPromptStep>>> = {\n ProjectGithubConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectGithubDisconnect: [],\n ProjectGitConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectGitDisconnect: [],\n ProjectClaudeConnect: [\n { key: \"label\", label: \"Label (empty = default)\", required: false, secret: false }\n ],\n ProjectClaudeDisconnect: []\n}\n\nconst resolveCanonicalLabel = (value: string): string => {\n const normalized = normalizeLabel(value)\n return normalized.length === 0 || normalized === \"DEFAULT\" ? \"default\" : normalized\n}\n\nconst githubTokenBaseKey = \"GITHUB_TOKEN\"\nconst gitTokenBaseKey = \"GIT_AUTH_TOKEN\"\nconst gitUserBaseKey = \"GIT_AUTH_USER\"\n\nconst projectGithubLabelKey = \"GITHUB_AUTH_LABEL\"\nconst projectGitLabelKey = \"GIT_AUTH_LABEL\"\nconst projectClaudeLabelKey = \"CLAUDE_AUTH_LABEL\"\n\nconst defaultGitUser = \"x-access-token\"\n\ntype ProjectAuthEnvText = {\n readonly fs: FileSystem.FileSystem\n readonly path: Path.Path\n readonly globalEnvPath: string\n readonly projectEnvPath: string\n readonly claudeAuthPath: string\n readonly globalEnvText: string\n readonly projectEnvText: string\n}\n\nconst buildGlobalEnvPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/env/global.env`\nconst buildClaudeAuthPath = (cwd: string): string => `${defaultProjectsRoot(cwd)}/.orch/auth/claude`\n\nconst loadProjectAuthEnvText = (\n project: ProjectItem\n): Effect.Effect<ProjectAuthEnvText, AppError, MenuEnv> =>\n Effect.gen(function*(_) {\n const fs = yield* _(FileSystem.FileSystem)\n const path = yield* _(Path.Path)\n const globalEnvPath = buildGlobalEnvPath(process.cwd())\n const claudeAuthPath = buildClaudeAuthPath(process.cwd())\n yield* _(ensureEnvFile(fs, path, globalEnvPath))\n yield* _(ensureEnvFile(fs, path, project.envProjectPath))\n const globalEnvText = yield* _(readEnvText(fs, globalEnvPath))\n const projectEnvText = yield* _(readEnvText(fs, project.envProjectPath))\n return {\n fs,\n path,\n globalEnvPath,\n projectEnvPath: project.envProjectPath,\n claudeAuthPath,\n globalEnvText,\n projectEnvText\n }\n })\n\nexport const readProjectAuthSnapshot = (\n project: ProjectItem\n): Effect.Effect<ProjectAuthSnapshot, AppError, MenuEnv> =>\n pipe(\n loadProjectAuthEnvText(project),\n Effect.flatMap(({ claudeAuthPath, fs, globalEnvPath, globalEnvText, path, projectEnvPath, projectEnvText }) =>\n pipe(\n countAuthAccountDirectories(fs, path, claudeAuthPath),\n Effect.map((claudeAuthEntries) => ({\n projectDir: project.projectDir,\n projectName: project.displayName,\n envGlobalPath: globalEnvPath,\n envProjectPath: projectEnvPath,\n claudeAuthPath,\n githubTokenEntries: countKeyEntries(globalEnvText, githubTokenBaseKey),\n gitTokenEntries: countKeyEntries(globalEnvText, gitTokenBaseKey),\n claudeAuthEntries,\n activeGithubLabel: findEnvValue(projectEnvText, projectGithubLabelKey),\n activeGitLabel: findEnvValue(projectEnvText, projectGitLabelKey),\n activeClaudeLabel: findEnvValue(projectEnvText, projectClaudeLabelKey)\n }))\n )\n )\n )\n\nconst missingSecret = (\n provider: string,\n label: string,\n envPath: string\n): AuthError =>\n new AuthError({\n message: `${provider} not connected: label '${label}' not found in ${envPath}`\n })\n\ntype ProjectEnvUpdateSpec = {\n readonly fs: FileSystem.FileSystem\n readonly rawLabel: string\n readonly canonicalLabel: string\n readonly globalEnvPath: string\n readonly globalEnvText: string\n readonly projectEnvText: string\n readonly claudeAuthPath: string\n}\n\nconst updateProjectGithubConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const key = buildLabeledEnvKey(githubTokenBaseKey, spec.rawLabel)\n const token = findEnvValue(spec.globalEnvText, key)\n if (token === null) {\n return Effect.fail(missingSecret(\"GitHub token\", spec.canonicalLabel, spec.globalEnvPath))\n }\n const withGitToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", token)\n const withGhToken = upsertEnvKey(withGitToken, \"GH_TOKEN\", token)\n const withoutGitLabel = upsertEnvKey(withGhToken, projectGitLabelKey, \"\")\n return Effect.succeed(upsertEnvKey(withoutGitLabel, projectGithubLabelKey, spec.canonicalLabel))\n}\n\nconst clearProjectGitLabels = (envText: string): string => {\n const withoutGhToken = upsertEnvKey(envText, \"GH_TOKEN\", \"\")\n const withoutGitLabel = upsertEnvKey(withoutGhToken, projectGitLabelKey, \"\")\n return upsertEnvKey(withoutGitLabel, projectGithubLabelKey, \"\")\n}\n\nconst updateProjectGithubDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n const withoutGitToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", \"\")\n return Effect.succeed(clearProjectGitLabels(withoutGitToken))\n}\n\nconst updateProjectGitConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const tokenKey = buildLabeledEnvKey(gitTokenBaseKey, spec.rawLabel)\n const userKey = buildLabeledEnvKey(gitUserBaseKey, spec.rawLabel)\n const token = findEnvValue(spec.globalEnvText, tokenKey)\n if (token === null) {\n return Effect.fail(missingSecret(\"Git credentials\", spec.canonicalLabel, spec.globalEnvPath))\n }\n const defaultUser = findEnvValue(spec.globalEnvText, gitUserBaseKey) ?? defaultGitUser\n const user = findEnvValue(spec.globalEnvText, userKey) ?? defaultUser\n const withToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", token)\n const withUser = upsertEnvKey(withToken, \"GIT_AUTH_USER\", user)\n const withGhToken = upsertEnvKey(withUser, \"GH_TOKEN\", token)\n const withGitLabel = upsertEnvKey(withGhToken, projectGitLabelKey, spec.canonicalLabel)\n return Effect.succeed(upsertEnvKey(withGitLabel, projectGithubLabelKey, spec.canonicalLabel))\n}\n\nconst updateProjectGitDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n const withoutToken = upsertEnvKey(spec.projectEnvText, \"GIT_AUTH_TOKEN\", \"\")\n const withoutUser = upsertEnvKey(withoutToken, \"GIT_AUTH_USER\", \"\")\n return Effect.succeed(clearProjectGitLabels(withoutUser))\n}\n\nconst resolveClaudeAccountCandidates = (\n claudeAuthPath: string,\n accountLabel: string\n): ReadonlyArray<string> =>\n accountLabel === \"default\"\n ? [`${claudeAuthPath}/default`, claudeAuthPath]\n : [`${claudeAuthPath}/${accountLabel}`]\n\nconst updateProjectClaudeConnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string, AppError> => {\n const accountLabel = normalizeAccountLabel(spec.rawLabel, \"default\")\n const accountCandidates = resolveClaudeAccountCandidates(spec.claudeAuthPath, accountLabel)\n return Effect.gen(function*(_) {\n for (const accountPath of accountCandidates) {\n const exists = yield* _(spec.fs.exists(accountPath))\n if (!exists) {\n continue\n }\n\n const hasCredentials = yield* _(\n hasClaudeAccountCredentials(spec.fs, accountPath),\n Effect.orElseSucceed(() => false)\n )\n if (hasCredentials) {\n return upsertEnvKey(spec.projectEnvText, projectClaudeLabelKey, spec.canonicalLabel)\n }\n }\n\n return yield* _(Effect.fail(missingSecret(\"Claude Code login\", spec.canonicalLabel, spec.claudeAuthPath)))\n })\n}\n\nconst updateProjectClaudeDisconnect = (spec: ProjectEnvUpdateSpec): Effect.Effect<string> => {\n return Effect.succeed(upsertEnvKey(spec.projectEnvText, projectClaudeLabelKey, \"\"))\n}\n\nconst resolveProjectEnvUpdate = (\n flow: ProjectAuthFlow,\n spec: ProjectEnvUpdateSpec\n): Effect.Effect<string, AppError> =>\n Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () => updateProjectGithubConnect(spec)),\n Match.when(\"ProjectGithubDisconnect\", () => updateProjectGithubDisconnect(spec)),\n Match.when(\"ProjectGitConnect\", () => updateProjectGitConnect(spec)),\n Match.when(\"ProjectGitDisconnect\", () => updateProjectGitDisconnect(spec)),\n Match.when(\"ProjectClaudeConnect\", () => updateProjectClaudeConnect(spec)),\n Match.when(\"ProjectClaudeDisconnect\", () => updateProjectClaudeDisconnect(spec)),\n Match.exhaustive\n )\n\nexport const writeProjectAuthFlow = (\n project: ProjectItem,\n flow: ProjectAuthFlow,\n values: Readonly<Record<string, string>>\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n loadProjectAuthEnvText(project),\n Effect.flatMap(({ claudeAuthPath, fs, globalEnvPath, globalEnvText, projectEnvPath, projectEnvText }) => {\n const rawLabel = values[\"label\"] ?? \"\"\n const canonicalLabel = resolveCanonicalLabel(rawLabel)\n const spec: ProjectEnvUpdateSpec = {\n fs,\n rawLabel,\n canonicalLabel,\n globalEnvPath,\n globalEnvText,\n projectEnvText,\n claudeAuthPath\n }\n const nextProjectEnv = resolveProjectEnvUpdate(flow, spec)\n const syncMessage = Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () =>\n `chore(state): project auth gh ${canonicalLabel} ${project.displayName}`),\n Match.when(\"ProjectGithubDisconnect\", () =>\n `chore(state): project auth gh logout ${project.displayName}`),\n Match.when(\n \"ProjectGitConnect\",\n () => `chore(state): project auth git ${canonicalLabel} ${project.displayName}`\n ),\n Match.when(\"ProjectGitDisconnect\", () => `chore(state): project auth git logout ${project.displayName}`),\n Match.when(\n \"ProjectClaudeConnect\",\n () => `chore(state): project auth claude ${canonicalLabel} ${project.displayName}`\n ),\n Match.when(\"ProjectClaudeDisconnect\", () => `chore(state): project auth claude logout ${project.displayName}`),\n Match.exhaustive\n )\n return pipe(\n nextProjectEnv,\n Effect.flatMap((nextText) => fs.writeFileString(projectEnvPath, nextText)),\n Effect.zipRight(autoSyncState(syncMessage))\n )\n }),\n Effect.asVoid\n )\n\nexport const projectAuthViewSteps = (flow: ProjectAuthFlow): ReadonlyArray<ProjectAuthPromptStep> => flowSteps[flow]\n\nexport const projectAuthMenuLabels = (): ReadonlyArray<string> => projectAuthMenuItems.map((item) => item.label)\n\nexport const projectAuthMenuActionByIndex = (index: number): ProjectAuthMenuAction | null => {\n const item = projectAuthMenuItems[index]\n return item ? item.action : null\n}\n\nexport const projectAuthMenuSize = (): number => projectAuthMenuItems.length\n","import { Effect, Match, pipe } from \"effect\"\n\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport { nextBufferValue } from \"./menu-buffer-input.js\"\nimport { handleMenuNumberInput, submitPromptStep } from \"./menu-input-utils.js\"\nimport {\n type ProjectAuthMenuAction,\n projectAuthMenuActionByIndex,\n projectAuthMenuSize,\n projectAuthViewSteps,\n readProjectAuthSnapshot,\n writeProjectAuthFlow\n} from \"./menu-project-auth-data.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport type {\n MenuEnv,\n MenuKeyInput,\n MenuRunner,\n MenuViewContext,\n ProjectAuthFlow,\n ProjectAuthSnapshot,\n ViewState\n} from \"./menu-types.js\"\n\ntype ProjectAuthContext = Pick<MenuViewContext, \"setView\" | \"setMessage\" | \"setActiveDir\"> & {\n readonly runner: MenuRunner\n}\n\ntype ProjectAuthContextWithProject = ProjectAuthContext & {\n readonly project: ProjectItem\n}\n\nconst startProjectAuthMenu = (\n project: ProjectItem,\n snapshot: ProjectAuthSnapshot,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({ _tag: \"ProjectAuthMenu\", selected: 0, project, snapshot })\n context.setMessage(null)\n}\n\nconst startProjectAuthPrompt = (\n project: ProjectItem,\n snapshot: ProjectAuthSnapshot,\n flow: ProjectAuthFlow,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n) => {\n context.setView({\n _tag: \"ProjectAuthPrompt\",\n flow,\n step: 0,\n buffer: \"\",\n values: {},\n project,\n snapshot\n })\n context.setMessage(null)\n}\n\nconst loadProjectAuthMenuView = (\n project: ProjectItem,\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, AppError, MenuEnv> =>\n pipe(\n readProjectAuthSnapshot(project),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startProjectAuthMenu(project, snapshot, context)\n })\n ),\n Effect.asVoid\n )\n\nconst successMessage = (flow: ProjectAuthFlow, label: string): string =>\n Match.value(flow).pipe(\n Match.when(\"ProjectGithubConnect\", () => `Connected GitHub label (${label}) to project.`),\n Match.when(\"ProjectGithubDisconnect\", () => \"Disconnected GitHub from project.\"),\n Match.when(\"ProjectGitConnect\", () => `Connected Git label (${label}) to project.`),\n Match.when(\"ProjectGitDisconnect\", () => \"Disconnected Git from project.\"),\n Match.when(\"ProjectClaudeConnect\", () => `Connected Claude label (${label}) to project.`),\n Match.when(\"ProjectClaudeDisconnect\", () => \"Disconnected Claude from project.\"),\n Match.exhaustive\n )\n\nconst runProjectAuthEffect = (\n project: ProjectItem,\n flow: ProjectAuthFlow,\n values: Readonly<Record<string, string>>,\n label: string,\n context: ProjectAuthContext\n) => {\n context.runner.runEffect(\n pipe(\n writeProjectAuthFlow(project, flow, values),\n Effect.zipRight(readProjectAuthSnapshot(project)),\n Effect.tap((snapshot) =>\n Effect.sync(() => {\n startProjectAuthMenu(project, snapshot, context)\n context.setMessage(successMessage(flow, label))\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst submitProjectAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n const steps = projectAuthViewSteps(view.flow)\n submitPromptStep(\n view,\n steps,\n context,\n () => {\n startProjectAuthMenu(view.project, view.snapshot, context)\n },\n (nextValues) => {\n const rawLabel = (nextValues[\"label\"] ?? \"\").trim()\n const label = rawLabel.length > 0 ? rawLabel : \"default\"\n runProjectAuthEffect(view.project, view.flow, nextValues, label, context)\n }\n )\n}\n\nconst runProjectAuthAction = (\n action: ProjectAuthMenuAction,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n if (action === \"Back\") {\n resetToMenu(context)\n return\n }\n if (action === \"Refresh\") {\n context.runner.runEffect(loadProjectAuthMenuView(view.project, context))\n return\n }\n\n if (\n action === \"ProjectGithubDisconnect\" || action === \"ProjectGitDisconnect\" || action === \"ProjectClaudeDisconnect\"\n ) {\n runProjectAuthEffect(view.project, action, {}, \"default\", context)\n return\n }\n\n startProjectAuthPrompt(view.project, view.snapshot, action, context)\n}\n\nconst setProjectAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n selected: number,\n context: Pick<MenuViewContext, \"setView\">\n) => {\n context.setView({ ...view, selected })\n}\n\nconst shiftProjectAuthMenuSelection = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n delta: number,\n context: Pick<MenuViewContext, \"setView\">\n) => {\n const menuSize = projectAuthMenuSize()\n const selected = (view.selected + delta + menuSize) % menuSize\n setProjectAuthMenuSelection(view, selected, context)\n}\n\nconst runProjectAuthMenuSelection = (\n selected: number,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n const action = projectAuthMenuActionByIndex(selected)\n if (action === null) {\n return\n }\n runProjectAuthAction(action, view, context)\n}\n\nconst handleProjectAuthMenuNumberInput = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n handleMenuNumberInput(\n input,\n context,\n projectAuthMenuActionByIndex,\n (action) => {\n runProjectAuthAction(action, view, context)\n }\n )\n}\n\nconst handleProjectAuthMenuInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" }>,\n context: ProjectAuthContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (key.upArrow) {\n shiftProjectAuthMenuSelection(view, -1, context)\n return\n }\n if (key.downArrow) {\n shiftProjectAuthMenuSelection(view, 1, context)\n return\n }\n if (key.return) {\n runProjectAuthMenuSelection(view.selected, view, context)\n return\n }\n handleProjectAuthMenuNumberInput(input, view, context)\n}\n\ntype SetPromptBufferArgs = {\n readonly input: string\n readonly key: MenuKeyInput\n readonly view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>\n readonly context: Pick<MenuViewContext, \"setView\">\n}\n\nconst setProjectAuthPromptBuffer = (args: SetPromptBufferArgs) => {\n const nextBuffer = nextBufferValue(args.input, args.key, args.view.buffer)\n if (nextBuffer === null) {\n return\n }\n args.context.setView({ ...args.view, buffer: nextBuffer })\n}\n\nconst handleProjectAuthPromptInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n if (key.escape) {\n startProjectAuthMenu(view.project, view.snapshot, context)\n return\n }\n if (key.return) {\n submitProjectAuthPrompt(view, context)\n return\n }\n setProjectAuthPromptBuffer({ input, key, view, context })\n}\n\nexport const openProjectAuthMenu = (context: ProjectAuthContextWithProject): void => {\n context.setMessage(`Loading project auth (${context.project.displayName})...`)\n context.runner.runEffect(loadProjectAuthMenuView(context.project, context))\n}\n\nexport const handleProjectAuthInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" | \"ProjectAuthPrompt\" }>,\n context: ProjectAuthContext\n) => {\n if (view._tag === \"ProjectAuthMenu\") {\n handleProjectAuthMenuInput(input, key, view, context)\n return\n }\n handleProjectAuthPromptInput(input, key, view, context)\n}\n","import { Effect } from \"effect\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\ntype ConnectDeps<E, R> = {\n readonly connectWithUp: (\n item: ProjectItem\n ) => Effect.Effect<void, E, R>\n readonly enableMcpPlaywright: (\n projectDir: string\n ) => Effect.Effect<void, E, R>\n}\n\nconst normalizedInput = (input: string): string => input.trim().toLowerCase()\n\nexport const isConnectMcpToggleInput = (input: string): boolean => normalizedInput(input) === \"p\"\n\nexport const buildConnectEffect = <E, R>(\n selected: ProjectItem,\n enableMcpPlaywright: boolean,\n deps: ConnectDeps<E, R>\n): Effect.Effect<void, E, R> =>\n enableMcpPlaywright\n ? deps.enableMcpPlaywright(selected.projectDir).pipe(\n Effect.zipRight(deps.connectWithUp(selected))\n )\n : deps.connectWithUp(selected)\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport type { SelectProjectRuntime } from \"./menu-types.js\"\n\nconst defaultRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst runtimeForSort = (\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n item: ProjectItem\n): SelectProjectRuntime => runtimeByProject[item.projectDir] ?? defaultRuntime()\n\nconst startedAtEpochForSort = (runtime: SelectProjectRuntime): number =>\n runtime.startedAtEpochMs ?? Number.NEGATIVE_INFINITY\n\nexport const sortItemsByLaunchTime = (\n items: ReadonlyArray<ProjectItem>,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): ReadonlyArray<ProjectItem> =>\n items.toSorted((left, right) => {\n const leftRuntime = runtimeForSort(runtimeByProject, left)\n const rightRuntime = runtimeForSort(runtimeByProject, right)\n const leftStartedAt = startedAtEpochForSort(leftRuntime)\n const rightStartedAt = startedAtEpochForSort(rightRuntime)\n\n if (leftStartedAt !== rightStartedAt) {\n return rightStartedAt - leftStartedAt\n }\n if (leftRuntime.running !== rightRuntime.running) {\n return leftRuntime.running ? -1 : 1\n }\n return left.displayName.localeCompare(right.displayName)\n })\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nimport { sortItemsByLaunchTime } from \"./menu-select-order.js\"\nimport type { MenuViewContext, SelectProjectRuntime } from \"./menu-types.js\"\n\nconst emptyRuntimeByProject = (): Readonly<Record<string, SelectProjectRuntime>> => ({})\n\nexport const startSelectView = (\n items: ReadonlyArray<ProjectItem>,\n purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\",\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>> = emptyRuntimeByProject()\n) => {\n const sortedItems = sortItemsByLaunchTime(items, runtimeByProject)\n context.setMessage(null)\n context.setView({\n _tag: \"SelectProject\",\n purpose,\n items: sortedItems,\n runtimeByProject,\n selected: 0,\n confirmDelete: false,\n connectEnableMcpPlaywright: false\n })\n}\n","import { runDockerComposeDown } from \"@effect-template/lib/shell/docker\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport { mcpPlaywrightUp } from \"@effect-template/lib/usecases/mcp-playwright\"\nimport {\n connectProjectSshWithUp,\n deleteDockerGitProject,\n listRunningProjectItems,\n type ProjectItem\n} from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport { openProjectAuthMenu } from \"./menu-project-auth.js\"\nimport { buildConnectEffect } from \"./menu-select-connect.js\"\nimport { loadRuntimeByProject } from \"./menu-select-runtime.js\"\nimport { startSelectView } from \"./menu-select-view.js\"\nimport {\n pauseOnError,\n resetToMenu,\n resumeSshWithSkipInputs,\n resumeWithSkipInputs,\n withSuspendedTui\n} from \"./menu-shared.js\"\nimport type { MenuRunner, MenuViewContext } from \"./menu-types.js\"\n\nexport type SelectContext = MenuViewContext & {\n readonly activeDir: string | null\n readonly runner: MenuRunner\n readonly setSshActive: (active: boolean) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n}\n\nexport const runConnectSelection = (\n selected: ProjectItem,\n context: SelectContext,\n enableMcpPlaywright: boolean\n) => {\n context.setMessage(\n enableMcpPlaywright\n ? `Enabling Playwright MCP for ${selected.displayName}, then connecting...`\n : `Connecting to ${selected.displayName}...`\n )\n context.setSshActive(true)\n context.runner.runEffect(\n pipe(\n withSuspendedTui(\n buildConnectEffect(selected, enableMcpPlaywright, {\n connectWithUp: (item) =>\n connectProjectSshWithUp(item).pipe(\n Effect.mapError((error): AppError => error)\n ),\n enableMcpPlaywright: (projectDir) =>\n mcpPlaywrightUp({ _tag: \"McpPlaywrightUp\", projectDir, runUp: false }).pipe(\n Effect.asVoid,\n Effect.mapError((error): AppError => error)\n )\n }),\n {\n onError: pauseOnError(renderError),\n onResume: resumeSshWithSkipInputs(context)\n }\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(\"SSH session ended. Press Esc to return to the menu.\")\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nexport const runDownSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Stopping ${selected.displayName}...`)\n context.runner.runEffect(\n withSuspendedTui(\n pipe(\n runDockerComposeDown(selected.projectDir),\n Effect.zipRight(listRunningProjectItems),\n Effect.flatMap((items) =>\n pipe(\n loadRuntimeByProject(items),\n Effect.map((runtimeByProject) => ({ items, runtimeByProject }))\n )\n ),\n Effect.tap(({ items, runtimeByProject }) =>\n Effect.sync(() => {\n if (items.length === 0) {\n resetToMenu(context)\n context.setMessage(\"No running docker-git containers.\")\n return\n }\n startSelectView(items, \"Down\", context, runtimeByProject)\n context.setMessage(\"Container stopped. Select another to stop, or Esc to return.\")\n })\n ),\n Effect.asVoid\n ),\n {\n onError: pauseOnError(renderError),\n onResume: resumeWithSkipInputs(context)\n }\n )\n )\n}\n\nexport const runInfoSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Details for ${selected.displayName} are shown on the right. Press Esc to return to the menu.`)\n}\n\nexport const runAuthSelection = (selected: ProjectItem, context: SelectContext) => {\n openProjectAuthMenu({\n project: selected,\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nexport const runDeleteSelection = (selected: ProjectItem, context: SelectContext) => {\n context.setMessage(`Deleting ${selected.displayName}...`)\n context.runner.runEffect(\n pipe(\n withSuspendedTui(\n deleteDockerGitProject(selected).pipe(\n Effect.tap(() =>\n Effect.sync(() => {\n if (context.activeDir === selected.projectDir) {\n context.setActiveDir(null)\n }\n context.setView({ _tag: \"Menu\" })\n })\n ),\n Effect.asVoid\n ),\n {\n onError: pauseOnError(renderError),\n onResume: resumeWithSkipInputs(context)\n }\n ),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(\"Project deleted.\")\n })\n ),\n Effect.asVoid\n )\n )\n}\n","import { Match } from \"effect\"\n\nimport {\n runAuthSelection,\n runConnectSelection,\n runDeleteSelection,\n runDownSelection,\n runInfoSelection,\n type SelectContext\n} from \"./menu-select-actions.js\"\nimport { isConnectMcpToggleInput } from \"./menu-select-connect.js\"\nimport { runtimeForSelection } from \"./menu-select-runtime.js\"\nimport { resetToMenu } from \"./menu-shared.js\"\nimport type { MenuKeyInput, ViewState } from \"./menu-types.js\"\n\nexport { startSelectView } from \"./menu-select-view.js\"\n\nconst clampIndex = (value: number, size: number): number => {\n if (size <= 0) {\n return 0\n }\n if (value < 0) {\n return 0\n }\n if (value >= size) {\n return size - 1\n }\n return value\n}\n\nexport const handleSelectInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n) => {\n if (key.escape) {\n resetToMenu(context)\n return\n }\n if (handleConnectOptionToggle(input, view, context)) {\n return\n }\n if (handleSelectNavigation(key, view, context)) {\n return\n }\n if (key.return) {\n handleSelectReturn(view, context)\n return\n }\n if (input.trim().length > 0) {\n context.setMessage(\"Use arrows + Enter to select a project, Esc to cancel.\")\n }\n}\n\nconst handleConnectOptionToggle = (\n input: string,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: Pick<SelectContext, \"setView\" | \"setMessage\">\n): boolean => {\n if (view.purpose !== \"Connect\" || !isConnectMcpToggleInput(input)) {\n return false\n }\n const nextValue = !view.connectEnableMcpPlaywright\n context.setView({ ...view, connectEnableMcpPlaywright: nextValue, confirmDelete: false })\n context.setMessage(\n nextValue\n ? \"Playwright MCP will be enabled before SSH (press Enter to connect).\"\n : \"Playwright MCP toggle is OFF (press Enter to connect without changes).\"\n )\n return true\n}\n\nconst handleSelectNavigation = (\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n): boolean => {\n if (key.upArrow) {\n const next = clampIndex(view.selected - 1, view.items.length)\n context.setView({ ...view, selected: next, confirmDelete: false })\n return true\n }\n if (key.downArrow) {\n const next = clampIndex(view.selected + 1, view.items.length)\n context.setView({ ...view, selected: next, confirmDelete: false })\n return true\n }\n return false\n}\n\nconst formatSshSessionsLabel = (sshSessions: number): string =>\n sshSessions === 1 ? \"1 active SSH session\" : `${sshSessions} active SSH sessions`\n\nconst handleSelectReturn = (\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: SelectContext\n) => {\n const selected = view.items[view.selected]\n if (!selected) {\n context.setMessage(\"No project selected.\")\n resetToMenu(context)\n return\n }\n const selectedRuntime = runtimeForSelection(view, selected)\n const sshSessionsLabel = formatSshSessionsLabel(selectedRuntime.sshSessions)\n\n Match.value(view.purpose).pipe(\n Match.when(\"Connect\", () => {\n context.setActiveDir(selected.projectDir)\n runConnectSelection(selected, context, view.connectEnableMcpPlaywright)\n }),\n Match.when(\"Auth\", () => {\n context.setActiveDir(selected.projectDir)\n runAuthSelection(selected, context)\n }),\n Match.when(\"Down\", () => {\n if (selectedRuntime.sshSessions > 0 && !view.confirmDelete) {\n context.setMessage(\n `${selected.containerName} has ${sshSessionsLabel}. Press Enter again to stop, Esc to cancel.`\n )\n context.setView({ ...view, confirmDelete: true })\n return\n }\n context.setActiveDir(selected.projectDir)\n runDownSelection(selected, context)\n }),\n Match.when(\"Info\", () => {\n context.setActiveDir(selected.projectDir)\n runInfoSelection(selected, context)\n }),\n Match.when(\"Delete\", () => {\n if (!view.confirmDelete) {\n const activeSshWarning = selectedRuntime.sshSessions > 0 ? ` ${sshSessionsLabel}.` : \"\"\n context.setMessage(\n `Really delete ${selected.displayName}?${activeSshWarning} Press Enter again to confirm, Esc to cancel.`\n )\n context.setView({ ...view, confirmDelete: true })\n return\n }\n runDeleteSelection(selected, context)\n }),\n Match.exhaustive\n )\n}\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { Effect, pipe } from \"effect\"\n\nimport { loadRuntimeByProject } from \"./menu-select-runtime.js\"\nimport { startSelectView } from \"./menu-select.js\"\nimport type { MenuEnv, MenuViewContext } from \"./menu-types.js\"\n\nexport const loadSelectView = <E>(\n effect: Effect.Effect<ReadonlyArray<ProjectItem>, E, MenuEnv>,\n purpose: \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\",\n context: Pick<MenuViewContext, \"setView\" | \"setMessage\">\n): Effect.Effect<void, E, MenuEnv> =>\n pipe(\n effect,\n Effect.flatMap((items) =>\n pipe(\n loadRuntimeByProject(items),\n Effect.flatMap((runtimeByProject) =>\n Effect.sync(() => {\n if (items.length === 0) {\n context.setMessage(\n purpose === \"Down\"\n ? \"No running docker-git containers.\"\n : \"No docker-git projects found.\"\n )\n return\n }\n startSelectView(items, purpose, context, runtimeByProject)\n })\n )\n )\n )\n )\n","import { type MenuAction, type ProjectConfig } from \"@effect-template/lib/core/domain\"\nimport { readProjectConfig } from \"@effect-template/lib/shell/config\"\nimport { runDockerComposeDown, runDockerComposeLogs, runDockerComposePs } from \"@effect-template/lib/shell/docker\"\nimport { gcProjectNetworkByTemplate } from \"@effect-template/lib/usecases/docker-network-gc\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport {\n downAllDockerGitProjects,\n listProjectItems,\n listProjectStatus,\n listRunningProjectItems\n} from \"@effect-template/lib/usecases/projects\"\nimport { runDockerComposeUpWithPortCheck } from \"@effect-template/lib/usecases/projects-up\"\nimport { Effect, Match, pipe } from \"effect\"\n\nimport { openAuthMenu } from \"./menu-auth.js\"\nimport { startCreateView } from \"./menu-create.js\"\nimport { loadSelectView } from \"./menu-select-load.js\"\nimport { withSuspendedTui, writeErrorAndPause } from \"./menu-shared.js\"\nimport { type MenuEnv, type MenuRunner, type MenuState, type MenuViewContext } from \"./menu-types.js\"\n\n// CHANGE: keep menu actions and input parsing in a dedicated module\n// WHY: reduce cognitive complexity in the TUI entry\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall a: action(a) -> effect(a)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, MenuEnv>\n// INVARIANT: menu selection runs exactly one action\n// COMPLEXITY: O(1) per keypress\n\nconst continueOutcome = (state: MenuState): { readonly _tag: \"Continue\"; readonly state: MenuState } => ({\n _tag: \"Continue\",\n state\n})\n\nconst quitOutcome: { readonly _tag: \"Quit\" } = { _tag: \"Quit\" }\n\nexport type MenuContext = {\n readonly state: MenuState\n readonly runner: MenuRunner\n readonly exit: () => void\n} & MenuViewContext\n\nexport type MenuSelectionContext = MenuContext & {\n readonly selected: number\n readonly setSelected: (update: (value: number) => number) => void\n}\n\nconst actionLabel = (action: MenuAction): string =>\n Match.value(action).pipe(\n Match.when({ _tag: \"Auth\" }, () => \"Auth profiles\"),\n Match.when({ _tag: \"ProjectAuth\" }, () => \"Project auth\"),\n Match.when({ _tag: \"Up\" }, () => \"docker compose up\"),\n Match.when({ _tag: \"Status\" }, () => \"docker compose ps\"),\n Match.when({ _tag: \"Logs\" }, () => \"docker compose logs\"),\n Match.when({ _tag: \"Down\" }, () => \"docker compose down\"),\n Match.when({ _tag: \"DownAll\" }, () => \"docker compose down (all projects)\"),\n Match.orElse(() => \"action\")\n )\n\nconst runWithSuspendedTui = (\n effect: Effect.Effect<void, AppError, MenuEnv>,\n context: MenuContext,\n label: string\n) => {\n context.runner.runEffect(\n pipe(\n Effect.sync(() => {\n context.setMessage(`${label}...`)\n }),\n Effect.zipRight(withSuspendedTui(effect, { onError: (error) => writeErrorAndPause(renderError(error)) })),\n Effect.tap(() =>\n Effect.sync(() => {\n context.setMessage(`${label} finished.`)\n })\n ),\n Effect.asVoid\n )\n )\n}\n\nconst requireActiveProject = (context: MenuContext): boolean => {\n if (context.state.activeDir) {\n return true\n }\n context.setMessage(\n \"No active project. Use Create or paste a repo URL to set one before running this action.\"\n )\n return false\n}\n\nconst handleMissingConfig = (\n state: MenuState,\n setMessage: (message: string | null) => void,\n error: AppError\n) =>\n pipe(\n Effect.sync(() => {\n setMessage(renderError(error))\n }),\n Effect.as(continueOutcome(state))\n )\n\nconst withProjectConfig = <R>(\n state: MenuState,\n setMessage: (message: string | null) => void,\n f: (config: ProjectConfig) => Effect.Effect<void, AppError, R>\n) =>\n pipe(\n readProjectConfig(state.activeDir ?? state.cwd),\n Effect.matchEffect({\n onFailure: (error) =>\n error._tag === \"ConfigNotFoundError\" || error._tag === \"ConfigDecodeError\"\n ? handleMissingConfig(state, setMessage, error)\n : Effect.fail(error),\n onSuccess: (config) =>\n pipe(\n f(config),\n Effect.as(continueOutcome(state))\n )\n })\n )\n\nconst handleMenuAction = (\n state: MenuState,\n setMessage: (message: string | null) => void,\n action: MenuAction\n): Effect.Effect<\n { readonly _tag: \"Continue\"; readonly state: MenuState } | { readonly _tag: \"Quit\" },\n AppError,\n MenuEnv\n> =>\n Match.value(action).pipe(\n Match.when({ _tag: \"Quit\" }, () => Effect.succeed(quitOutcome)),\n Match.when({ _tag: \"Create\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Select\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Auth\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"ProjectAuth\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Info\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Delete\" }, () => Effect.succeed(continueOutcome(state))),\n Match.when({ _tag: \"Up\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposeUpWithPortCheck(state.activeDir ?? state.cwd).pipe(Effect.asVoid))),\n Match.when({ _tag: \"Status\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposePs(state.activeDir ?? state.cwd))),\n Match.when({ _tag: \"Logs\" }, () =>\n withProjectConfig(state, setMessage, () =>\n runDockerComposeLogs(state.activeDir ?? state.cwd))),\n Match.when({ _tag: \"Down\" }, () =>\n withProjectConfig(state, setMessage, (config) =>\n runDockerComposeDown(state.activeDir ?? state.cwd).pipe(\n Effect.zipRight(gcProjectNetworkByTemplate(state.activeDir ?? state.cwd, config.template))\n ))),\n Match.when({ _tag: \"DownAll\" }, () =>\n pipe(\n downAllDockerGitProjects,\n Effect.as(continueOutcome(state))\n )),\n Match.exhaustive\n )\n\nconst runCreateAction = (context: MenuContext) => {\n startCreateView(context.setView, context.setMessage)\n}\n\nconst runSelectAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Connect\", context))\n}\n\nconst runAuthProfilesAction = (context: MenuContext) => {\n context.setMessage(null)\n openAuthMenu({\n state: context.state,\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst runProjectAuthAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Auth\", context))\n}\n\nconst runDownAllAction = (context: MenuContext) => {\n context.setMessage(null)\n runWithSuspendedTui(downAllDockerGitProjects, context, \"Stopping all docker-git containers\")\n}\n\nconst runDownAction = (context: MenuContext, action: MenuAction) => {\n context.setMessage(null)\n if (context.state.activeDir === null) {\n context.runner.runEffect(loadSelectView(listRunningProjectItems, \"Down\", context))\n return\n }\n runComposeAction(action, context)\n}\n\nconst runInfoAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Info\", context))\n}\n\nconst runDeleteAction = (context: MenuContext) => {\n context.setMessage(null)\n context.runner.runEffect(loadSelectView(listProjectItems, \"Delete\", context))\n}\n\nconst runComposeAction = (action: MenuAction, context: MenuContext) => {\n if (action._tag === \"Status\" && context.state.activeDir === null) {\n runWithSuspendedTui(listProjectStatus, context, \"docker compose ps (all projects)\")\n return\n }\n if (!requireActiveProject(context)) {\n return\n }\n const effect = pipe(handleMenuAction(context.state, context.setMessage, action), Effect.asVoid)\n runWithSuspendedTui(effect, context, actionLabel(action))\n}\n\nconst runQuitAction = (context: MenuContext, action: MenuAction) => {\n context.runner.runEffect(\n pipe(handleMenuAction(context.state, context.setMessage, action), Effect.asVoid)\n )\n context.exit()\n}\n\nexport const handleMenuActionSelection = (action: MenuAction, context: MenuContext) => {\n Match.value(action).pipe(\n Match.when({ _tag: \"Create\" }, () => {\n runCreateAction(context)\n }),\n Match.when({ _tag: \"Select\" }, () => {\n runSelectAction(context)\n }),\n Match.when({ _tag: \"Auth\" }, () => {\n runAuthProfilesAction(context)\n }),\n Match.when({ _tag: \"ProjectAuth\" }, () => {\n runProjectAuthAction(context)\n }),\n Match.when({ _tag: \"Info\" }, () => {\n runInfoAction(context)\n }),\n Match.when({ _tag: \"Delete\" }, () => {\n runDeleteAction(context)\n }),\n Match.when({ _tag: \"Up\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Status\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Logs\" }, (selected) => {\n runComposeAction(selected, context)\n }),\n Match.when({ _tag: \"Down\" }, (selected) => {\n runDownAction(context, selected)\n }),\n Match.when({ _tag: \"DownAll\" }, () => {\n runDownAllAction(context)\n }),\n Match.when({ _tag: \"Quit\" }, (selected) => {\n runQuitAction(context, selected)\n }),\n Match.exhaustive\n )\n}\n","import { parseMenuSelection } from \"@effect-template/lib/core/domain\"\nimport { isRepoUrlInput } from \"@effect-template/lib/usecases/menu-helpers\"\nimport { Either } from \"effect\"\n\nimport { handleMenuActionSelection, type MenuSelectionContext } from \"./menu-actions.js\"\nimport { startCreateView } from \"./menu-create.js\"\nimport { menuItems } from \"./menu-types.js\"\n\nconst handleMenuNavigation = (\n key: { readonly upArrow?: boolean; readonly downArrow?: boolean },\n setSelected: (update: (value: number) => number) => void\n) => {\n if (key.upArrow) {\n setSelected((prev) => (prev === 0 ? menuItems.length - 1 : prev - 1))\n return\n }\n if (key.downArrow) {\n setSelected((prev) => (prev === menuItems.length - 1 ? 0 : prev + 1))\n }\n}\n\nconst handleMenuEnter = (context: MenuSelectionContext) => {\n const action = menuItems[context.selected]?.id\n if (!action) {\n return\n }\n handleMenuActionSelection(action, context)\n}\n\nconst handleMenuTextInput = (input: string, context: MenuSelectionContext): boolean => {\n const trimmed = input.trim()\n if (trimmed.length > 0 && isRepoUrlInput(trimmed)) {\n startCreateView(context.setView, context.setMessage, trimmed)\n return true\n }\n const selection = parseMenuSelection(input)\n if (Either.isRight(selection)) {\n handleMenuActionSelection(selection.right, context)\n return true\n }\n return false\n}\n\nexport const handleMenuInput = (\n input: string,\n key: { readonly upArrow?: boolean; readonly downArrow?: boolean; readonly return?: boolean },\n context: MenuSelectionContext\n) => {\n if (key.upArrow || key.downArrow) {\n handleMenuNavigation(key, context.setSelected)\n return\n }\n if (key.return) {\n handleMenuEnter(context)\n return\n }\n handleMenuTextInput(input, context)\n}\n","import { handleAuthInput } from \"./menu-auth.js\"\nimport { handleCreateInput } from \"./menu-create.js\"\nimport { handleMenuInput } from \"./menu-menu.js\"\nimport { handleProjectAuthInput } from \"./menu-project-auth.js\"\nimport { handleSelectInput } from \"./menu-select.js\"\nimport type { MenuKeyInput, MenuRunner, MenuState, MenuViewContext, ViewState } from \"./menu-types.js\"\n\nexport type InputStage = \"cold\" | \"active\"\n\nexport type MenuInputContext = MenuViewContext & {\n readonly busy: boolean\n readonly view: ViewState\n readonly inputStage: InputStage\n readonly setInputStage: (stage: InputStage) => void\n readonly selected: number\n readonly setSelected: (update: (value: number) => number) => void\n readonly setSkipInputs: (update: (value: number) => number) => void\n readonly sshActive: boolean\n readonly setSshActive: (active: boolean) => void\n readonly state: MenuState\n readonly runner: MenuRunner\n readonly exit: () => void\n}\n\ntype ActiveView = Exclude<ViewState, { readonly _tag: \"Menu\" }>\n\nconst activateInput = (\n input: string,\n key: Pick<MenuKeyInput, \"upArrow\" | \"downArrow\" | \"return\">,\n context: Pick<MenuInputContext, \"inputStage\" | \"setInputStage\">\n): { readonly activated: boolean; readonly allowProcessing: boolean } => {\n if (context.inputStage === \"active\") {\n return { activated: false, allowProcessing: true }\n }\n\n if (input.trim().length > 0) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: true }\n }\n\n if (key.upArrow || key.downArrow || key.return) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: false }\n }\n\n if (input.length > 0) {\n context.setInputStage(\"active\")\n return { activated: true, allowProcessing: true }\n }\n\n return { activated: false, allowProcessing: false }\n}\n\nconst shouldHandleMenuInput = (\n input: string,\n key: Pick<MenuKeyInput, \"upArrow\" | \"downArrow\" | \"return\">,\n context: Pick<MenuInputContext, \"inputStage\" | \"setInputStage\">\n): boolean => {\n const activation = activateInput(input, key, context)\n if (activation.activated && !activation.allowProcessing) {\n return false\n }\n return activation.allowProcessing\n}\n\nconst handleMenuViewInput = (\n input: string,\n key: MenuKeyInput,\n context: MenuInputContext\n) => {\n if (!shouldHandleMenuInput(input, key, context)) {\n return\n }\n handleMenuInput(input, key, {\n selected: context.selected,\n setSelected: context.setSelected,\n state: context.state,\n runner: context.runner,\n exit: context.exit,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleCreateViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"Create\" }>,\n context: MenuInputContext\n) => {\n handleCreateInput(input, key, view, {\n state: context.state,\n setView: context.setView,\n setMessage: context.setMessage,\n runner: context.runner,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleAuthViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"AuthMenu\" | \"AuthPrompt\" }>,\n context: MenuInputContext\n) => {\n handleAuthInput(input, key, view, {\n state: context.state,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir,\n runner: context.runner,\n setSshActive: context.setSshActive,\n setSkipInputs: context.setSkipInputs\n })\n}\n\nconst handleProjectAuthViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthMenu\" | \"ProjectAuthPrompt\" }>,\n context: MenuInputContext\n) => {\n handleProjectAuthInput(input, key, view, {\n runner: context.runner,\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir\n })\n}\n\nconst handleSelectViewInput = (\n input: string,\n key: MenuKeyInput,\n view: Extract<ViewState, { readonly _tag: \"SelectProject\" }>,\n context: MenuInputContext\n) => {\n handleSelectInput(input, key, view, {\n setView: context.setView,\n setMessage: context.setMessage,\n setActiveDir: context.setActiveDir,\n activeDir: context.state.activeDir,\n runner: context.runner,\n setSshActive: context.setSshActive,\n setSkipInputs: context.setSkipInputs\n })\n}\n\nconst handleActiveViewInput = (\n input: string,\n key: MenuKeyInput,\n view: ActiveView,\n context: MenuInputContext\n) => {\n if (view._tag === \"Create\") {\n handleCreateViewInput(input, key, view, context)\n return\n }\n if (view._tag === \"AuthMenu\" || view._tag === \"AuthPrompt\") {\n handleAuthViewInput(input, key, view, context)\n return\n }\n if (view._tag === \"ProjectAuthMenu\" || view._tag === \"ProjectAuthPrompt\") {\n handleProjectAuthViewInput(input, key, view, context)\n return\n }\n handleSelectViewInput(input, key, view, context)\n}\n\nexport const handleUserInput = (\n input: string,\n key: MenuKeyInput,\n context: MenuInputContext\n) => {\n if (context.busy || context.sshActive) {\n return\n }\n if (context.view._tag === \"Menu\") {\n handleMenuViewInput(input, key, context)\n return\n }\n handleActiveViewInput(input, key, context.view, context)\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nconst renderMessage = (message: string | null): React.ReactElement | null => {\n if (!message) {\n return null\n }\n return React.createElement(\n Box,\n { marginTop: 1 },\n React.createElement(Text, { color: \"magenta\" }, message)\n )\n}\n\nexport const renderLayout = (\n title: string,\n body: ReadonlyArray<React.ReactElement>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const messageView = renderMessage(message)\n const tail = messageView ? [messageView] : []\n return el(\n Box,\n { flexDirection: \"column\", padding: 1, borderStyle: \"round\" },\n el(Text, { color: \"cyan\", bold: true }, title),\n ...body,\n ...tail\n )\n}\n","import { Match } from \"effect\"\nimport { Text } from \"ink\"\nimport type React from \"react\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport type { SelectProjectRuntime } from \"./menu-types.js\"\n\nexport type SelectPurpose = \"Connect\" | \"Down\" | \"Info\" | \"Delete\" | \"Auth\"\n\nconst formatRepoRef = (repoRef: string): string => {\n const trimmed = repoRef.trim()\n const prPrefix = \"refs/pull/\"\n if (trimmed.startsWith(prPrefix)) {\n const rest = trimmed.slice(prPrefix.length)\n const number = rest.split(\"/\")[0] ?? rest\n return `PR#${number}`\n }\n return trimmed.length > 0 ? trimmed : \"main\"\n}\n\nconst stoppedRuntime = (): SelectProjectRuntime => ({\n running: false,\n sshSessions: 0,\n startedAtIso: null,\n startedAtEpochMs: null\n})\n\nconst pad2 = (value: number): string => value.toString().padStart(2, \"0\")\n\nconst formatUtcTimestamp = (epochMs: number, withSeconds: boolean): string => {\n const date = new Date(epochMs)\n const seconds = withSeconds ? `:${pad2(date.getUTCSeconds())}` : \"\"\n return `${date.getUTCFullYear()}-${pad2(date.getUTCMonth() + 1)}-${pad2(date.getUTCDate())} ${\n pad2(\n date.getUTCHours()\n )\n }:${pad2(date.getUTCMinutes())}${seconds} UTC`\n}\n\nconst renderStartedAtCompact = (runtime: SelectProjectRuntime): string =>\n runtime.startedAtEpochMs === null ? \"-\" : formatUtcTimestamp(runtime.startedAtEpochMs, false)\n\nconst renderStartedAtDetailed = (runtime: SelectProjectRuntime): string =>\n runtime.startedAtEpochMs === null ? \"not available\" : formatUtcTimestamp(runtime.startedAtEpochMs, true)\n\nconst runtimeForProject = (\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n item: ProjectItem\n): SelectProjectRuntime => runtimeByProject[item.projectDir] ?? stoppedRuntime()\n\nconst renderRuntimeLabel = (runtime: SelectProjectRuntime): string =>\n `${runtime.running ? \"running\" : \"stopped\"}, ssh=${runtime.sshSessions}, started=${\n renderStartedAtCompact(\n runtime\n )\n }`\n\nexport const selectTitle = (purpose: SelectPurpose): string =>\n Match.value(purpose).pipe(\n Match.when(\"Connect\", () => \"docker-git / Select project\"),\n Match.when(\"Auth\", () => \"docker-git / Project auth\"),\n Match.when(\"Down\", () => \"docker-git / Stop container\"),\n Match.when(\"Info\", () => \"docker-git / Show connection info\"),\n Match.when(\"Delete\", () => \"docker-git / Delete project\"),\n Match.exhaustive\n )\n\nexport const selectHint = (\n purpose: SelectPurpose,\n connectEnableMcpPlaywright: boolean\n): string =>\n Match.value(purpose).pipe(\n Match.when(\n \"Connect\",\n () => `Enter = select + SSH, P = toggle Playwright MCP (${connectEnableMcpPlaywright ? \"on\" : \"off\"}), Esc = back`\n ),\n Match.when(\"Auth\", () => \"Enter = open project auth menu, Esc = back\"),\n Match.when(\"Down\", () => \"Enter = stop container, Esc = back\"),\n Match.when(\"Info\", () => \"Use arrows to browse details, Enter = set active, Esc = back\"),\n Match.when(\"Delete\", () => \"Enter = ask/confirm delete, Esc = cancel\"),\n Match.exhaustive\n )\n\nexport const buildSelectLabels = (\n items: ReadonlyArray<ProjectItem>,\n selected: number,\n purpose: SelectPurpose,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): ReadonlyArray<string> =>\n items.map((item, index) => {\n const prefix = index === selected ? \">\" : \" \"\n const refLabel = formatRepoRef(item.repoRef)\n const runtime = runtimeForProject(runtimeByProject, item)\n const runtimeSuffix = purpose === \"Down\" || purpose === \"Delete\"\n ? ` [${renderRuntimeLabel(runtime)}]`\n : ` [started=${renderStartedAtCompact(runtime)}]`\n return `${prefix} ${index + 1}. ${item.displayName} (${refLabel})${runtimeSuffix}`\n })\n\nexport type SelectListWindow = {\n readonly start: number\n readonly end: number\n}\n\nexport const buildSelectListWindow = (\n total: number,\n selected: number,\n maxVisible: number\n): SelectListWindow => {\n if (total <= 0) {\n return { start: 0, end: 0 }\n }\n const visible = Math.max(1, maxVisible)\n if (total <= visible) {\n return { start: 0, end: total }\n }\n const boundedSelected = Math.min(Math.max(selected, 0), total - 1)\n const half = Math.floor(visible / 2)\n const maxStart = total - visible\n const start = Math.min(Math.max(boundedSelected - half, 0), maxStart)\n return { start, end: start + visible }\n}\n\ntype SelectDetailsContext = {\n readonly item: ProjectItem\n readonly refLabel: string\n readonly authSuffix: string\n readonly runtime: SelectProjectRuntime\n readonly sshSessionsLabel: string\n}\n\nconst buildDetailsContext = (\n item: ProjectItem,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n): SelectDetailsContext => {\n const runtime = runtimeForProject(runtimeByProject, item)\n return {\n item,\n refLabel: formatRepoRef(item.repoRef),\n authSuffix: item.authorizedKeysExists ? \"\" : \" (missing)\",\n runtime,\n sshSessionsLabel: runtime.sshSessions === 1\n ? \"1 active SSH session\"\n : `${runtime.sshSessions} active SSH sessions`\n }\n}\n\nconst titleRow = (el: typeof React.createElement, value: string): React.ReactElement =>\n el(Text, { color: \"cyan\", bold: true, wrap: \"truncate\" }, value)\n\nconst commonRows = (\n el: typeof React.createElement,\n context: SelectDetailsContext\n): ReadonlyArray<React.ReactElement> => [\n el(Text, { wrap: \"wrap\" }, `Project directory: ${context.item.projectDir}`),\n el(Text, { wrap: \"wrap\" }, `Container: ${context.item.containerName}`),\n el(Text, { wrap: \"wrap\" }, `State: ${context.runtime.running ? \"running\" : \"stopped\"}`),\n el(Text, { wrap: \"wrap\" }, `Started at: ${renderStartedAtDetailed(context.runtime)}`),\n el(Text, { wrap: \"wrap\" }, `SSH sessions now: ${context.sshSessionsLabel}`)\n]\n\nconst renderInfoDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext,\n common: ReadonlyArray<React.ReactElement>\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Connection info\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Service: ${context.item.serviceName}`),\n el(Text, { wrap: \"wrap\" }, `SSH command: ${context.item.sshCommand}`),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `Workspace: ${context.item.targetDir}`),\n el(Text, { wrap: \"wrap\" }, `Authorized keys: ${context.item.authorizedKeysPath}${context.authSuffix}`),\n el(Text, { wrap: \"wrap\" }, `Env global: ${context.item.envGlobalPath}`),\n el(Text, { wrap: \"wrap\" }, `Env project: ${context.item.envProjectPath}`),\n el(Text, { wrap: \"wrap\" }, `Codex auth: ${context.item.codexAuthPath} -> ${context.item.codexHome}`)\n]\n\nconst renderDefaultDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Details\"),\n el(Text, { wrap: \"truncate\" }, `Repo: ${context.item.repoUrl}`),\n el(Text, { wrap: \"truncate\" }, `Ref: ${context.item.repoRef}`),\n el(Text, { wrap: \"truncate\" }, `Project dir: ${context.item.projectDir}`),\n el(Text, { wrap: \"truncate\" }, `Workspace: ${context.item.targetDir}`),\n el(Text, { wrap: \"truncate\" }, `SSH: ${context.item.sshCommand}`)\n]\n\nconst renderConnectDetails = (\n el: typeof React.createElement,\n context: SelectDetailsContext,\n common: ReadonlyArray<React.ReactElement>,\n connectEnableMcpPlaywright: boolean\n): ReadonlyArray<React.ReactElement> => [\n titleRow(el, \"Connect + SSH\"),\n ...common,\n el(\n Text,\n { color: connectEnableMcpPlaywright ? \"green\" : \"gray\", wrap: \"wrap\" },\n connectEnableMcpPlaywright\n ? \"Playwright MCP: will be enabled before SSH (P to disable).\"\n : \"Playwright MCP: keep current project setting (P to enable before SSH).\"\n ),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `SSH command: ${context.item.sshCommand}`)\n]\n\nexport const renderSelectDetails = (\n el: typeof React.createElement,\n purpose: SelectPurpose,\n item: ProjectItem | undefined,\n runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>,\n connectEnableMcpPlaywright: boolean\n): ReadonlyArray<React.ReactElement> => {\n if (!item) {\n return [el(Text, { color: \"gray\", wrap: \"truncate\" }, \"No project selected.\")]\n }\n const context = buildDetailsContext(item, runtimeByProject)\n const common = commonRows(el, context)\n\n return Match.value(purpose).pipe(\n Match.when(\"Connect\", () => renderConnectDetails(el, context, common, connectEnableMcpPlaywright)),\n Match.when(\"Auth\", () => [\n titleRow(el, \"Project auth\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, `Env global: ${context.item.envGlobalPath}`),\n el(Text, { wrap: \"wrap\" }, `Env project: ${context.item.envProjectPath}`),\n el(Text, { color: \"gray\", wrap: \"wrap\" }, \"Press Enter to manage labels for this project.\")\n ]),\n Match.when(\"Info\", () => renderInfoDetails(el, context, common)),\n Match.when(\"Down\", () => [\n titleRow(el, \"Stop container\"),\n ...common,\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`)\n ]),\n Match.when(\"Delete\", () => [\n titleRow(el, \"Delete project\"),\n ...common,\n context.runtime.sshSessions > 0\n ? el(Text, { color: \"yellow\", wrap: \"wrap\" }, \"Warning: project has active SSH sessions.\")\n : el(Text, { color: \"gray\", wrap: \"wrap\" }, \"No active SSH sessions detected.\"),\n el(Text, { wrap: \"wrap\" }, `Repo: ${context.item.repoUrl} (${context.refLabel})`),\n el(Text, { wrap: \"wrap\" }, \"Removes project folder and runs docker compose down -v.\")\n ]),\n Match.orElse(() => renderDefaultDetails(el, context))\n )\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { renderLayout } from \"./menu-render-layout.js\"\n\nexport const renderSelectableMenuList = (\n labels: ReadonlyArray<string>,\n selected: number\n): ReadonlyArray<React.ReactElement> => {\n const el = React.createElement\n return labels.map((label, index) =>\n el(\n Text,\n { key: `${index}-${label}`, color: index === selected ? \"green\" : \"white\" },\n `${index === selected ? \">\" : \" \"} ${index + 1}) ${label}`\n )\n )\n}\n\nexport const renderMenuHelp = (primaryLine: string): React.ReactElement => {\n const el = React.createElement\n return el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, primaryLine),\n el(Text, { color: \"gray\" }, \"Esc returns to the main menu.\")\n )\n}\n\ntype PromptStepLike = {\n readonly label: string\n readonly secret: boolean\n}\n\nexport const resolvePromptState = (\n steps: ReadonlyArray<PromptStepLike>,\n step: number,\n buffer: string\n): { readonly prompt: string; readonly visibleBuffer: string } => {\n const current = steps[step]\n const prompt = current?.label ?? \"Value\"\n const isSecret = current?.secret === true\n const visibleBuffer = isSecret ? \"*\".repeat(buffer.length) : buffer\n return { prompt, visibleBuffer }\n}\n\ntype RenderPromptArgs = {\n readonly title: string\n readonly header: ReadonlyArray<React.ReactElement>\n readonly prompt: string\n readonly visibleBuffer: string\n readonly helpLine: string\n readonly message: string | null\n}\n\nexport const renderPromptLayout = (args: RenderPromptArgs): React.ReactElement => {\n const el = React.createElement\n return renderLayout(\n args.title,\n [\n ...args.header,\n el(Box, { marginTop: 1 }, el(Text, null, `${args.prompt}: `), el(Text, { color: \"green\" }, args.visibleBuffer)),\n el(Box, { marginTop: 1, flexDirection: \"column\" }, el(Text, { color: \"gray\" }, args.helpLine))\n ],\n args.message\n )\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { authMenuLabels, authViewSteps, authViewTitle } from \"./menu-auth-data.js\"\nimport {\n renderMenuHelp,\n renderPromptLayout,\n renderSelectableMenuList,\n resolvePromptState\n} from \"./menu-render-common.js\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport type { AuthSnapshot, ViewState } from \"./menu-types.js\"\n\nconst renderCountLine = (title: string, count: number): string => `${title}: ${count}`\n\nexport const renderAuthMenu = (\n snapshot: AuthSnapshot,\n selected: number,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const list = renderSelectableMenuList(authMenuLabels(), selected)\n return renderLayout(\n \"docker-git / Auth profiles\",\n [\n el(Text, null, `Global env: ${snapshot.globalEnvPath}`),\n el(Text, null, `Claude auth: ${snapshot.claudeAuthPath}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Entries\", snapshot.totalEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"GitHub tokens\", snapshot.githubTokenEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Git tokens\", snapshot.gitTokenEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Git users\", snapshot.gitUserEntries)),\n el(Text, { color: \"gray\" }, renderCountLine(\"Claude logins\", snapshot.claudeAuthEntries)),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...list),\n renderMenuHelp(\"Use arrows + Enter, or type a number.\")\n ],\n message\n )\n}\n\nexport const renderAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"AuthPrompt\" }>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const { prompt, visibleBuffer } = resolvePromptState(authViewSteps(view.flow), view.step, view.buffer)\n let helpLine = \"Enter = next, Esc = cancel.\"\n if (view.flow === \"GithubOauth\" || view.flow === \"ClaudeOauth\") {\n helpLine = \"Enter = start OAuth, Esc = cancel.\"\n } else if (view.flow === \"ClaudeLogout\") {\n helpLine = \"Enter = logout, Esc = cancel.\"\n }\n return renderPromptLayout({\n title: `docker-git / Auth / ${authViewTitle(view.flow)}`,\n header: [\n el(Text, { color: \"gray\" }, `Global env: ${view.snapshot.globalEnvPath}`),\n ...(view.flow === \"ClaudeOauth\" || view.flow === \"ClaudeLogout\"\n ? [el(Text, { color: \"gray\" }, `Claude auth: ${view.snapshot.claudeAuthPath}`)]\n : [])\n ],\n prompt,\n visibleBuffer,\n helpLine,\n message\n })\n}\n","import { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport { projectAuthMenuLabels, projectAuthViewSteps } from \"./menu-project-auth-data.js\"\nimport {\n renderMenuHelp,\n renderPromptLayout,\n renderSelectableMenuList,\n resolvePromptState\n} from \"./menu-render-common.js\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport type { ProjectAuthSnapshot, ViewState } from \"./menu-types.js\"\n\nconst renderActiveLabel = (value: string | null): string => value ?? \"(not set)\"\n\nconst renderCountLine = (title: string, count: number): string => `${title}: ${count}`\n\nexport const renderProjectAuthMenu = (\n snapshot: ProjectAuthSnapshot,\n selected: number,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const list = renderSelectableMenuList(projectAuthMenuLabels(), selected)\n\n return renderLayout(\n \"docker-git / Project auth\",\n [\n el(Text, null, `Project: ${snapshot.projectName}`),\n el(Text, { color: \"gray\" }, `Dir: ${snapshot.projectDir}`),\n el(Text, { color: \"gray\" }, `Project env: ${snapshot.envProjectPath}`),\n el(Text, { color: \"gray\" }, `Global env: ${snapshot.envGlobalPath}`),\n el(Text, { color: \"gray\" }, `Claude auth: ${snapshot.claudeAuthPath}`),\n el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, `GitHub label: ${renderActiveLabel(snapshot.activeGithubLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available GitHub tokens\", snapshot.githubTokenEntries)),\n el(Text, { color: \"gray\" }, `Git label: ${renderActiveLabel(snapshot.activeGitLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available Git tokens\", snapshot.gitTokenEntries)),\n el(Text, { color: \"gray\" }, `Claude label: ${renderActiveLabel(snapshot.activeClaudeLabel)}`),\n el(Text, { color: \"gray\" }, renderCountLine(\"Available Claude logins\", snapshot.claudeAuthEntries))\n ),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...list),\n renderMenuHelp(\"Use arrows + Enter, or type a number from the list.\")\n ],\n message\n )\n}\n\nexport const renderProjectAuthPrompt = (\n view: Extract<ViewState, { readonly _tag: \"ProjectAuthPrompt\" }>,\n message: string | null\n): React.ReactElement => {\n const el = React.createElement\n const { prompt, visibleBuffer } = resolvePromptState(projectAuthViewSteps(view.flow), view.step, view.buffer)\n\n return renderPromptLayout({\n title: \"docker-git / Project auth / Set label\",\n header: [\n el(Text, { color: \"gray\" }, `Project: ${view.snapshot.projectName}`),\n el(Text, { color: \"gray\" }, `Project env: ${view.snapshot.envProjectPath}`),\n el(Text, { color: \"gray\" }, `Global env: ${view.snapshot.envGlobalPath}`)\n ],\n prompt,\n visibleBuffer,\n helpLine: \"Enter = apply, Esc = cancel.\",\n message\n })\n}\n","import { Match } from \"effect\"\nimport { Box, Text } from \"ink\"\nimport React from \"react\"\n\nimport type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\nimport { renderLayout } from \"./menu-render-layout.js\"\nimport {\n buildSelectLabels,\n buildSelectListWindow,\n renderSelectDetails,\n selectHint,\n type SelectPurpose,\n selectTitle\n} from \"./menu-render-select.js\"\nimport type { CreateInputs, CreateStep, SelectProjectRuntime } from \"./menu-types.js\"\nimport { createSteps, menuItems } from \"./menu-types.js\"\n\n// CHANGE: render menu views with Ink without JSX\n// WHY: keep UI logic separate from input/state reducers\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall v: view(v) -> render(v)\n// PURITY: SHELL\n// EFFECT: n/a\n// INVARIANT: menu renders all items once\n// COMPLEXITY: O(n)\n\nexport const renderStepLabel = (step: CreateStep, defaults: CreateInputs): string =>\n Match.value(step).pipe(\n Match.when(\"repoUrl\", () => \"Repo URL (optional for empty workspace)\"),\n Match.when(\"repoRef\", () => `Repo ref [${defaults.repoRef}]`),\n Match.when(\"outDir\", () => `Output dir [${defaults.outDir}]`),\n Match.when(\"runUp\", () => `Run docker compose up now? [${defaults.runUp ? \"Y\" : \"n\"}]`),\n Match.when(\n \"mcpPlaywright\",\n () => `Enable Playwright MCP (Chromium sidecar)? [${defaults.enableMcpPlaywright ? \"y\" : \"N\"}]`\n ),\n Match.when(\n \"force\",\n () => `Force recreate (overwrite files + wipe volumes)? [${defaults.force ? \"y\" : \"N\"}]`\n ),\n Match.exhaustive\n )\n\nconst compactElements = (\n items: ReadonlyArray<React.ReactElement | null>\n): ReadonlyArray<React.ReactElement> => items.filter((item): item is React.ReactElement => item !== null)\n\nconst renderMenuHints = (el: typeof React.createElement): React.ReactElement =>\n el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n el(Text, { color: \"gray\" }, \"Hints:\"),\n el(Text, { color: \"gray\" }, \" - Paste repo URL to create directly.\"),\n el(\n Text,\n { color: \"gray\" },\n \" - Aliases: create/c, select/s, auth/a, project-auth/pa, info/i, status/ps, logs/l, down/d, down-all/da, delete/del, quit/q\"\n ),\n el(Text, { color: \"gray\" }, \" - Use arrows and Enter to run.\")\n )\n\nconst renderMenuMessage = (\n el: typeof React.createElement,\n message: string | null\n): React.ReactElement | null => {\n if (!message || message.length === 0) {\n return null\n }\n return el(\n Box,\n { marginTop: 1, flexDirection: \"column\" },\n ...message\n .split(\"\\n\")\n .map((line, index) => el(Text, { key: `${index}-${line}`, color: \"magenta\" }, line))\n )\n}\n\ntype MenuRenderInput = {\n readonly cwd: string\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly selected: number\n readonly busy: boolean\n readonly message: string | null\n}\n\nexport const renderMenu = (input: MenuRenderInput): React.ReactElement => {\n const { activeDir, busy, cwd, message, runningDockerGitContainers, selected } = input\n const el = React.createElement\n const activeLabel = `Active: ${activeDir ?? \"(none)\"}`\n const runningLabel = `Running docker-git containers: ${runningDockerGitContainers}`\n const cwdLabel = `CWD: ${cwd}`\n const items = menuItems.map((item, index) => {\n const indexLabel = `${index + 1})`\n const prefix = index === selected ? \">\" : \" \"\n return el(\n Text,\n { key: item.label, color: index === selected ? \"green\" : \"white\" },\n `${prefix} ${indexLabel} ${item.label}`\n )\n })\n\n const busyView = busy\n ? el(Box, { marginTop: 1 }, el(Text, { color: \"yellow\" }, \"Running...\"))\n : null\n\n const messageView = renderMenuMessage(el, message)\n const hints = renderMenuHints(el)\n\n return renderLayout(\n \"docker-git\",\n compactElements([\n el(Text, null, activeLabel),\n el(Text, null, runningLabel),\n el(Text, null, cwdLabel),\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...items),\n hints,\n busyView,\n messageView\n ]),\n null\n )\n}\n\nexport const renderCreate = (\n label: string,\n buffer: string,\n message: string | null,\n stepIndex: number,\n defaults: CreateInputs\n): React.ReactElement => {\n const el = React.createElement\n const steps = createSteps.map((step, index) =>\n el(\n Text,\n { key: step, color: index === stepIndex ? \"green\" : \"gray\" },\n `${index === stepIndex ? \">\" : \" \"} ${renderStepLabel(step, defaults)}`\n )\n )\n return renderLayout(\n \"docker-git / Create\",\n [\n el(Box, { flexDirection: \"column\", marginTop: 1 }, ...steps),\n el(\n Box,\n { marginTop: 1 },\n el(Text, null, `${label}: `),\n el(Text, { color: \"green\" }, buffer)\n ),\n el(Box, { marginTop: 1 }, el(Text, { color: \"gray\" }, \"Enter = next, Esc = cancel.\"))\n ],\n message\n )\n}\n\nexport { renderAuthMenu, renderAuthPrompt } from \"./menu-render-auth.js\"\nexport { renderProjectAuthMenu, renderProjectAuthPrompt } from \"./menu-render-project-auth.js\"\n\nconst computeListWidth = (labels: ReadonlyArray<string>): number => {\n const maxLabelWidth = labels.length > 0 ? Math.max(...labels.map((label) => label.length)) : 24\n return Math.min(Math.max(maxLabelWidth + 2, 28), 54)\n}\n\nconst readStdoutRows = (): number | null => {\n const rows = process.stdout.rows\n if (typeof rows !== \"number\" || !Number.isFinite(rows) || rows <= 0) {\n return null\n }\n return rows\n}\n\nconst computeSelectListMaxRows = (): number => {\n const rows = readStdoutRows()\n if (rows === null) {\n return 12\n }\n return Math.max(6, rows - 14)\n}\n\nconst renderSelectListBox = (\n el: typeof React.createElement,\n items: ReadonlyArray<ProjectItem>,\n selected: number,\n labels: ReadonlyArray<string>,\n width: number\n): React.ReactElement => {\n const window = buildSelectListWindow(labels.length, selected, computeSelectListMaxRows())\n const hiddenAbove = window.start\n const hiddenBelow = labels.length - window.end\n const visibleLabels = labels.slice(window.start, window.end)\n const list = visibleLabels.map((label, offset) => {\n const index = window.start + offset\n return el(\n Text,\n {\n key: items[index]?.projectDir ?? String(index),\n color: index === selected ? \"green\" : \"white\",\n wrap: \"truncate\"\n },\n label\n )\n })\n\n const before = hiddenAbove > 0\n ? [el(Text, { color: \"gray\", wrap: \"truncate\" }, `[scroll] ${hiddenAbove} more above`)]\n : []\n const after = hiddenBelow > 0\n ? [el(Text, { color: \"gray\", wrap: \"truncate\" }, `[scroll] ${hiddenBelow} more below`)]\n : []\n const listBody = list.length > 0 ? list : [el(Text, { color: \"gray\" }, \"No projects found.\")]\n\n return el(\n Box,\n { flexDirection: \"column\", width },\n ...before,\n ...listBody,\n ...after\n )\n}\n\ntype SelectDetailsBoxInput = {\n readonly purpose: SelectPurpose\n readonly items: ReadonlyArray<ProjectItem>\n readonly selected: number\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly connectEnableMcpPlaywright: boolean\n}\n\nconst renderSelectDetailsBox = (\n el: typeof React.createElement,\n input: SelectDetailsBoxInput\n): React.ReactElement => {\n const details = renderSelectDetails(\n el,\n input.purpose,\n input.items[input.selected],\n input.runtimeByProject,\n input.connectEnableMcpPlaywright\n )\n return el(\n Box,\n { flexDirection: \"column\", marginLeft: 2, flexGrow: 1 },\n ...details\n )\n}\n\nexport const renderSelect = (\n input: {\n readonly purpose: SelectPurpose\n readonly items: ReadonlyArray<ProjectItem>\n readonly selected: number\n readonly runtimeByProject: Readonly<Record<string, SelectProjectRuntime>>\n readonly confirmDelete: boolean\n readonly connectEnableMcpPlaywright: boolean\n readonly message: string | null\n }\n): React.ReactElement => {\n const { confirmDelete, connectEnableMcpPlaywright, items, message, purpose, runtimeByProject, selected } = input\n const el = React.createElement\n const listLabels = buildSelectLabels(items, selected, purpose, runtimeByProject)\n const listWidth = computeListWidth(listLabels)\n const listBox = renderSelectListBox(el, items, selected, listLabels, listWidth)\n const detailsBox = renderSelectDetailsBox(el, {\n purpose,\n items,\n selected,\n runtimeByProject,\n connectEnableMcpPlaywright\n })\n const baseHint = selectHint(purpose, connectEnableMcpPlaywright)\n const confirmHint = (() => {\n if (purpose === \"Delete\" && confirmDelete) {\n return \"Confirm mode: Enter = delete now, Esc = cancel\"\n }\n if (purpose === \"Down\" && confirmDelete) {\n return \"Confirm mode: Enter = stop now, Esc = cancel\"\n }\n return baseHint\n })()\n const hints = el(Box, { marginTop: 1 }, el(Text, { color: \"gray\" }, confirmHint))\n\n return renderLayout(\n selectTitle(purpose),\n [\n el(Box, { flexDirection: \"row\", marginTop: 1 }, listBox, detailsBox),\n hints\n ],\n message\n )\n}\n","import type { ProjectItem } from \"@effect-template/lib/usecases/projects\"\n\nexport type MenuStartupSnapshot = {\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly message: string | null\n}\n\nconst dockerGitContainerPrefix = \"dg-\"\n\nconst emptySnapshot = (): MenuStartupSnapshot => ({\n activeDir: null,\n runningDockerGitContainers: 0,\n message: null\n})\n\nconst uniqueDockerGitContainerNames = (\n runningContainerNames: ReadonlyArray<string>\n): ReadonlyArray<string> => [\n ...new Set(runningContainerNames.filter((name) => name.startsWith(dockerGitContainerPrefix)))\n]\n\nconst detectKnownRunningProjects = (\n items: ReadonlyArray<ProjectItem>,\n runningDockerGitNames: ReadonlyArray<string>\n): ReadonlyArray<ProjectItem> => {\n const runningSet = new Set(runningDockerGitNames)\n return items.filter((item) => runningSet.has(item.containerName))\n}\n\nconst renderRunningHint = (runningCount: number): string =>\n runningCount === 1\n ? \"Detected 1 running docker-git container.\"\n : `Detected ${runningCount} running docker-git containers.`\n\n// CHANGE: infer initial menu state from currently running docker-git containers\n// WHY: avoid \"(none)\" confusion when containers are already up outside this TUI session\n// QUOTE(ISSUE): \"У меня запущены контейнеры от docker-git но он говорит что они не запущены\"\n// REF: issue-13\n// SOURCE: n/a\n// FORMAT THEOREM: forall startupState: snapshot(startupState) -> deterministic(menuState)\n// PURITY: CORE\n// EFFECT: n/a\n// INVARIANT: activeDir is set only when exactly one known project is running\n// COMPLEXITY: O(|containers| + |projects|)\nexport const resolveMenuStartupSnapshot = (\n items: ReadonlyArray<ProjectItem>,\n runningContainerNames: ReadonlyArray<string>\n): MenuStartupSnapshot => {\n const runningDockerGitNames = uniqueDockerGitContainerNames(runningContainerNames)\n if (runningDockerGitNames.length === 0) {\n return emptySnapshot()\n }\n\n const knownRunningProjects = detectKnownRunningProjects(items, runningDockerGitNames)\n if (knownRunningProjects.length === 1 && runningDockerGitNames.length === 1) {\n const selected = knownRunningProjects[0]\n if (!selected) {\n return emptySnapshot()\n }\n return {\n activeDir: selected.projectDir,\n runningDockerGitContainers: 1,\n message: `Auto-selected active project: ${selected.displayName}.`\n }\n }\n\n if (knownRunningProjects.length === 0) {\n return {\n activeDir: null,\n runningDockerGitContainers: runningDockerGitNames.length,\n message: `${renderRunningHint(runningDockerGitNames.length)} No matching project config found.`\n }\n }\n\n return {\n activeDir: null,\n runningDockerGitContainers: runningDockerGitNames.length,\n message: `${renderRunningHint(runningDockerGitNames.length)} Use Select project to choose active.`\n }\n}\n\nexport const defaultMenuStartupSnapshot = emptySnapshot\n","import { runDockerPsNames } from \"@effect-template/lib/shell/docker\"\nimport { type InputCancelledError, InputReadError } from \"@effect-template/lib/shell/errors\"\nimport { type AppError, renderError } from \"@effect-template/lib/usecases/errors\"\nimport { listProjectItems } from \"@effect-template/lib/usecases/projects\"\nimport { NodeContext } from \"@effect/platform-node\"\nimport { Effect, pipe } from \"effect\"\nimport { render, useApp, useInput } from \"ink\"\nimport React, { useEffect, useMemo, useState } from \"react\"\n\nimport { resolveCreateInputs } from \"./menu-create.js\"\nimport { handleUserInput, type InputStage } from \"./menu-input-handler.js\"\nimport {\n renderAuthMenu,\n renderAuthPrompt,\n renderCreate,\n renderMenu,\n renderProjectAuthMenu,\n renderProjectAuthPrompt,\n renderSelect,\n renderStepLabel\n} from \"./menu-render.js\"\nimport { leaveTui, resumeTui } from \"./menu-shared.js\"\nimport { defaultMenuStartupSnapshot, resolveMenuStartupSnapshot } from \"./menu-startup.js\"\nimport { createSteps, type MenuEnv, type MenuState, type ViewState } from \"./menu-types.js\"\n\n// CHANGE: keep menu state in the TUI layer\n// WHY: provide a dynamic interface with live selection and inputs\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: input(s) -> state'(s)\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: activeDir updated only after successful create\n// COMPLEXITY: O(1) per keypress\n\nconst useRunner = (\n setBusy: (busy: boolean) => void,\n setMessage: (message: string | null) => void\n) => {\n const runEffect = function<E extends AppError>(effect: Effect.Effect<void, E, MenuEnv>) {\n setBusy(true)\n const program = pipe(\n effect,\n Effect.matchEffect({\n onFailure: (error) =>\n Effect.sync(() => {\n setMessage(renderError(error))\n }),\n onSuccess: () => Effect.void\n }),\n Effect.ensuring(\n Effect.sync(() => {\n setBusy(false)\n })\n )\n )\n void Effect.runPromise(Effect.provide(program, NodeContext.layer))\n }\n\n return { runEffect }\n}\n\ntype RenderContext = {\n readonly state: MenuState\n readonly view: ViewState\n readonly activeDir: string | null\n readonly runningDockerGitContainers: number\n readonly selected: number\n readonly busy: boolean\n readonly message: string | null\n}\n\nconst renderView = (context: RenderContext) => {\n if (context.view._tag === \"Menu\") {\n return renderMenu({\n cwd: context.state.cwd,\n activeDir: context.activeDir,\n runningDockerGitContainers: context.runningDockerGitContainers,\n selected: context.selected,\n busy: context.busy,\n message: context.message\n })\n }\n\n if (context.view._tag === \"Create\") {\n const currentDefaults = resolveCreateInputs(context.state.cwd, context.view.values)\n const step = createSteps[context.view.step] ?? \"repoUrl\"\n const label = renderStepLabel(step, currentDefaults)\n\n return renderCreate(label, context.view.buffer, context.message, context.view.step, currentDefaults)\n }\n\n if (context.view._tag === \"AuthMenu\") {\n return renderAuthMenu(context.view.snapshot, context.view.selected, context.message)\n }\n\n if (context.view._tag === \"AuthPrompt\") {\n return renderAuthPrompt(context.view, context.message)\n }\n\n if (context.view._tag === \"ProjectAuthMenu\") {\n return renderProjectAuthMenu(context.view.snapshot, context.view.selected, context.message)\n }\n\n if (context.view._tag === \"ProjectAuthPrompt\") {\n return renderProjectAuthPrompt(context.view, context.message)\n }\n\n return renderSelect({\n purpose: context.view.purpose,\n items: context.view.items,\n selected: context.view.selected,\n runtimeByProject: context.view.runtimeByProject,\n confirmDelete: context.view.confirmDelete,\n connectEnableMcpPlaywright: context.view.connectEnableMcpPlaywright,\n message: context.message\n })\n}\n\nconst useMenuState = () => {\n const [activeDir, setActiveDir] = useState<string | null>(null)\n const [runningDockerGitContainers, setRunningDockerGitContainers] = useState(0)\n const [selected, setSelected] = useState(0)\n const [busy, setBusy] = useState(false)\n const [message, setMessage] = useState<string | null>(null)\n const [view, setView] = useState<ViewState>({ _tag: \"Menu\" })\n const [inputStage, setInputStage] = useState<InputStage>(\"cold\")\n const [ready, setReady] = useState(false)\n const [skipInputs, setSkipInputs] = useState(2)\n const [sshActive, setSshActive] = useState(false)\n const ignoreUntil = useMemo(() => Date.now() + 400, [])\n const state = useMemo<MenuState>(() => ({ cwd: process.cwd(), activeDir }), [activeDir])\n const runner = useRunner(setBusy, setMessage)\n\n return {\n activeDir,\n setActiveDir,\n runningDockerGitContainers,\n setRunningDockerGitContainers,\n selected,\n setSelected,\n busy,\n message,\n setMessage,\n view,\n setView,\n inputStage,\n setInputStage,\n ready,\n setReady,\n skipInputs,\n setSkipInputs,\n sshActive,\n setSshActive,\n ignoreUntil,\n state,\n runner\n }\n}\n\nconst useReadyGate = (setReady: (ready: boolean) => void) => {\n useEffect(() => {\n const timer = setTimeout(() => {\n setReady(true)\n }, 150)\n return () => {\n clearTimeout(timer)\n }\n }, [setReady])\n}\n\nconst useStartupSnapshot = (\n setActiveDir: (value: string | null) => void,\n setRunningDockerGitContainers: (value: number) => void,\n setMessage: (message: string | null) => void\n) => {\n useEffect(() => {\n let cancelled = false\n\n const startup = pipe(\n Effect.all([listProjectItems, runDockerPsNames(process.cwd())]),\n Effect.map(([items, runningNames]) => resolveMenuStartupSnapshot(items, runningNames)),\n Effect.match({\n onFailure: () => defaultMenuStartupSnapshot(),\n onSuccess: (snapshot) => snapshot\n }),\n Effect.provide(NodeContext.layer)\n )\n\n void Effect.runPromise(startup).then((snapshot) => {\n if (cancelled) {\n return\n }\n setRunningDockerGitContainers(snapshot.runningDockerGitContainers)\n setMessage(snapshot.message)\n if (snapshot.activeDir !== null) {\n setActiveDir(snapshot.activeDir)\n }\n })\n\n return () => {\n cancelled = true\n }\n }, [setActiveDir, setMessage, setRunningDockerGitContainers])\n}\n\nconst useSigintGuard = (exit: () => void, sshActive: boolean) => {\n useEffect(() => {\n const handleSigint = () => {\n if (sshActive) {\n return\n }\n exit()\n }\n process.on(\"SIGINT\", handleSigint)\n return () => {\n process.off(\"SIGINT\", handleSigint)\n }\n }, [exit, sshActive])\n}\n\nconst TuiApp = () => {\n const { exit } = useApp()\n const menu = useMenuState()\n\n useReadyGate(menu.setReady)\n useStartupSnapshot(menu.setActiveDir, menu.setRunningDockerGitContainers, menu.setMessage)\n useSigintGuard(exit, menu.sshActive)\n\n useInput(\n (input, key) => {\n if (!menu.ready) {\n return\n }\n if (Date.now() < menu.ignoreUntil) {\n return\n }\n if (menu.skipInputs > 0) {\n menu.setSkipInputs((value) => (value > 0 ? value - 1 : 0))\n return\n }\n handleUserInput(input, key, {\n busy: menu.busy,\n view: menu.view,\n inputStage: menu.inputStage,\n setInputStage: menu.setInputStage,\n selected: menu.selected,\n setSelected: menu.setSelected,\n setSkipInputs: menu.setSkipInputs,\n sshActive: menu.sshActive,\n setSshActive: menu.setSshActive,\n state: menu.state,\n runner: menu.runner,\n exit,\n setView: menu.setView,\n setMessage: menu.setMessage,\n setActiveDir: menu.setActiveDir\n })\n },\n { isActive: !menu.sshActive }\n )\n\n return renderView({\n state: menu.state,\n view: menu.view,\n activeDir: menu.activeDir,\n runningDockerGitContainers: menu.runningDockerGitContainers,\n selected: menu.selected,\n busy: menu.busy,\n message: menu.message\n })\n}\n\n// CHANGE: provide an interactive TUI menu for docker-git\n// WHY: allow dynamic selection and inline create flow without raw prompts\n// QUOTE(ТЗ): \"TUI? Красивый, удобный\"\n// REF: user-request-2026-02-01-tui\n// SOURCE: n/a\n// FORMAT THEOREM: forall s: tui(s) -> state transitions\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: app exits only on Quit or ctrl+c\n// COMPLEXITY: O(1) per input\nexport const runMenu = pipe(\n Effect.sync(() => {\n resumeTui()\n }),\n Effect.zipRight(\n Effect.tryPromise({\n try: () => render(React.createElement(TuiApp)).waitUntilExit(),\n catch: (error) => new InputReadError({ message: error instanceof Error ? error.message : String(error) })\n })\n ),\n Effect.ensuring(\n Effect.sync(() => {\n leaveTui()\n })\n ),\n Effect.asVoid\n)\n\nexport type MenuError = AppError | InputCancelledError\n","import type { Command, ParseError } from \"@effect-template/lib/core/domain\"\nimport { createProject } from \"@effect-template/lib/usecases/actions\"\nimport { applyProjectConfig } from \"@effect-template/lib/usecases/apply\"\nimport {\n authClaudeLogin,\n authClaudeLogout,\n authClaudeStatus,\n authCodexLogin,\n authCodexLogout,\n authCodexStatus,\n authGithubLogin,\n authGithubLogout,\n authGithubStatus\n} from \"@effect-template/lib/usecases/auth\"\nimport type { AppError } from \"@effect-template/lib/usecases/errors\"\nimport { renderError } from \"@effect-template/lib/usecases/errors\"\nimport { mcpPlaywrightUp } from \"@effect-template/lib/usecases/mcp-playwright\"\nimport { downAllDockerGitProjects, listProjectStatus } from \"@effect-template/lib/usecases/projects\"\nimport { exportScrap, importScrap } from \"@effect-template/lib/usecases/scrap\"\nimport {\n stateCommit,\n stateInit,\n statePath,\n statePull,\n statePush,\n stateStatus,\n stateSync\n} from \"@effect-template/lib/usecases/state-repo\"\nimport {\n killTerminalProcess,\n listTerminalSessions,\n tailTerminalLogs\n} from \"@effect-template/lib/usecases/terminal-sessions\"\nimport { Effect, Match, pipe } from \"effect\"\nimport { readCommand } from \"./cli/read-command.js\"\nimport { attachTmux, listTmuxPanes } from \"./tmux.js\"\n\nimport { runMenu } from \"./menu.js\"\n\nconst isParseError = (error: AppError): error is ParseError =>\n error._tag === \"UnknownCommand\" ||\n error._tag === \"UnknownOption\" ||\n error._tag === \"MissingOptionValue\" ||\n error._tag === \"MissingRequiredOption\" ||\n error._tag === \"InvalidOption\" ||\n error._tag === \"UnexpectedArgument\"\n\nconst setExitCode = (code: number) =>\n Effect.sync(() => {\n process.exitCode = code\n })\n\nconst logWarningAndExit = (error: AppError) =>\n pipe(\n Effect.logWarning(renderError(error)),\n Effect.tap(() => setExitCode(1)),\n Effect.asVoid\n )\n\nconst logErrorAndExit = (error: AppError) =>\n pipe(\n Effect.logError(renderError(error)),\n Effect.tap(() => setExitCode(1)),\n Effect.asVoid\n )\n\ntype NonBaseCommand = Exclude<\n Command,\n | { readonly _tag: \"Help\" }\n | { readonly _tag: \"Create\" }\n | { readonly _tag: \"Status\" }\n | { readonly _tag: \"DownAll\" }\n | { readonly _tag: \"Menu\" }\n>\n\nconst handleNonBaseCommand = (command: NonBaseCommand) =>\n Match.value(command)\n .pipe(\n Match.when({ _tag: \"StatePath\" }, () => statePath),\n Match.when({ _tag: \"StateInit\" }, (cmd) => stateInit(cmd)),\n Match.when({ _tag: \"StateStatus\" }, () => stateStatus),\n Match.when({ _tag: \"StatePull\" }, () => statePull),\n Match.when({ _tag: \"StateCommit\" }, (cmd) => stateCommit(cmd.message)),\n Match.when({ _tag: \"StatePush\" }, () => statePush),\n Match.when({ _tag: \"StateSync\" }, (cmd) => stateSync(cmd.message)),\n Match.when({ _tag: \"AuthGithubLogin\" }, (cmd) => authGithubLogin(cmd)),\n Match.when({ _tag: \"AuthGithubStatus\" }, (cmd) => authGithubStatus(cmd)),\n Match.when({ _tag: \"AuthGithubLogout\" }, (cmd) => authGithubLogout(cmd)),\n Match.when({ _tag: \"AuthCodexLogin\" }, (cmd) => authCodexLogin(cmd)),\n Match.when({ _tag: \"AuthCodexStatus\" }, (cmd) => authCodexStatus(cmd)),\n Match.when({ _tag: \"AuthCodexLogout\" }, (cmd) => authCodexLogout(cmd)),\n Match.when({ _tag: \"AuthClaudeLogin\" }, (cmd) => authClaudeLogin(cmd)),\n Match.when({ _tag: \"AuthClaudeStatus\" }, (cmd) => authClaudeStatus(cmd)),\n Match.when({ _tag: \"AuthClaudeLogout\" }, (cmd) => authClaudeLogout(cmd)),\n Match.when({ _tag: \"Attach\" }, (cmd) => attachTmux(cmd)),\n Match.when({ _tag: \"Panes\" }, (cmd) => listTmuxPanes(cmd)),\n Match.when({ _tag: \"SessionsList\" }, (cmd) => listTerminalSessions(cmd)),\n Match.when({ _tag: \"SessionsKill\" }, (cmd) => killTerminalProcess(cmd))\n )\n .pipe(\n Match.when({ _tag: \"Apply\" }, (cmd) => applyProjectConfig(cmd)),\n Match.when({ _tag: \"SessionsLogs\" }, (cmd) => tailTerminalLogs(cmd)),\n Match.when({ _tag: \"ScrapExport\" }, (cmd) => exportScrap(cmd)),\n Match.when({ _tag: \"ScrapImport\" }, (cmd) => importScrap(cmd)),\n Match.when({ _tag: \"McpPlaywrightUp\" }, (cmd) => mcpPlaywrightUp(cmd)),\n Match.exhaustive\n )\n\n// CHANGE: compose CLI program with typed errors and shell effects\n// WHY: keep a thin entry layer over pure parsing and template generation\n// QUOTE(ТЗ): \"CLI команду... создавать докер образы\"\n// REF: user-request-2026-01-07\n// SOURCE: n/a\n// FORMAT THEOREM: forall cmd: handle(cmd) terminates with typed outcome\n// PURITY: SHELL\n// EFFECT: Effect<void, AppError, FileSystem | Path | CommandExecutor>\n// INVARIANT: help is printed without side effects beyond logs\n// COMPLEXITY: O(n) where n = |files|\nexport const program = pipe(\n readCommand,\n Effect.flatMap((command: Command) =>\n Match.value(command).pipe(\n Match.when({ _tag: \"Help\" }, ({ message }) => Effect.log(message)),\n Match.when({ _tag: \"Create\" }, (create) => createProject(create)),\n Match.when({ _tag: \"Status\" }, () => listProjectStatus),\n Match.when({ _tag: \"DownAll\" }, () => downAllDockerGitProjects),\n Match.when({ _tag: \"Menu\" }, () => runMenu),\n Match.orElse((cmd) => handleNonBaseCommand(cmd))\n )\n ),\n Effect.catchTag(\"FileExistsError\", (error) =>\n pipe(\n Effect.logWarning(renderError(error)),\n Effect.asVoid\n )),\n Effect.catchTag(\"DockerAccessError\", logWarningAndExit),\n Effect.catchTag(\"DockerCommandError\", logWarningAndExit),\n Effect.catchTag(\"AuthError\", logWarningAndExit),\n Effect.catchTag(\"CommandFailedError\", logWarningAndExit),\n Effect.catchTag(\"ScrapArchiveNotFoundError\", logErrorAndExit),\n Effect.catchTag(\"ScrapTargetDirUnsupportedError\", logErrorAndExit),\n Effect.catchTag(\"ScrapWipeRefusedError\", logErrorAndExit),\n Effect.matchEffect({\n onFailure: (error) =>\n isParseError(error)\n ? logErrorAndExit(error)\n : pipe(\n Effect.logError(renderError(error)),\n Effect.flatMap(() => Effect.fail(error))\n ),\n onSuccess: () => Effect.void\n }),\n Effect.asVoid\n)\n","#!/usr/bin/env node\n\nimport { NodeContext, NodeRuntime } from \"@effect/platform-node\"\nimport { Effect } from \"effect\"\n\nimport { program } from \"./program.js\"\n\n// CHANGE: run docker-git CLI through the Node runtime\n// WHY: ensure platform services (FS, Path, Command) are available in app CLI\n// QUOTE(ТЗ): \"CLI (отображение, фронт) это app\"\n// REF: user-request-2026-01-28-cli-move\n// SOURCE: n/a\n// FORMAT THEOREM: forall env: runMain(program, env) -> exit\n// PURITY: SHELL\n// EFFECT: Effect<void, unknown, NodeContext>\n// INVARIANT: program runs with NodeContext.layer\n// COMPLEXITY: O(n)\nconst main = Effect.provide(program, NodeContext.layer)\n\nNodeRuntime.runMain(main)\n"],"names":["collectUint8Array","process","formatParseError","isParseError","defaultEnvContents","ensureEnvFile","resolveGithubToken","gitBaseEnv","escapeForDoubleQuotes","toPosixPath","prBranch","compareUrl","_","resolvePathFromBase","maxPortAttempts","ensureBridgeAccess","buildSshArgs","Fiber","repo","hasNonEmptyOauthToken","method","ScrapArchiveInvalidErrorClass","dockerOk","shellEscape","CommandFailedErrorClass","runDockerExecCapture","runDockerExec","ScrapWipeRefusedErrorClass","normalizeLabel","codexHome","render","flowSteps","successMessage","buildGlobalEnvPath","buildClaudeAuthPath","emptyRuntimeByProject","stoppedRuntime","tokenKey","runProjectAuthAction","renderCountLine","program"],"mappings":"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"}
|