From 963e0f45f20c732cf95cd38b2a888bb72a8cceef Mon Sep 17 00:00:00 2001 From: shokollm <270575765+shokollm@users.noreply.github.com> Date: Tue, 31 Mar 2026 05:23:39 +0000 Subject: [PATCH] fix(kugetsu): remove broken session existence check The check_opencode_session_exists() function was fundamentally broken because 'opencode session list' does not include forked sessions, regardless of output format (table or JSON). This caused false 'session expired' reports even when sessions were fully functional. Changes: - Remove session check from cmd_status() - now returns 'ok' if session registered - Remove session check from cmd_delegate() - let opencode run fail naturally - Remove warning from cmd_continue() - proceed regardless - Simplify cmd_doctor() - just show registered sessions - Update test to reflect new behavior Issue #38: https://git.fbrns.co/shoko/kugetsu/issues/38 --- skills/kugetsu/scripts/kugetsu | 95 +++++++++---------------- skills/kugetsu/tests/test-kugetsu-v2.sh | 13 ++-- 2 files changed, 40 insertions(+), 68 deletions(-) diff --git a/skills/kugetsu/scripts/kugetsu b/skills/kugetsu/scripts/kugetsu index 1cf0b33..0a56403 100755 --- a/skills/kugetsu/scripts/kugetsu +++ b/skills/kugetsu/scripts/kugetsu @@ -303,7 +303,7 @@ validate_issue_ref() { check_opencode_session_exists() { local session_id="$1" - opencode session list 2>/dev/null | grep -q "^$session_id" + opencode session list --format json 2>/dev/null | grep -q "\"$session_id\"" } kugetsu_get_pm_context() { @@ -475,11 +475,6 @@ cmd_status() { return fi - if ! check_opencode_session_exists "$pm_agent"; then - echo "pm_agent_expired" - return - fi - echo "ok" } @@ -498,11 +493,6 @@ cmd_delegate() { exit 1 fi - if ! check_opencode_session_exists "$pm_session"; then - echo "Error: PM agent session has expired. Run 'kugetsu init' again." >&2 - exit 1 - fi - opencode run --continue --session "$pm_session" "$message" 2>&1 } @@ -537,12 +527,6 @@ cmd_doctor() { issues=$((issues + 1)) else echo "[OK] Base session: $base" - if check_opencode_session_exists "$base"; then - echo "[OK] Base session active" - else - echo "[ISSUE] Base session expired" - issues=$((issues + 1)) - fi fi local pm_agent=$(get_pm_agent_session_id) @@ -551,12 +535,6 @@ cmd_doctor() { issues=$((issues + 1)) else echo "[OK] PM agent: $pm_agent" - if check_opencode_session_exists "$pm_agent"; then - echo "[OK] PM agent session active" - else - echo "[ISSUE] PM agent session expired" - issues=$((issues + 1)) - fi fi local pm_context_file="${KUGETSU_DIR}/pm-agent.md" @@ -583,44 +561,40 @@ cmd_doctor() { else local pm_agent=$(get_pm_agent_session_id) if [ -n "$pm_agent" ] && [ "$pm_agent" != "null" ] && [ "$pm_agent" != "None" ]; then - if ! check_opencode_session_exists "$pm_agent"; then - echo "[FIX] Recreating expired PM agent session..." - local base=$(get_base_session_id) - if [ -n "$base" ] && [ "$base" != "null" ]; then - rm -f "$SESSIONS_DIR/pm-agent.json" - - local before_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) - local before_set="${before_sessions//$'\n'/|}" - - local pm_context=$(kugetsu_get_pm_context) - if [ -n "$pm_context" ]; then - opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. $pm_context" 2>&1 || true - else - opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. Wait for instructions." 2>&1 || true - fi - - local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) - local new_pm_session_id="" - while IFS= read -r sess; do - if [[ ! "$before_set" =~ \|${sess}\| ]] && [[ "$sess" != "$base" ]]; then - new_pm_session_id="$sess" - break - fi - done <<< "$after_sessions" - - if [ -n "$new_pm_session_id" ]; then - printf '{"type": "pm_agent", "opencode_session_id": "%s", "created_at": "%s", "state": "idle"}\n' \ - "$new_pm_session_id" "$(date -Iseconds)" > "$SESSIONS_DIR/pm-agent.json" - set_pm_agent_in_index "$new_pm_session_id" - echo "[FIX] PM agent recreated: $new_pm_session_id" - else - echo "[FIX] Warning: Could not detect new PM session ID" - fi + echo "[FIX] Recreating PM agent session..." + local base=$(get_base_session_id) + if [ -n "$base" ] && [ "$base" != "null" ]; then + rm -f "$SESSIONS_DIR/pm-agent.json" + + local before_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) + local before_set="${before_sessions//$'\n'/|}" + + local pm_context=$(kugetsu_get_pm_context) + if [ -n "$pm_context" ]; then + opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. $pm_context" 2>&1 || true else - echo "[FIX] Cannot recreate PM agent: base session missing" + opencode run --fork --session "$base" "You are a PM (Project Manager) agent. Your role is to coordinate task delegation and review PRs. Wait for instructions." 2>&1 || true + fi + + local after_sessions=$(opencode session list 2>/dev/null | grep -oP '^ses_\w+' | sort) + local new_pm_session_id="" + while IFS= read -r sess; do + if [[ ! "$before_set" =~ \|${sess}\| ]] && [[ "$sess" != "$base" ]]; then + new_pm_session_id="$sess" + break + fi + done <<< "$after_sessions" + + if [ -n "$new_pm_session_id" ]; then + printf '{"type": "pm_agent", "opencode_session_id": "%s", "created_at": "%s", "state": "idle"}\n' \ + "$new_pm_session_id" "$(date -Iseconds)" > "$SESSIONS_DIR/pm-agent.json" + set_pm_agent_in_index "$new_pm_session_id" + echo "[FIX] PM agent recreated: $new_pm_session_id" + else + echo "[FIX] Warning: Could not detect new PM session ID" fi else - echo "[FIX] PM agent is active, no fix needed" + echo "[FIX] Cannot recreate PM agent: base session missing" fi else echo "[FIX] Cannot fix: PM agent not initialized. Run 'kugetsu init' first." @@ -867,11 +841,6 @@ cmd_continue() { local opencode_session_id=$(python3 -c "import json; print(json.load(open('$session_path'))['opencode_session_id'])") local worktree_path=$(python3 -c "import json; print(json.load(open('$session_path')).get('worktree_path', ''))" 2>/dev/null || echo "") - if ! check_opencode_session_exists "$opencode_session_id"; then - echo "Warning: Session may have expired in opencode" >&2 - echo "Attempting to continue anyway..." >&2 - fi - echo "Continuing session for '$session_name'..." if [ -n "$worktree_path" ] && [ -d "$worktree_path" ]; then echo "Using worktree: $worktree_path" diff --git a/skills/kugetsu/tests/test-kugetsu-v2.sh b/skills/kugetsu/tests/test-kugetsu-v2.sh index 2d6cf52..004a41f 100644 --- a/skills/kugetsu/tests/test-kugetsu-v2.sh +++ b/skills/kugetsu/tests/test-kugetsu-v2.sh @@ -417,14 +417,17 @@ else fi echo "" -# Test 25: status when all good (pm-agent in json but session expired) -echo "--- Test: status (session expired) ---" +# Test 25: status when all good (pm-agent in json - no longer checks opencode) +# Note: check_opencode_session_exists was removed because forked sessions +# don't appear in 'opencode session list'. Status now returns 'ok' if +# session is registered in kugetsu index, regardless of opencode state. +echo "--- Test: status (session registered) ---" setup_mock_base OUTPUT=$($KUGETSU status 2>&1 || true) -if [ "$OUTPUT" = "pm_agent_expired" ]; then - pass "status returns pm_agent_expired when session not in opencode" +if [ "$OUTPUT" = "ok" ]; then + pass "status returns ok when session is in kugetsu index" else - fail "status session expired: got '$OUTPUT', expected 'pm_agent_expired'" + fail "status session registered: got '$OUTPUT', expected 'ok'" fi echo "" -- 2.49.1