gsd-init 1.0.5 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/gsd-init.js CHANGED
@@ -22,6 +22,7 @@ const TEMPLATE_FILES = [
22
22
  { src: 'scripts/wake-observer.sh', dst: 'scripts/wake-observer.sh' },
23
23
  { src: 'scripts/notify-worker.sh', dst: 'scripts/notify-worker.sh' },
24
24
  { src: 'scripts/teardown.sh', dst: 'scripts/teardown.sh' },
25
+ { src: 'scripts/listen.sh', dst: 'scripts/listen.sh' },
25
26
  { src: 'scripts/start.sh', dst: 'scripts/start.sh' },
26
27
  { src: 'scripts/verify.sh', dst: 'scripts/verify.sh' },
27
28
  { src: 'schema/event.json', dst: 'schema/event.json' },
@@ -35,6 +36,7 @@ const SH_FILES = [
35
36
  'scripts/wake-observer.sh',
36
37
  'scripts/notify-worker.sh',
37
38
  'scripts/teardown.sh',
39
+ 'scripts/listen.sh',
38
40
  'scripts/start.sh',
39
41
  'scripts/verify.sh',
40
42
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gsd-init",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "description": "Set up GSD observer/worker tmux system in a project",
5
5
  "bin": {
6
6
  "gsd-init": "bin/gsd-init.js"
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env bash
2
+ # GSD Listener — runs in observer session, polls for new events and wakes Observer Claude.
3
+ OBSERVER_SESSION="${GSD_OBSERVER_SESSION:-gsd-observer}"
4
+ OBSERVER_PANE="${GSD_OBSERVER_PANE:-0.0}"
5
+ SCRIPTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+ POLL_INTERVAL=2
7
+
8
+ log() { echo "[gsd-listener] $*"; }
9
+
10
+ log "Listening for GSD events... (session: ${OBSERVER_SESSION}, pane: ${OBSERVER_PANE})"
11
+
12
+ declare -A seen
13
+
14
+ while true; do
15
+ for event_file in /tmp/gsd-event-*.json; do
16
+ [ -f "$event_file" ] || continue
17
+ event_id="${event_file#/tmp/gsd-event-}"
18
+ event_id="${event_id%.json}"
19
+
20
+ # Skip already seen or already responded
21
+ [ -n "${seen[$event_id]+_}" ] && continue
22
+ if [ -f "/tmp/gsd-response-${event_id}.json" ]; then
23
+ seen[$event_id]=1
24
+ continue
25
+ fi
26
+
27
+ log "New event: $event_id — waking Observer Claude"
28
+ seen[$event_id]=1
29
+ "$SCRIPTS_DIR/wake-observer.sh" "$event_id" "$OBSERVER_SESSION" "$OBSERVER_PANE" || \
30
+ log "WARNING: wake-observer.sh failed for $event_id"
31
+ done
32
+
33
+ sleep "$POLL_INTERVAL"
34
+ done
@@ -1,9 +1,21 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
  SESSION="${GSD_OBSERVER_SESSION:-gsd-observer}"
4
+ SCRIPTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
+
4
6
  tmux kill-session -t "$SESSION" 2>/dev/null || true
5
7
  tmux new-session -d -s "$SESSION"
8
+
9
+ # Pane 0.0 — Observer Claude
6
10
  tmux send-keys -t "${SESSION}:0.0" "claude --allowedTools 'Bash,Read,Write,Glob,Grep'" Enter
11
+
12
+ # Pane 0.1 — Listener daemon (split horizontally, small strip at bottom)
13
+ tmux split-window -t "${SESSION}:0" -v -l 6
14
+ tmux send-keys -t "${SESSION}:0.1" "GSD_OBSERVER_SESSION=${SESSION} ${SCRIPTS_DIR}/listen.sh" Enter
15
+
16
+ # Focus Claude pane
17
+ tmux select-pane -t "${SESSION}:0.0"
18
+
7
19
  echo "[gsd-observer] Waiting for Observer Claude to start..."
8
20
  for i in $(seq 1 30); do
9
21
  pane=$(tmux capture-pane -pt "${SESSION}:0.0" 2>/dev/null || echo "")
@@ -22,7 +22,7 @@ fi
22
22
  echo "[wake-observer] Waiting for Observer pane to be ready..." >&2
23
23
  ready=0
24
24
  for i in $(seq 1 15); do
25
- pane_content=$(tmux capture-pane -pt "$full_target" -l 5 2>/dev/null || echo "")
25
+ pane_content=$(tmux capture-pane -pt "$full_target" 2>/dev/null || echo "")
26
26
  if echo "$pane_content" | grep -qE '❯|>|\$|✓|claude'; then
27
27
  ready=1
28
28
  break