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.

lmata 2026-04-04 18:39 trunk
Commit 915ee1617518de4605e354d39689b46a2abbde42ac32f6918509750fbecfccfa
1 file changed +7 -2
--- cmd/claude-relay/main.go
+++ cmd/claude-relay/main.go
@@ -188,11 +188,14 @@
188188
_ = relay.Close(closeCtx)
189189
}()
190190
}
191191
192192
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)
194197
cmd := exec.Command(cfg.ClaudeBin, args...)
195198
cmd.Env = append(os.Environ(),
196199
"SCUTTLEBOT_CONFIG_FILE="+cfg.ConfigFile,
197200
"SCUTTLEBOT_URL="+cfg.URL,
198201
"SCUTTLEBOT_TOKEN="+cfg.Token,
@@ -316,24 +319,26 @@
316319
return "", err
317320
}
318321
319322
// We passed --session-id to Claude Code, so the file name is deterministic.
320323
target := filepath.Join(root, cfg.ClaudeSessionID+".jsonl")
324
+ fmt.Fprintf(os.Stderr, "claude-relay: waiting for session file %s\n", target)
321325
322326
ctx, cancel := context.WithTimeout(ctx, defaultDiscoverWait)
323327
defer cancel()
324328
325329
ticker := time.NewTicker(defaultScanInterval)
326330
defer ticker.Stop()
327331
328332
for {
329333
if _, err := os.Stat(target); err == nil {
334
+ fmt.Fprintf(os.Stderr, "claude-relay: found session file %s\n", target)
330335
return target, nil
331336
}
332337
select {
333338
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)
335340
case <-ticker.C:
336341
}
337342
}
338343
}
339344
340345
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button