ScuttleBot
fix: claude-relay --session-id arg ordering + discovery logging Put --session-id first in args so it's parsed before user flags. Add stderr logging for session ID and file discovery. Use separate slice allocation to avoid mutating cfg.Args.
Commit
915ee1617518de4605e354d39689b46a2abbde42ac32f6918509750fbecfccfa
Parent
8134f34d1fa44d3…
1 file changed
+7
-2
+7
-2
| --- cmd/claude-relay/main.go | ||
| +++ cmd/claude-relay/main.go | ||
| @@ -188,11 +188,14 @@ | ||
| 188 | 188 | _ = relay.Close(closeCtx) |
| 189 | 189 | }() |
| 190 | 190 | } |
| 191 | 191 | |
| 192 | 192 | startedAt := time.Now() |
| 193 | - args := append(cfg.Args, "--session-id", cfg.ClaudeSessionID) | |
| 193 | + args := make([]string, 0, len(cfg.Args)+2) | |
| 194 | + args = append(args, "--session-id", cfg.ClaudeSessionID) | |
| 195 | + args = append(args, cfg.Args...) | |
| 196 | + fmt.Fprintf(os.Stderr, "claude-relay: session-id %s\n", cfg.ClaudeSessionID) | |
| 194 | 197 | cmd := exec.Command(cfg.ClaudeBin, args...) |
| 195 | 198 | cmd.Env = append(os.Environ(), |
| 196 | 199 | "SCUTTLEBOT_CONFIG_FILE="+cfg.ConfigFile, |
| 197 | 200 | "SCUTTLEBOT_URL="+cfg.URL, |
| 198 | 201 | "SCUTTLEBOT_TOKEN="+cfg.Token, |
| @@ -316,24 +319,26 @@ | ||
| 316 | 319 | return "", err |
| 317 | 320 | } |
| 318 | 321 | |
| 319 | 322 | // We passed --session-id to Claude Code, so the file name is deterministic. |
| 320 | 323 | target := filepath.Join(root, cfg.ClaudeSessionID+".jsonl") |
| 324 | + fmt.Fprintf(os.Stderr, "claude-relay: waiting for session file %s\n", target) | |
| 321 | 325 | |
| 322 | 326 | ctx, cancel := context.WithTimeout(ctx, defaultDiscoverWait) |
| 323 | 327 | defer cancel() |
| 324 | 328 | |
| 325 | 329 | ticker := time.NewTicker(defaultScanInterval) |
| 326 | 330 | defer ticker.Stop() |
| 327 | 331 | |
| 328 | 332 | for { |
| 329 | 333 | if _, err := os.Stat(target); err == nil { |
| 334 | + fmt.Fprintf(os.Stderr, "claude-relay: found session file %s\n", target) | |
| 330 | 335 | return target, nil |
| 331 | 336 | } |
| 332 | 337 | select { |
| 333 | 338 | case <-ctx.Done(): |
| 334 | - return "", fmt.Errorf("session file %s not found", target) | |
| 339 | + return "", fmt.Errorf("session file %s not found after %v", target, defaultDiscoverWait) | |
| 335 | 340 | case <-ticker.C: |
| 336 | 341 | } |
| 337 | 342 | } |
| 338 | 343 | } |
| 339 | 344 | |
| 340 | 345 |
| --- cmd/claude-relay/main.go | |
| +++ cmd/claude-relay/main.go | |
| @@ -188,11 +188,14 @@ | |
| 188 | _ = relay.Close(closeCtx) |
| 189 | }() |
| 190 | } |
| 191 | |
| 192 | startedAt := time.Now() |
| 193 | args := append(cfg.Args, "--session-id", cfg.ClaudeSessionID) |
| 194 | cmd := exec.Command(cfg.ClaudeBin, args...) |
| 195 | cmd.Env = append(os.Environ(), |
| 196 | "SCUTTLEBOT_CONFIG_FILE="+cfg.ConfigFile, |
| 197 | "SCUTTLEBOT_URL="+cfg.URL, |
| 198 | "SCUTTLEBOT_TOKEN="+cfg.Token, |
| @@ -316,24 +319,26 @@ | |
| 316 | return "", err |
| 317 | } |
| 318 | |
| 319 | // We passed --session-id to Claude Code, so the file name is deterministic. |
| 320 | target := filepath.Join(root, cfg.ClaudeSessionID+".jsonl") |
| 321 | |
| 322 | ctx, cancel := context.WithTimeout(ctx, defaultDiscoverWait) |
| 323 | defer cancel() |
| 324 | |
| 325 | ticker := time.NewTicker(defaultScanInterval) |
| 326 | defer ticker.Stop() |
| 327 | |
| 328 | for { |
| 329 | if _, err := os.Stat(target); err == nil { |
| 330 | return target, nil |
| 331 | } |
| 332 | select { |
| 333 | case <-ctx.Done(): |
| 334 | return "", fmt.Errorf("session file %s not found", target) |
| 335 | case <-ticker.C: |
| 336 | } |
| 337 | } |
| 338 | } |
| 339 | |
| 340 |
| --- cmd/claude-relay/main.go | |
| +++ cmd/claude-relay/main.go | |
| @@ -188,11 +188,14 @@ | |
| 188 | _ = relay.Close(closeCtx) |
| 189 | }() |
| 190 | } |
| 191 | |
| 192 | startedAt := time.Now() |
| 193 | args := make([]string, 0, len(cfg.Args)+2) |
| 194 | args = append(args, "--session-id", cfg.ClaudeSessionID) |
| 195 | args = append(args, cfg.Args...) |
| 196 | fmt.Fprintf(os.Stderr, "claude-relay: session-id %s\n", cfg.ClaudeSessionID) |
| 197 | cmd := exec.Command(cfg.ClaudeBin, args...) |
| 198 | cmd.Env = append(os.Environ(), |
| 199 | "SCUTTLEBOT_CONFIG_FILE="+cfg.ConfigFile, |
| 200 | "SCUTTLEBOT_URL="+cfg.URL, |
| 201 | "SCUTTLEBOT_TOKEN="+cfg.Token, |
| @@ -316,24 +319,26 @@ | |
| 319 | return "", err |
| 320 | } |
| 321 | |
| 322 | // We passed --session-id to Claude Code, so the file name is deterministic. |
| 323 | target := filepath.Join(root, cfg.ClaudeSessionID+".jsonl") |
| 324 | fmt.Fprintf(os.Stderr, "claude-relay: waiting for session file %s\n", target) |
| 325 | |
| 326 | ctx, cancel := context.WithTimeout(ctx, defaultDiscoverWait) |
| 327 | defer cancel() |
| 328 | |
| 329 | ticker := time.NewTicker(defaultScanInterval) |
| 330 | defer ticker.Stop() |
| 331 | |
| 332 | for { |
| 333 | if _, err := os.Stat(target); err == nil { |
| 334 | fmt.Fprintf(os.Stderr, "claude-relay: found session file %s\n", target) |
| 335 | return target, nil |
| 336 | } |
| 337 | select { |
| 338 | case <-ctx.Done(): |
| 339 | return "", fmt.Errorf("session file %s not found after %v", target, defaultDiscoverWait) |
| 340 | case <-ticker.C: |
| 341 | } |
| 342 | } |
| 343 | } |
| 344 | |
| 345 |