diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index d199d98..675f137 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -1243,40 +1243,62 @@ cmd_start() { exit 1 fi + local fork_log="$SESSIONS_DIR/$session_file.fork.log" + if [ "$DEBUG_MODE" = true ]; then - (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) | tee "$SESSIONS_DIR/$session_file.debug.log" & + (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) | tee "$fork_log" & else - (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) & + (cd "$worktree_path" && opencode run "$message" --fork --session "$base_session_id" 2>&1) >> "$fork_log" & fi - # Wait briefly for session to be created - sleep 1 - - # Find the new session by comparing before/after lists - # Skip any session that existed before the fork and skip base/pm-agent + local fork_pid=$! + + local max_attempts=10 + local attempt=1 local new_session_id="" - while IFS= read -r sess; do - # Skip base and pm-agent - [ "$sess" = "$base_session_id" ] && continue - [ "$sess" = "$pm_agent_session_id" ] && continue + + while [ $attempt -le $max_attempts ]; do + sleep 1 - # Check if this session existed before - local existed_before=false - for before_sess in "${before_sessions[@]}"; do - if [ "$sess" = "$before_sess" ]; then - existed_before=true - break + if ! kill -0 $fork_pid 2>/dev/null; then + if [ -s "$fork_log" ]; then + echo "Fork command exited. Log output:" >&2 + tail -20 "$fork_log" >&2 fi - done - - if [ "$existed_before" = false ]; then - new_session_id="$sess" break fi - done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+') + + while IFS= read -r sess; do + [ "$sess" = "$base_session_id" ] && continue + [ "$sess" = "$pm_agent_session_id" ] && continue + + local existed_before=false + for before_sess in "${before_sessions[@]}"; do + if [ "$sess" = "$before_sess" ]; then + existed_before=true + break + fi + done + + if [ "$existed_before" = false ]; then + new_session_id="$sess" + break + fi + done < <(opencode session list 2>/dev/null | grep -oP '^ses_\w+') + + if [ -n "$new_session_id" ]; then + break + fi + + attempt=$((attempt + 1)) + done if [ -z "$new_session_id" ]; then - echo "Error: Could not find newly created session" >&2 + echo "Error: Could not find newly created session after ${max_attempts}s" >&2 + if [ -f "$fork_log" ] && [ -s "$fork_log" ]; then + echo "Fork log:" >&2 + tail -30 "$fork_log" >&2 + fi remove_worktree_for_issue "$issue_ref" exit 1 fi