@@ -206,6 +206,15 @@ cleanup() {
206206 log " Shutting down (signal received)..."
207207 stop_heartbeat
208208 report_status " KILLED" " Container terminated by signal"
209+
210+ # Cleanup worktree if it exists
211+ if [ -n " ${WORKTREE_PATH} " ] && [ -d " ${WORKTREE_PATH} " ]; then
212+ log " Cleaning up worktree on exit..."
213+ cd /bare-repo.git 2> /dev/null || true
214+ git worktree remove " ${WORKTREE_PATH} " --force 2> /dev/null || true
215+ log " Worktree removed: ${WORKTREE_PATH} "
216+ fi
217+
209218 rm -f /tmp/agent-alive
210219 exit 1
211220}
@@ -254,19 +263,45 @@ log "gh auth status: ${GH_STATUS}"
254263git config --global user.name " Trinity Agent"
255264git config --global user.email " trinity-agent@users.noreply.github.com"
256265
257- # === 2. Clone (with retry) ===
258- report_status " AWAKENING" " Cloning repository"
259- if ! retry " gh repo clone '${REPO_URL} ' /workspace/trinity -- --depth=50 2>/dev/null" ; then
260- report_status " FAILED" " Git clone failed after 3 attempts"
266+ # === 2. Setup worktree from shared bare repo ===
267+ report_status " AWAKENING" " Creating worktree from bare repository"
268+
269+ # Check if bare repo needs to be created or updated
270+ if [ ! -d /bare-repo.git/objects ]; then
271+ log " Bare repo not found, creating from remote..."
272+ if ! retry " git clone --bare --depth=50 '${REPO_URL} ' /bare-repo.git 2>/dev/null" ; then
273+ report_status " FAILED" " Git bare clone failed after 3 attempts"
274+ stop_heartbeat
275+ rm -f /tmp/agent-alive
276+ exit 1
277+ fi
278+ else
279+ log " Updating bare repo from remote..."
280+ cd /bare-repo.git
281+ retry " git fetch origin main --depth=50 2>/dev/null" || log " Warning: bare repo update failed"
282+ fi
283+
284+ # Create worktree for this agent (fast! ~5-10s vs ~60s for full clone)
285+ WORKTREE_PATH=" /workspace/trinity-${ISSUE} "
286+ if [ -d " ${WORKTREE_PATH} " ]; then
287+ log " Removing existing worktree..."
288+ rm -rf " ${WORKTREE_PATH} "
289+ fi
290+
291+ cd /bare-repo.git
292+ if ! retry " git worktree add '${WORKTREE_PATH} ' main 2>/dev/null" ; then
293+ report_status " FAILED" " Git worktree add failed after 3 attempts"
261294 stop_heartbeat
262295 rm -f /tmp/agent-alive
263296 exit 1
264297fi
265- cd /workspace/trinity
298+ cd " ${WORKTREE_PATH} "
299+
300+ log " Worktree created at ${WORKTREE_PATH} "
266301
267302# === 3. Prepare SOUL.md ===
268303log " Injecting soul..."
269- sed " s/{ISSUE_NUMBER}/${ISSUE} /g" /etc/trinity/SOUL.md > /workspace/trinity/ CLAUDE.md.agent
304+ sed " s/{ISSUE_NUMBER}/${ISSUE} /g" /etc/trinity/SOUL.md > " ${WORKTREE_PATH} / CLAUDE.md.agent"
270305
271306# === 4. Read issue ===
272307report_status " READING" " Reading issue #${ISSUE} "
@@ -399,6 +434,12 @@ Commits: ${COMMIT_COUNT}" \
399434\`\`\`
400435${DIFF_STAT}
401436\`\`\` " 2> /dev/null || true
437+
438+ # Cleanup worktree after PR creation (keeps shared bare repo intact)
439+ log " Cleaning up worktree..."
440+ cd /bare-repo.git
441+ git worktree remove " ${WORKTREE_PATH} " --force 2> /dev/null || true
442+ log " Worktree removed: ${WORKTREE_PATH} "
402443 fi
403444 else
404445 report_status " FAILED" " No commits produced — agent could not solve issue"
0 commit comments