@@ -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}"
256265git config --global user.name " Trinity Agent"
257266git 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
266299fi
267- cd /workspace/trinity
300+ cd " ${WORKTREE_PATH} "
301+
302+ log " Worktree created at ${WORKTREE_PATH} "
268303
269304# === 3. Prepare SOUL.md ===
270305log " 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 ===
274309report_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