feat: add show-and-wait.sh helper, fix race condition

- New show-and-wait.sh combines write + wait into one command
- Uses polling instead of tail -f (which hangs on macOS)
- Docs updated: start watcher BEFORE writing screen to avoid race
- Reduces terminal noise by consolidating operations
This commit is contained in:
Jesse Vincent
2026-01-17 18:35:37 -08:00
parent 194cca5a47
commit b7774ec82e
3 changed files with 41 additions and 9 deletions

View File

@@ -112,9 +112,9 @@ When the user clicks Send in the browser, the watcher exits and TaskOutput retur
### The Loop
1. Write screen HTML to `screen_file`
2. Start watcher (background bash)
3. Call TaskOutput(task_id, block=true) to wait
1. Start watcher (background bash) - must be FIRST to avoid race condition
2. Write screen HTML to `screen_file`
3. Call TaskOutput(task_id, block=true, timeout=600000) to wait
4. TaskOutput returns with feedback
5. Respond with new screen
6. Repeat until done

View File

@@ -21,18 +21,18 @@ ${CLAUDE_PLUGIN_ROOT}/lib/brainstorm-server/start-server.sh
# "screen_dir":"/tmp/brainstorm-12345-1234567890",
# "screen_file":"/tmp/brainstorm-12345-1234567890/screen.html"}
# 2. Write screen to the session's screen_file
# 2. Start watcher FIRST (before writing screen - avoids race condition)
${CLAUDE_PLUGIN_ROOT}/lib/brainstorm-server/wait-for-event.sh $SCREEN_DIR/.server.log
# 3. Write screen to the session's screen_file
# Use Bash with heredoc to write HTML
# 3. Wait for feedback using TaskOutput with block=true
# Start watcher in background:
${CLAUDE_PLUGIN_ROOT}/lib/brainstorm-server/wait-for-event.sh $SCREEN_DIR/.server.log
# Then call TaskOutput(task_id, block=true, timeout=600000) to wait
# 4. Wait for feedback - call TaskOutput(task_id, block=true, timeout=600000)
# If timeout, call TaskOutput again (watcher still running)
# After 3 timeouts (30 min), say "Let me know when you want to continue"
# Returns: {"choice":"a","feedback":"user notes"}
# 4. Clean up when done (pass screen_dir as argument)
# 5. Clean up when done (pass screen_dir as argument)
${CLAUDE_PLUGIN_ROOT}/lib/brainstorm-server/stop-server.sh $SCREEN_DIR
```