Skip to content

Commit 5324b08

Browse files
authored
Merge pull request #130 from gHashTag/feat/issue-125
feat(cloud): git worktree isolation for faster agent startup (#125)
2 parents c639376 + a10bd36 commit 5324b08

2 files changed

Lines changed: 56 additions & 9 deletions

File tree

deploy/Dockerfile.agent

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,15 @@ RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
3030
&& npm install -g @anthropic-ai/claude-code \
3131
&& rm -rf /var/lib/apt/lists/*
3232

33-
# Pre-clone and pre-build (cached — saves ~2min on spawn)
34-
RUN git clone --depth=50 https://github.com/gHashTag/trinity.git /prebuild \
35-
&& cd /prebuild && zig build || true
33+
# Pre-clone as bare repo + pre-build (cached — saves ~2min on spawn)
34+
# Bare repo enables fast git worktree add for agent containers
35+
RUN git clone --bare --depth=50 https://github.com/gHashTag/trinity.git /bare-repo.git \
36+
&& git clone --local /bare-repo.git /tmp/build \
37+
&& cd /tmp/build && zig build || true \
38+
&& rm -rf /tmp/build
39+
40+
# Shared bare repo volume (fast worktree creation for each agent)
41+
VOLUME ["/bare-repo.git"]
3642

3743
# Stage 2: Runtime (fast start)
3844
FROM prebuild AS runtime

deploy/agent-entrypoint.sh

Lines changed: 47 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,15 @@ cleanup() {
208208
log "Shutting down (signal received)..."
209209
stop_heartbeat
210210
report_status "KILLED" "Container terminated by signal"
211+
212+
# Cleanup worktree if it exists
213+
if [ -n "${WORKTREE_PATH}" ] && [ -d "${WORKTREE_PATH}" ]; then
214+
log "Cleaning up worktree on exit..."
215+
cd /bare-repo.git 2>/dev/null || true
216+
git worktree remove "${WORKTREE_PATH}" --force 2>/dev/null || true
217+
log "Worktree removed: ${WORKTREE_PATH}"
218+
fi
219+
211220
rm -f /tmp/agent-alive
212221
exit 1
213222
}
@@ -256,19 +265,45 @@ log "gh auth status: ${GH_STATUS}"
256265
git config --global user.name "Trinity Agent"
257266
git config --global user.email "trinity-agent@users.noreply.github.com"
258267

259-
# === 2. Clone (with retry) ===
260-
report_status "AWAKENING" "Cloning repository"
261-
if ! retry "gh repo clone '${REPO_URL}' /workspace/trinity -- --depth=50 2>/dev/null"; then
262-
report_status "FAILED" "Git clone failed after 3 attempts"
268+
# === 2. Setup worktree from shared bare repo ===
269+
report_status "AWAKENING" "Creating worktree from bare repository"
270+
271+
# Check if bare repo needs to be created or updated
272+
if [ ! -d /bare-repo.git/objects ]; then
273+
log "Bare repo not found, creating from remote..."
274+
if ! retry "git clone --bare --depth=50 '${REPO_URL}' /bare-repo.git 2>/dev/null"; then
275+
report_status "FAILED" "Git bare clone failed after 3 attempts"
276+
stop_heartbeat
277+
rm -f /tmp/agent-alive
278+
exit 1
279+
fi
280+
else
281+
log "Updating bare repo from remote..."
282+
cd /bare-repo.git
283+
retry "git fetch origin main --depth=50 2>/dev/null" || log "Warning: bare repo update failed"
284+
fi
285+
286+
# Create worktree for this agent (fast! ~5-10s vs ~60s for full clone)
287+
WORKTREE_PATH="/workspace/trinity-${ISSUE}"
288+
if [ -d "${WORKTREE_PATH}" ]; then
289+
log "Removing existing worktree..."
290+
rm -rf "${WORKTREE_PATH}"
291+
fi
292+
293+
cd /bare-repo.git
294+
if ! retry "git worktree add '${WORKTREE_PATH}' main 2>/dev/null"; then
295+
report_status "FAILED" "Git worktree add failed after 3 attempts"
263296
stop_heartbeat
264297
rm -f /tmp/agent-alive
265298
exit 1
266299
fi
267-
cd /workspace/trinity
300+
cd "${WORKTREE_PATH}"
301+
302+
log "Worktree created at ${WORKTREE_PATH}"
268303

269304
# === 3. Prepare SOUL.md ===
270305
log "Injecting soul..."
271-
sed "s/{ISSUE_NUMBER}/${ISSUE}/g" /etc/trinity/SOUL.md > /workspace/trinity/CLAUDE.md.agent
306+
sed "s/{ISSUE_NUMBER}/${ISSUE}/g" /etc/trinity/SOUL.md > "${WORKTREE_PATH}/CLAUDE.md.agent"
272307

273308
# === 4. Read issue ===
274309
report_status "READING" "Reading issue #${ISSUE}"
@@ -381,6 +416,12 @@ Commits: ${COMMIT_COUNT}" \
381416
\`\`\`
382417
${DIFF_STAT}
383418
\`\`\`" 2>/dev/null || true
419+
420+
# Cleanup worktree after PR creation (keeps shared bare repo intact)
421+
log "Cleaning up worktree..."
422+
cd /bare-repo.git
423+
git worktree remove "${WORKTREE_PATH}" --force 2>/dev/null || true
424+
log "Worktree removed: ${WORKTREE_PATH}"
384425
fi
385426
else
386427
report_status "FAILED" "No commits produced — agent could not solve issue"

0 commit comments

Comments
 (0)