Skip to content

Commit 370398a

Browse files
committed
feat(scripts): add daemon-smoke-test covering full task lifecycle
Replaces smoke-test.sh with daemon-smoke-test.sh that covers all four daemon scheduling scenarios: dispatch, reject/resume, complete, cancel.
1 parent c11ad10 commit 370398a

2 files changed

Lines changed: 191 additions & 71 deletions

File tree

scripts/daemon-smoke-test.sh

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Daemon smoke test: covers the full task scheduling lifecycle.
5+
#
6+
# Scenarios tested:
7+
# 1. Dispatch — create task → daemon claims → agent runs → in_review
8+
# 2. Reject/Resume — reject in_review task → daemon resumes agent → back to in_review
9+
# 3. Complete — complete task → daemon cleans up session + worktree
10+
# 4. Cancel — create task → cancel while agent is running → daemon kills agent
11+
#
12+
# Usage: ./scripts/daemon-smoke-test.sh <board_id> <agent_id> <repo_id>
13+
# All three arguments are required.
14+
15+
BOARD_ID="${1:?Usage: $0 <board_id> <agent_id> <repo_id>}"
16+
AGENT_ID="${2:?Usage: $0 <board_id> <agent_id> <repo_id>}"
17+
REPO_ID="${3:?Usage: $0 <board_id> <agent_id> <repo_id>}"
18+
19+
PASS=0
20+
FAIL=0
21+
TASKS=()
22+
TIMESTAMP=$(date +%s)
23+
24+
# ── Helpers ──────────────────────────────────────────────────────────────────
25+
26+
create_task() {
27+
local title="$1"
28+
local desc="$2"
29+
local id
30+
id=$(ak create task \
31+
--board "$BOARD_ID" \
32+
--title "$title" \
33+
--description "$desc" \
34+
--repo "$REPO_ID" \
35+
--assign-to "$AGENT_ID" \
36+
--priority low 2>&1 | sed -n 's/Created task \([^: ]*\).*/\1/p')
37+
if [ -z "$id" ]; then
38+
echo " FATAL: failed to create task"
39+
exit 1
40+
fi
41+
TASKS+=("$id")
42+
echo "$id"
43+
}
44+
45+
wait_status() {
46+
local task_id="$1" status="$2" timeout="${3:-10m}"
47+
ak wait task "$task_id" --until "$status" --timeout "$timeout" >/dev/null 2>&1
48+
}
49+
50+
task_status() {
51+
ak describe task "$1" 2>/dev/null | sed -n 's/^Status: *//p'
52+
}
53+
54+
task_session_exists() {
55+
local task_id="$1"
56+
ls ~/.local/state/agent-kanban/sessions/*.json 2>/dev/null \
57+
| xargs grep -l "\"taskId\": *\"$task_id\"" 2>/dev/null | head -1
58+
}
59+
60+
pass() { echo " PASS: $1"; PASS=$((PASS + 1)); }
61+
fail() { echo " FAIL: $1"; FAIL=$((FAIL + 1)); }
62+
63+
# ── Preflight ────────────────────────────────────────────────────────────────
64+
65+
echo "=== Daemon Smoke Test ==="
66+
echo " Board: $BOARD_ID"
67+
echo " Agent: $AGENT_ID"
68+
echo " Repo: $REPO_ID"
69+
echo ""
70+
71+
DAEMON_STATUS=$(ak status 2>&1 | head -1)
72+
if ! echo "$DAEMON_STATUS" | grep -q "running"; then
73+
echo "FATAL: daemon is not running. Start with: ak start"
74+
exit 1
75+
fi
76+
echo "Daemon: $DAEMON_STATUS"
77+
echo ""
78+
79+
# ── Test 1: Dispatch (create → claim → in_review) ───────────────────────────
80+
81+
echo "[Test 1/4] Dispatch — create task, wait for in_review"
82+
T1=$(create_task "smoke-dispatch-$TIMESTAMP" "Run pnpm install. Add file smoke-dispatch-$TIMESTAMP.txt with timestamp. Commit and PR.")
83+
echo " Task: $T1"
84+
85+
if wait_status "$T1" in_review; then
86+
pass "task reached in_review"
87+
# Verify PR was created
88+
PR=$(ak describe task "$T1" 2>/dev/null | sed -n 's/^PR: *//p')
89+
if [ -n "$PR" ]; then
90+
pass "PR created: $PR"
91+
else
92+
fail "no PR link on in_review task"
93+
fi
94+
else
95+
fail "task did not reach in_review"
96+
fi
97+
echo ""
98+
99+
# ── Test 2: Reject/Resume (reject → daemon resumes → back to in_review) ─────
100+
101+
echo "[Test 2/4] Reject/Resume — reject task, wait for re-review"
102+
ak task reject "$T1" --reason "Smoke test: change file content to REJECTED" >/dev/null 2>&1
103+
104+
STATUS_AFTER_REJECT=$(task_status "$T1")
105+
if [ "$STATUS_AFTER_REJECT" = "in_progress" ]; then
106+
pass "task back to in_progress after reject"
107+
else
108+
fail "expected in_progress after reject, got: $STATUS_AFTER_REJECT"
109+
fi
110+
111+
if wait_status "$T1" in_review; then
112+
pass "task reached in_review again after reject-resume"
113+
else
114+
fail "task did not reach in_review after reject"
115+
fi
116+
echo ""
117+
118+
# ── Test 3: Complete (complete task → session cleaned up) ────────────────────
119+
120+
echo "[Test 3/4] Complete — mark task done, verify cleanup"
121+
ak task complete "$T1" >/dev/null 2>&1
122+
123+
# Give daemon a poll cycle to clean up
124+
sleep 15
125+
126+
STATUS_AFTER_COMPLETE=$(task_status "$T1")
127+
if [ "$STATUS_AFTER_COMPLETE" = "done" ]; then
128+
pass "task is done"
129+
else
130+
fail "expected done, got: $STATUS_AFTER_COMPLETE"
131+
fi
132+
133+
if [ -z "$(task_session_exists "$T1")" ]; then
134+
pass "session cleaned up after completion"
135+
else
136+
fail "session still exists after completion"
137+
fi
138+
echo ""
139+
140+
# ── Test 4: Cancel (create → cancel while running → agent killed) ────────────
141+
142+
echo "[Test 4/4] Cancel — create task, cancel while running, verify cleanup"
143+
T4=$(create_task "smoke-cancel-$TIMESTAMP" "Run pnpm install. Then run: sleep 300. This task will be cancelled.")
144+
echo " Task: $T4"
145+
146+
# Wait for agent to start (in_progress)
147+
if wait_status "$T4" in_progress 2m; then
148+
pass "task reached in_progress"
149+
else
150+
fail "task did not reach in_progress"
151+
fi
152+
153+
# Cancel while agent is running
154+
sleep 3
155+
ak task cancel "$T4" >/dev/null 2>&1
156+
157+
# Give daemon a poll cycle to detect and kill
158+
sleep 12
159+
160+
STATUS_AFTER_CANCEL=$(task_status "$T4")
161+
if [ "$STATUS_AFTER_CANCEL" = "cancelled" ]; then
162+
pass "task is cancelled"
163+
else
164+
fail "expected cancelled, got: $STATUS_AFTER_CANCEL"
165+
fi
166+
167+
# Check the cancelled task's session file is gone (not global count — other tests may have sessions)
168+
T4_SESSION=$(ls ~/.local/state/agent-kanban/sessions/*.json 2>/dev/null \
169+
| xargs grep -l "\"taskId\": *\"$T4\"" 2>/dev/null || true)
170+
if [ -z "$T4_SESSION" ]; then
171+
pass "cancelled task session cleaned up"
172+
else
173+
fail "cancelled task session still exists: $T4_SESSION"
174+
fi
175+
echo ""
176+
177+
# ── Summary ──────────────────────────────────────────────────────────────────
178+
179+
echo "==============================="
180+
echo " Passed: $PASS"
181+
echo " Failed: $FAIL"
182+
echo "==============================="
183+
184+
# Cleanup test tasks
185+
for tid in "${TASKS[@]}"; do
186+
ak task cancel "$tid" >/dev/null 2>&1 || true
187+
done
188+
189+
if [ "$FAIL" -gt 0 ]; then
190+
exit 1
191+
fi

scripts/smoke-test.sh

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)