diff --git a/packages/adapters/claude-local/src/server/execute.ts b/packages/adapters/claude-local/src/server/execute.ts index f047383a19e..0afe7510b3d 100644 --- a/packages/adapters/claude-local/src/server/execute.ts +++ b/packages/adapters/claude-local/src/server/execute.ts @@ -1,3 +1,4 @@ +import { execFile } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; @@ -56,6 +57,16 @@ import { prepareClaudePromptBundle } from "./prompt-cache.js"; const __moduleDir = path.dirname(fileURLToPath(import.meta.url)); +async function ensureGitRepo(dir: string): Promise { + try { + await fs.access(path.join(dir, ".git")); + } catch { + await new Promise((resolve, reject) => { + execFile("git", ["init"], { cwd: dir }, (err) => (err ? reject(err) : resolve())); + }); + } +} + interface ClaudeExecutionInput { runId: string; agent: AdapterExecutionContext["agent"]; @@ -146,6 +157,9 @@ async function buildClaudeRuntimeConfig(input: ClaudeExecutionInput): Promise 0 + ? parts + : waitingText + ? [{ type: "text", text: waitingText }] + : []; const message: ThreadAssistantMessage = { id: `run-assistant:${run.id}`, @@ -859,7 +863,9 @@ export function buildIssueChatMessages(args: { }); } + const linkedRunIds = new Set(linkedRuns.map((r) => r.runId)); for (const run of normalizeLiveRuns(liveRuns, activeRun, issueId)) { + if (linkedRunIds.has(run.id)) continue; orderedMessages.push({ createdAtMs: toTimestamp(run.startedAt ?? run.createdAt), order: 3,