diff --git a/packages/app/src/docker-git/main.ts b/packages/app/src/docker-git/main.ts index c869795..dc448f7 100644 --- a/packages/app/src/docker-git/main.ts +++ b/packages/app/src/docker-git/main.ts @@ -1,5 +1,6 @@ #!/usr/bin/env node +import * as _9 from "@effect/cli" import * as _1 from "@effect/cluster" import * as _2 from "@effect/experimental" import * as _3 from "@effect/printer" @@ -8,15 +9,14 @@ import * as _5 from "@effect/rpc" import * as _6 from "@effect/sql" import * as _7 from "@effect/typeclass" import * as _8 from "@effect/workflow" -import * as _9 from "@effect/cli" - -export const _dummyDeps = [_1, _2, _3, _4, _5, _6, _7, _8, _9] import { NodeContext, NodeRuntime } from "@effect/platform-node" import { Effect } from "effect" import { program } from "./program.js" +export const _dummyDeps = [_1, _2, _3, _4, _5, _6, _7, _8, _9] + // CHANGE: run docker-git CLI through the Node runtime // WHY: ensure platform services (FS, Path, Command) are available in app CLI // QUOTE(ТЗ): "CLI (отображение, фронт) это app" diff --git a/packages/app/src/docker-git/spawn.ts b/packages/app/src/docker-git/spawn.ts index 82bd19a..16f5ef4 100644 --- a/packages/app/src/docker-git/spawn.ts +++ b/packages/app/src/docker-git/spawn.ts @@ -119,6 +119,35 @@ const buildSpawnCreateCommand = (outDir: string, force: boolean): CreateCommand } } +const spawnAttachDirect = ( + template: TemplateConfig, + projectDir: string, + sshKey: string | null, + ipAddress: string | undefined +): Effect.Effect => + Effect.gen(function*(_) { + yield* _(Effect.log("Starting opencode directly via SSH...")) + yield* _( + runCommandWithExitCodes( + { + cwd: process.cwd(), + command: "ssh", + args: buildSshArgs( + template, + sshKey, + ipAddress, + `cd '${projectDir}' && spawn-dock agent` + ).filter((arg) => + arg !== "-T" && arg !== "-o" && arg !== "BatchMode=yes" && arg !== "ConnectTimeout=2" && + arg !== "ConnectionAttempts=1" + ) + }, + [0, 255], // SSH frequently exits with 255 on user disconnect, which is normal + (exitCode) => new CommandFailedError({ command: "ssh agent", exitCode }) + ) + ) + }) + // CHANGE: orchestrate spawn-dock spawn — creates container, runs @spawn-dock/create, opens tmux+opencode // WHY: provide one-command bootstrap from a Telegram bot pairing token // REF: spawn-command @@ -173,21 +202,5 @@ export const spawnProject = (command: SpawnCommand) => yield* _(Effect.log(`Project bootstrapped at ${projectDir}`)) - yield* _(Effect.log("Starting opencode directly via SSH...")) - yield* _( - runCommandWithExitCodes( - { - cwd: process.cwd(), - command: "ssh", - args: buildSshArgs( - template, - sshKey, - ipAddress, - `cd '${projectDir}' && spawn-dock agent` - ).filter((arg) => arg !== "-T" && arg !== "-o" && arg !== "BatchMode=yes" && arg !== "ConnectTimeout=2" && arg !== "ConnectionAttempts=1") - }, - [0, 255], // SSH frequently exits with 255 on user disconnect, which is normal - (exitCode) => new CommandFailedError({ command: "ssh agent", exitCode }) - ) - ) + yield* _(spawnAttachDirect(template, projectDir, sshKey, ipAddress)) })