claude-flow-novice 2.14.2 → 2.14.4
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/.claude/commands/CFN_LOOP_TASK_MODE.md +4 -47
- package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
- package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +4 -47
- package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
- package/dist/cli/agent-prompt-builder.js +25 -0
- package/dist/cli/agent-prompt-builder.js.map +1 -1
- package/dist/cli/config-manager.js +91 -109
- package/package.json +1 -1
- package/scripts/init-project.js +1 -1
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
- package/.claude/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
- package/.claude/skills/cfn-redis-coordination/LOGGING.md +0 -260
- package/.claude/skills/cfn-redis-coordination/README.md +0 -65
- package/.claude/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
- package/.claude/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
- package/.claude/skills/cfn-redis-coordination/SKILL.md +0 -720
- package/.claude/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
- package/.claude/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
- package/.claude/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
- package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
- package/.claude/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
- package/.claude/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
- package/.claude/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
- package/.claude/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
- package/.claude/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
- package/.claude/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
- package/.claude/skills/cfn-redis-coordination/examples/README.md +0 -73
- package/.claude/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
- package/.claude/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
- package/.claude/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
- package/.claude/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
- package/.claude/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
- package/.claude/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
- package/.claude/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
- package/.claude/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
- package/.claude/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
- package/.claude/skills/cfn-redis-coordination/heartbeat.sh +0 -126
- package/.claude/skills/cfn-redis-coordination/init-swarm.sh +0 -148
- package/.claude/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
- package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
- package/.claude/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
- package/.claude/skills/cfn-redis-coordination/log-event.sh +0 -109
- package/.claude/skills/cfn-redis-coordination/metrics-export.sh +0 -674
- package/.claude/skills/cfn-redis-coordination/metrics-schema.json +0 -66
- package/.claude/skills/cfn-redis-coordination/metrics-storage.md +0 -31
- package/.claude/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
- package/.claude/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
- package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/.claude/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
- package/.claude/skills/cfn-redis-coordination/priority_wake.py +0 -134
- package/.claude/skills/cfn-redis-coordination/query-dlq.sh +0 -162
- package/.claude/skills/cfn-redis-coordination/query-logs.sh +0 -103
- package/.claude/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
- package/.claude/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
- package/.claude/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
- package/.claude/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
- package/.claude/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
- package/.claude/skills/cfn-redis-coordination/signal.sh +0 -38
- package/.claude/skills/cfn-redis-coordination/store-context.sh +0 -86
- package/.claude/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
- package/.claude/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
- package/.claude/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
- package/.claude/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
- package/.claude/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
- package/.claude/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
- package/.claude/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
- package/.claude/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
- package/.claude/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
- package/.claude/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
- package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
- package/.claude/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
- package/.claude/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
- package/.claude/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
- package/.claude/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
- package/.claude/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
- package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
- package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
- package/claude-assets/skills/cfn-redis-coordination/LOGGING.md +0 -260
- package/claude-assets/skills/cfn-redis-coordination/README.md +0 -65
- package/claude-assets/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
- package/claude-assets/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
- package/claude-assets/skills/cfn-redis-coordination/SKILL.md +0 -720
- package/claude-assets/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
- package/claude-assets/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
- package/claude-assets/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
- package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
- package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
- package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
- package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
- package/claude-assets/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
- package/claude-assets/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
- package/claude-assets/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
- package/claude-assets/skills/cfn-redis-coordination/examples/README.md +0 -73
- package/claude-assets/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
- package/claude-assets/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
- package/claude-assets/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
- package/claude-assets/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
- package/claude-assets/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
- package/claude-assets/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
- package/claude-assets/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
- package/claude-assets/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
- package/claude-assets/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
- package/claude-assets/skills/cfn-redis-coordination/heartbeat.sh +0 -126
- package/claude-assets/skills/cfn-redis-coordination/init-swarm.sh +0 -148
- package/claude-assets/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
- package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
- package/claude-assets/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
- package/claude-assets/skills/cfn-redis-coordination/log-event.sh +0 -109
- package/claude-assets/skills/cfn-redis-coordination/metrics-export.sh +0 -674
- package/claude-assets/skills/cfn-redis-coordination/metrics-schema.json +0 -66
- package/claude-assets/skills/cfn-redis-coordination/metrics-storage.md +0 -31
- package/claude-assets/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
- package/claude-assets/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
- package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
- package/claude-assets/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
- package/claude-assets/skills/cfn-redis-coordination/priority_wake.py +0 -134
- package/claude-assets/skills/cfn-redis-coordination/query-dlq.sh +0 -162
- package/claude-assets/skills/cfn-redis-coordination/query-logs.sh +0 -103
- package/claude-assets/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
- package/claude-assets/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
- package/claude-assets/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
- package/claude-assets/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
- package/claude-assets/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
- package/claude-assets/skills/cfn-redis-coordination/signal.sh +0 -38
- package/claude-assets/skills/cfn-redis-coordination/store-context.sh +0 -86
- package/claude-assets/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
- package/claude-assets/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
- package/claude-assets/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
- package/claude-assets/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
- package/claude-assets/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
- package/claude-assets/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
- package/claude-assets/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
- package/claude-assets/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
- package/claude-assets/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
- package/claude-assets/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
- package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
- package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
- package/claude-assets/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
- package/claude-assets/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
- package/claude-assets/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
- package/claude-assets/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
- package/claude-assets/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
|
@@ -1,513 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# CFN Loop Timeout Enforcement Testing Skill
|
|
4
|
-
# Validates timeout mechanisms at agent, orchestrator, and system levels
|
|
5
|
-
|
|
6
|
-
set -euo pipefail
|
|
7
|
-
|
|
8
|
-
# Skill configuration
|
|
9
|
-
SKILL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
-
PROJECT_ROOT="$(dirname "$(dirname "$SKILL_DIR")")"
|
|
11
|
-
TASK_ID="${TASK_ID:-test-timeout-enforcement-$(date +%s)}"
|
|
12
|
-
AGENT_ID="${AGENT_ID:-timeout-tester}"
|
|
13
|
-
|
|
14
|
-
# Configuration defaults
|
|
15
|
-
DEFAULT_TIMEOUT=30
|
|
16
|
-
TEST_TIMEOUT=5
|
|
17
|
-
CLEANUP_DELAY=2
|
|
18
|
-
|
|
19
|
-
# Colors and logging
|
|
20
|
-
RED='\033[0;31m'
|
|
21
|
-
GREEN='\033[0;32m'
|
|
22
|
-
YELLOW='\033[1;33m'
|
|
23
|
-
BLUE='\033[0;34m'
|
|
24
|
-
NC='\033[0m'
|
|
25
|
-
|
|
26
|
-
log() {
|
|
27
|
-
echo "$(date '+%Y-%m-%d %H:%M:%S') [$$] $*"
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
log_info() {
|
|
31
|
-
echo -e "${BLUE}[INFO]${NC} $*"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
log_success() {
|
|
35
|
-
echo -e "${GREEN}[PASS]${NC} $*"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
log_error() {
|
|
39
|
-
echo -e "${RED}[FAIL]${NC} $*"
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
log_warning() {
|
|
43
|
-
echo -e "${YELLOW}[WARN]${NC} $*"
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
# Redis connection check
|
|
47
|
-
check_redis() {
|
|
48
|
-
if ! redis-cli ping >/dev/null 2>&1; then
|
|
49
|
-
log_warning "Redis not available - some tests will be skipped"
|
|
50
|
-
return 1
|
|
51
|
-
fi
|
|
52
|
-
return 0
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
# Cleanup Redis test data
|
|
56
|
-
cleanup_redis_data() {
|
|
57
|
-
if check_redis; then
|
|
58
|
-
redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli del >/dev/null 2>&1 || true
|
|
59
|
-
redis-cli --scan --pattern "timeout-test:*" | xargs -r redis-cli del >/dev/null 2>&1 || true
|
|
60
|
-
fi
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
# Test 1: Agent process timeout enforcement
|
|
64
|
-
test_agent_process_timeout() {
|
|
65
|
-
log_info "Testing agent process timeout enforcement..."
|
|
66
|
-
|
|
67
|
-
local test_agent_id="timeout-agent-$(date +%s)"
|
|
68
|
-
local timeout_duration=$TEST_TIMEOUT
|
|
69
|
-
local test_file="/tmp/agent-timeout-test-${test_agent_id}.tmp"
|
|
70
|
-
|
|
71
|
-
# Create a test agent that runs longer than timeout
|
|
72
|
-
(
|
|
73
|
-
echo "Agent $test_agent_id started" > "$test_file"
|
|
74
|
-
for i in {1..10}; do
|
|
75
|
-
echo "Agent $test_agent_id working... step $i" >> "$test_file"
|
|
76
|
-
sleep 1
|
|
77
|
-
done
|
|
78
|
-
echo "Agent $test_agent_id completed" >> "$test_file"
|
|
79
|
-
) &
|
|
80
|
-
|
|
81
|
-
local agent_pid=$!
|
|
82
|
-
local timeout_occurred=false
|
|
83
|
-
|
|
84
|
-
# Monitor agent with timeout
|
|
85
|
-
local elapsed=0
|
|
86
|
-
while kill -0 "$agent_pid" 2>/dev/null && [[ $elapsed -lt $timeout_duration ]]; do
|
|
87
|
-
sleep 1
|
|
88
|
-
((elapsed++))
|
|
89
|
-
done
|
|
90
|
-
|
|
91
|
-
# Check if agent should be terminated
|
|
92
|
-
if kill -0 "$agent_pid" 2>/dev/null; then
|
|
93
|
-
timeout_occurred=true
|
|
94
|
-
log_info "Agent timeout reached, terminating process..."
|
|
95
|
-
|
|
96
|
-
# Graceful termination
|
|
97
|
-
kill -TERM "$agent_pid" 2>/dev/null || true
|
|
98
|
-
sleep 1
|
|
99
|
-
|
|
100
|
-
# Force termination if still running
|
|
101
|
-
if kill -0 "$agent_pid" 2>/dev/null; then
|
|
102
|
-
kill -KILL "$agent_pid" 2>/dev/null || true
|
|
103
|
-
log_info "Force terminated agent process"
|
|
104
|
-
fi
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
# Verify results
|
|
108
|
-
if $timeout_occurred; then
|
|
109
|
-
# Check that agent was interrupted
|
|
110
|
-
local final_line
|
|
111
|
-
final_line=$(tail -1 "$test_file" 2>/dev/null || echo "")
|
|
112
|
-
|
|
113
|
-
if [[ "$final_line" != *"completed"* ]]; then
|
|
114
|
-
log_success "Agent timeout enforcement working correctly"
|
|
115
|
-
rm -f "$test_file"
|
|
116
|
-
return 0
|
|
117
|
-
else
|
|
118
|
-
log_error "Agent completed despite timeout"
|
|
119
|
-
rm -f "$test_file"
|
|
120
|
-
return 1
|
|
121
|
-
fi
|
|
122
|
-
else
|
|
123
|
-
log_error "Agent completed before timeout (test configuration issue)"
|
|
124
|
-
rm -f "$test_file"
|
|
125
|
-
return 1
|
|
126
|
-
fi
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
# Test 2: Orchestrator timeout coordination
|
|
130
|
-
test_orchestrator_timeout_coordination() {
|
|
131
|
-
log_info "Testing orchestrator timeout coordination..."
|
|
132
|
-
|
|
133
|
-
if ! check_redis; then
|
|
134
|
-
log_warning "Skipping orchestrator timeout test - Redis not available"
|
|
135
|
-
return 0
|
|
136
|
-
fi
|
|
137
|
-
|
|
138
|
-
local test_task_id="orchestrator-timeout-$(date +%s)"
|
|
139
|
-
local test_agent_id="test-agent-${test_task_id}"
|
|
140
|
-
local timeout_duration=$TEST_TIMEOUT
|
|
141
|
-
|
|
142
|
-
# Simulate orchestrator spawning an agent
|
|
143
|
-
(
|
|
144
|
-
# Simulate agent work that times out
|
|
145
|
-
echo "Agent $test_agent_id starting work"
|
|
146
|
-
redis-cli set "swarm:${test_task_id}:${test_agent_id}:status" "working" >/dev/null
|
|
147
|
-
|
|
148
|
-
for i in {1..10}; do
|
|
149
|
-
redis-cli set "swarm:${test_task_id}:${test_agent_id}:progress" "$i/10" >/dev/null
|
|
150
|
-
sleep 1
|
|
151
|
-
done
|
|
152
|
-
|
|
153
|
-
redis-cli set "swarm:${test_task_id}:${test_agent_id}:status" "completed" >/dev/null
|
|
154
|
-
) &
|
|
155
|
-
|
|
156
|
-
local orchestrator_pid=$!
|
|
157
|
-
local timeout_occurred=false
|
|
158
|
-
|
|
159
|
-
# Simulate orchestrator timeout monitoring
|
|
160
|
-
local elapsed=0
|
|
161
|
-
while kill -0 "$orchestrator_pid" 2>/dev/null && [[ $elapsed -lt $timeout_duration ]]; do
|
|
162
|
-
sleep 1
|
|
163
|
-
((elapsed++))
|
|
164
|
-
|
|
165
|
-
# Check agent status
|
|
166
|
-
local agent_status
|
|
167
|
-
agent_status=$(redis-cli get "swarm:${test_task_id}:${test_agent_id}:status" 2>/dev/null || echo "")
|
|
168
|
-
|
|
169
|
-
if [[ -n "$agent_status" ]]; then
|
|
170
|
-
log_info "Agent status: $agent_status"
|
|
171
|
-
fi
|
|
172
|
-
done
|
|
173
|
-
|
|
174
|
-
# Timeout handling
|
|
175
|
-
if kill -0 "$orchestrator_pid" 2>/dev/null; then
|
|
176
|
-
timeout_occurred=true
|
|
177
|
-
log_info "Orchestrator timeout reached, terminating..."
|
|
178
|
-
|
|
179
|
-
kill -TERM "$orchestrator_pid" 2>/dev/null || true
|
|
180
|
-
sleep 1
|
|
181
|
-
kill -KILL "$orchestrator_pid" 2>/dev/null || true
|
|
182
|
-
fi
|
|
183
|
-
|
|
184
|
-
# Cleanup Redis
|
|
185
|
-
redis-cli del "swarm:${test_task_id}:${test_agent_id}:status" >/dev/null 2>&1 || true
|
|
186
|
-
redis-cli del "swarm:${test_task_id}:${test_agent_id}:progress" >/dev/null 2>&1 || true
|
|
187
|
-
|
|
188
|
-
if $timeout_occurred; then
|
|
189
|
-
log_success "Orchestrator timeout coordination working correctly"
|
|
190
|
-
return 0
|
|
191
|
-
else
|
|
192
|
-
log_error "Orchestrator timeout coordination failed"
|
|
193
|
-
return 1
|
|
194
|
-
fi
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
# Test 3: Multiple agent timeout handling
|
|
198
|
-
test_multiple_agent_timeout() {
|
|
199
|
-
log_info "Testing multiple agent timeout handling..."
|
|
200
|
-
|
|
201
|
-
local agent_count=3
|
|
202
|
-
local timeout_duration=$TEST_TIMEOUT
|
|
203
|
-
local agent_pids=()
|
|
204
|
-
|
|
205
|
-
# Spawn multiple agents
|
|
206
|
-
for i in $(seq 1 $agent_count); do
|
|
207
|
-
(
|
|
208
|
-
echo "Agent $i starting work"
|
|
209
|
-
for j in {1..10}; do
|
|
210
|
-
echo "Agent $i: step $j"
|
|
211
|
-
sleep 1
|
|
212
|
-
done
|
|
213
|
-
echo "Agent $i completed"
|
|
214
|
-
) &
|
|
215
|
-
agent_pids+=($!)
|
|
216
|
-
done
|
|
217
|
-
|
|
218
|
-
# Monitor all agents with timeout
|
|
219
|
-
local elapsed=0
|
|
220
|
-
local running_agents=true
|
|
221
|
-
|
|
222
|
-
while $running_agents && [[ $elapsed -lt $timeout_duration ]]; do
|
|
223
|
-
running_agents=false
|
|
224
|
-
for pid in "${agent_pids[@]}"; do
|
|
225
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
226
|
-
running_agents=true
|
|
227
|
-
break
|
|
228
|
-
fi
|
|
229
|
-
done
|
|
230
|
-
sleep 1
|
|
231
|
-
((elapsed++))
|
|
232
|
-
done
|
|
233
|
-
|
|
234
|
-
# Terminate remaining agents
|
|
235
|
-
local terminated_count=0
|
|
236
|
-
for pid in "${agent_pids[@]}"; do
|
|
237
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
238
|
-
kill -TERM "$pid" 2>/dev/null || true
|
|
239
|
-
sleep 1
|
|
240
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
241
|
-
kill -KILL "$pid" 2>/dev/null || true
|
|
242
|
-
fi
|
|
243
|
-
((terminated_count++))
|
|
244
|
-
fi
|
|
245
|
-
done
|
|
246
|
-
|
|
247
|
-
if [[ $terminated_count -gt 0 ]]; then
|
|
248
|
-
log_success "Multiple agent timeout handling: $terminated_count/$agent_count agents timed out"
|
|
249
|
-
return 0
|
|
250
|
-
else
|
|
251
|
-
log_error "No agents required timeout (test configuration issue)"
|
|
252
|
-
return 1
|
|
253
|
-
fi
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
# Test 4: Redis cleanup after timeout
|
|
257
|
-
test_redis_cleanup_after_timeout() {
|
|
258
|
-
log_info "Testing Redis cleanup after timeout..."
|
|
259
|
-
|
|
260
|
-
if ! check_redis; then
|
|
261
|
-
log_warning "Skipping Redis cleanup test - Redis not available"
|
|
262
|
-
return 0
|
|
263
|
-
fi
|
|
264
|
-
|
|
265
|
-
local test_task_id="cleanup-test-$(date +%s)"
|
|
266
|
-
local test_agent_id="cleanup-agent"
|
|
267
|
-
|
|
268
|
-
# Create test Redis data
|
|
269
|
-
redis-cli set "swarm:${test_task_id}:${test_agent_id}:status" "working" >/dev/null
|
|
270
|
-
redis-cli set "swarm:${test_task_id}:${test_agent_id}:confidence" "0.85" >/dev/null
|
|
271
|
-
redis-cli set "swarm:${test_task_id}:gate-passed" "true" >/dev/null
|
|
272
|
-
redis-cli set "swarm:${test_task_id}:iteration" "1" >/dev/null
|
|
273
|
-
|
|
274
|
-
# Verify data was created
|
|
275
|
-
local key_count
|
|
276
|
-
key_count=$(redis-cli --scan --pattern "swarm:${test_task_id}:*" | wc -l)
|
|
277
|
-
|
|
278
|
-
if [[ $key_count -eq 0 ]]; then
|
|
279
|
-
log_error "Failed to create test Redis data"
|
|
280
|
-
return 1
|
|
281
|
-
fi
|
|
282
|
-
|
|
283
|
-
# Simulate timeout scenario
|
|
284
|
-
(
|
|
285
|
-
# Simulate agent that times out
|
|
286
|
-
echo "Agent starting work"
|
|
287
|
-
sleep 10 # Will be killed by timeout
|
|
288
|
-
echo "Agent completed"
|
|
289
|
-
) &
|
|
290
|
-
|
|
291
|
-
local agent_pid=$!
|
|
292
|
-
|
|
293
|
-
# Simulate timeout
|
|
294
|
-
sleep 2
|
|
295
|
-
kill -TERM "$agent_pid" 2>/dev/null || true
|
|
296
|
-
|
|
297
|
-
# Perform cleanup (simulating orchestrator behavior)
|
|
298
|
-
redis-cli --scan --pattern "swarm:${test_task_id}:*" | xargs -r redis-cli del >/dev/null
|
|
299
|
-
|
|
300
|
-
# Verify cleanup
|
|
301
|
-
local remaining_keys
|
|
302
|
-
remaining_keys=$(redis-cli --scan --pattern "swarm:${test_task_id}:*" | wc -l)
|
|
303
|
-
|
|
304
|
-
if [[ $remaining_keys -eq 0 ]]; then
|
|
305
|
-
log_success "Redis cleanup after timeout working correctly"
|
|
306
|
-
return 0
|
|
307
|
-
else
|
|
308
|
-
log_error "Redis cleanup failed: $remaining_keys keys remaining"
|
|
309
|
-
return 1
|
|
310
|
-
fi
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
# Test 5: Timeout escalation (SIGTERM → SIGKILL)
|
|
314
|
-
test_timeout_escalation() {
|
|
315
|
-
log_info "Testing timeout escalation (SIGTERM → SIGKILL)..."
|
|
316
|
-
|
|
317
|
-
local test_pid
|
|
318
|
-
local timeout_grace=2
|
|
319
|
-
local timeout_force=5
|
|
320
|
-
|
|
321
|
-
# Create a process that ignores SIGTERM
|
|
322
|
-
(
|
|
323
|
-
# Ignore SIGTERM
|
|
324
|
-
trap '' TERM
|
|
325
|
-
echo "Ignoring SIGTERM, will only respond to SIGKILL"
|
|
326
|
-
while true; do
|
|
327
|
-
echo "Still running..."
|
|
328
|
-
sleep 1
|
|
329
|
-
done
|
|
330
|
-
) &
|
|
331
|
-
|
|
332
|
-
test_pid=$!
|
|
333
|
-
|
|
334
|
-
# First, try SIGTERM
|
|
335
|
-
kill -TERM "$test_pid" 2>/dev/null || true
|
|
336
|
-
sleep $timeout_grace
|
|
337
|
-
|
|
338
|
-
# Check if still running
|
|
339
|
-
if kill -0 "$test_pid" 2>/dev/null; then
|
|
340
|
-
log_info "SIGTERM ignored, escalating to SIGKILL"
|
|
341
|
-
kill -KILL "$test_pid" 2>/dev/null || true
|
|
342
|
-
sleep 1
|
|
343
|
-
|
|
344
|
-
if ! kill -0 "$test_pid" 2>/dev/null; then
|
|
345
|
-
log_success "Timeout escalation (SIGTERM → SIGKILL) working correctly"
|
|
346
|
-
return 0
|
|
347
|
-
else
|
|
348
|
-
log_error "SIGKILL failed to terminate process"
|
|
349
|
-
return 1
|
|
350
|
-
fi
|
|
351
|
-
else
|
|
352
|
-
log_error "Process responded to SIGTERM (test configuration issue)"
|
|
353
|
-
return 1
|
|
354
|
-
fi
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
# Test 6: Timeout in different execution contexts
|
|
358
|
-
test_timeout_contexts() {
|
|
359
|
-
log_info "Testing timeout in different execution contexts..."
|
|
360
|
-
|
|
361
|
-
local test_results=()
|
|
362
|
-
|
|
363
|
-
# Test 1: Background process timeout
|
|
364
|
-
(
|
|
365
|
-
sleep 10
|
|
366
|
-
) &
|
|
367
|
-
local bg_pid=$!
|
|
368
|
-
|
|
369
|
-
if timeout 2 wait "$bg_pid"; then
|
|
370
|
-
test_results+=("FAIL: Background process should have timed out")
|
|
371
|
-
else
|
|
372
|
-
test_results+=("PASS: Background process timed out correctly")
|
|
373
|
-
fi
|
|
374
|
-
|
|
375
|
-
# Test 2: Subshell timeout
|
|
376
|
-
if timeout 2 bash -c 'sleep 5; echo "completed"'; then
|
|
377
|
-
test_results+=("FAIL: Subshell should have timed out")
|
|
378
|
-
else
|
|
379
|
-
test_results+=("PASS: Subshell timed out correctly")
|
|
380
|
-
fi
|
|
381
|
-
|
|
382
|
-
# Test 3: Command timeout
|
|
383
|
-
if timeout 2 sleep 5; then
|
|
384
|
-
test_results+=("FAIL: Command should have timed out")
|
|
385
|
-
else
|
|
386
|
-
test_results+=("PASS: Command timed out correctly")
|
|
387
|
-
fi
|
|
388
|
-
|
|
389
|
-
# Test 4: Pipeline timeout
|
|
390
|
-
if timeout 2 bash -c 'sleep 5 | cat'; then
|
|
391
|
-
test_results+=("FAIL: Pipeline should have timed out")
|
|
392
|
-
else
|
|
393
|
-
test_results+=("PASS: Pipeline timed out correctly")
|
|
394
|
-
fi
|
|
395
|
-
|
|
396
|
-
# Count results
|
|
397
|
-
local pass_count=0
|
|
398
|
-
local total_count=${#test_results[@]}
|
|
399
|
-
|
|
400
|
-
for result in "${test_results[@]}"; do
|
|
401
|
-
if [[ "$result" == PASS* ]]; then
|
|
402
|
-
((pass_count++))
|
|
403
|
-
log_success "$result"
|
|
404
|
-
else
|
|
405
|
-
log_error "$result"
|
|
406
|
-
fi
|
|
407
|
-
done
|
|
408
|
-
|
|
409
|
-
if [[ $pass_count -eq $total_count ]]; then
|
|
410
|
-
log_success "All timeout contexts working correctly ($pass_count/$total_count)"
|
|
411
|
-
return 0
|
|
412
|
-
else
|
|
413
|
-
log_error "Some timeout contexts failed ($pass_count/$total_count)"
|
|
414
|
-
return 1
|
|
415
|
-
fi
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
# Main test execution
|
|
419
|
-
main() {
|
|
420
|
-
log_info "Starting CFN Loop Timeout Enforcement Testing"
|
|
421
|
-
log_info "Task ID: $TASK_ID"
|
|
422
|
-
log_info "Agent ID: $AGENT_ID"
|
|
423
|
-
|
|
424
|
-
local tests_passed=0
|
|
425
|
-
local tests_total=6
|
|
426
|
-
|
|
427
|
-
# Run all timeout enforcement tests
|
|
428
|
-
if test_agent_process_timeout; then ((tests_passed++)); fi
|
|
429
|
-
if test_orchestrator_timeout_coordination; then ((tests_passed++)); fi
|
|
430
|
-
if test_multiple_agent_timeout; then ((tests_passed++)); fi
|
|
431
|
-
if test_redis_cleanup_after_timeout; then ((tests_passed++)); fi
|
|
432
|
-
if test_timeout_escalation; then ((tests_passed++)); fi
|
|
433
|
-
if test_timeout_contexts; then ((tests_passed++)); fi
|
|
434
|
-
|
|
435
|
-
# Cleanup
|
|
436
|
-
cleanup_redis_data
|
|
437
|
-
|
|
438
|
-
# Print summary
|
|
439
|
-
echo ""
|
|
440
|
-
log_info "Timeout Enforcement Test Summary:"
|
|
441
|
-
log_info "Tests passed: $tests_passed/$tests_total"
|
|
442
|
-
|
|
443
|
-
if [[ $tests_passed -eq $tests_total ]]; then
|
|
444
|
-
log_success "🎉 All timeout enforcement tests passed!"
|
|
445
|
-
return 0
|
|
446
|
-
else
|
|
447
|
-
log_error "❌ Some timeout enforcement tests failed!"
|
|
448
|
-
return 1
|
|
449
|
-
fi
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
# Help function
|
|
453
|
-
show_help() {
|
|
454
|
-
cat << EOF
|
|
455
|
-
CFN Loop Timeout Enforcement Testing Skill
|
|
456
|
-
|
|
457
|
-
Tests timeout mechanisms at multiple levels:
|
|
458
|
-
- Agent process timeout enforcement
|
|
459
|
-
- Orchestrator timeout coordination
|
|
460
|
-
- Multiple agent timeout handling
|
|
461
|
-
- Redis cleanup after timeout
|
|
462
|
-
- Timeout escalation (SIGTERM → SIGKILL)
|
|
463
|
-
- Timeout in different execution contexts
|
|
464
|
-
|
|
465
|
-
Usage: $0 [OPTIONS]
|
|
466
|
-
|
|
467
|
-
Options:
|
|
468
|
-
--task-id ID Custom task ID (default: auto-generated)
|
|
469
|
-
--agent-id ID Custom agent ID (default: timeout-tester)
|
|
470
|
-
--timeout SECONDS Test timeout duration (default: 5)
|
|
471
|
-
--help Show this help message
|
|
472
|
-
|
|
473
|
-
Environment Variables:
|
|
474
|
-
TASK_ID Override task ID
|
|
475
|
-
AGENT_ID Override agent ID
|
|
476
|
-
|
|
477
|
-
Examples:
|
|
478
|
-
$0
|
|
479
|
-
$0 --task-id custom-task-123 --timeout 10
|
|
480
|
-
TASK_ID=custom-task $0 --agent-id custom-agent
|
|
481
|
-
|
|
482
|
-
EOF
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
# Parse arguments
|
|
486
|
-
while [[ $# -gt 0 ]]; do
|
|
487
|
-
case $1 in
|
|
488
|
-
--task-id)
|
|
489
|
-
TASK_ID="$2"
|
|
490
|
-
shift 2
|
|
491
|
-
;;
|
|
492
|
-
--agent-id)
|
|
493
|
-
AGENT_ID="$2"
|
|
494
|
-
shift 2
|
|
495
|
-
;;
|
|
496
|
-
--timeout)
|
|
497
|
-
TEST_TIMEOUT="$2"
|
|
498
|
-
shift 2
|
|
499
|
-
;;
|
|
500
|
-
--help)
|
|
501
|
-
show_help
|
|
502
|
-
exit 0
|
|
503
|
-
;;
|
|
504
|
-
*)
|
|
505
|
-
log_error "Unknown option: $1"
|
|
506
|
-
show_help
|
|
507
|
-
exit 1
|
|
508
|
-
;;
|
|
509
|
-
esac
|
|
510
|
-
done
|
|
511
|
-
|
|
512
|
-
# Run main function
|
|
513
|
-
main "$@"
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Convert files to Unix line endings
|
|
4
|
-
convert_file() {
|
|
5
|
-
local file="$1"
|
|
6
|
-
# Remove carriage returns and write back to the same file
|
|
7
|
-
tr -d '\r' < "$file" > "$file.tmp"
|
|
8
|
-
mv "$file.tmp" "$file"
|
|
9
|
-
chmod +x "$file"
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
# Convert files in the current directory
|
|
13
|
-
for file in run-tests.sh test-primitives.sh test-utils.sh; do
|
|
14
|
-
convert_file "$file"
|
|
15
|
-
done
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# DLQ Functionality Test Suite
|
|
3
|
-
# Validates Dead Letter Queue write, expiration, and query mechanisms
|
|
4
|
-
|
|
5
|
-
set -euo pipefail
|
|
6
|
-
|
|
7
|
-
# Source common test utilities
|
|
8
|
-
source "$(dirname "$0")/test-utils.sh"
|
|
9
|
-
|
|
10
|
-
# Generate test configuration
|
|
11
|
-
generate_test_config() {
|
|
12
|
-
local config_file="/tmp/dlq-test-config.json"
|
|
13
|
-
cat > "$config_file" << EOF
|
|
14
|
-
{
|
|
15
|
-
"dlq_max_retries": 3,
|
|
16
|
-
"dlq_ttl_days": 7,
|
|
17
|
-
"dlq_write_mode": "strict",
|
|
18
|
-
"redis_connection": {
|
|
19
|
-
"host": "localhost",
|
|
20
|
-
"port": 6379
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
EOF
|
|
24
|
-
echo "$config_file"
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
# Test DLQ write after max retries
|
|
28
|
-
test_dlq_write() {
|
|
29
|
-
local config_file=$(generate_test_config)
|
|
30
|
-
local task_id="test-task-$(date +%s)"
|
|
31
|
-
local agent_id="tester-dlq"
|
|
32
|
-
local error_details='{"code": 500, "message": "Test Error"}'
|
|
33
|
-
|
|
34
|
-
# Simulate max retry failure
|
|
35
|
-
local result=$(./.claude/skills/cfn-redis-coordination/write-to-dlq.sh \
|
|
36
|
-
--task-id "$task_id" \
|
|
37
|
-
--agent-id "$agent_id" \
|
|
38
|
-
--error "$error_details" \
|
|
39
|
-
--config "$config_file")
|
|
40
|
-
|
|
41
|
-
assert_not_empty "$result" "DLQ write failed"
|
|
42
|
-
|
|
43
|
-
# Validate DLQ entry structure
|
|
44
|
-
local dlq_entry=$(redis-cli get "dlq:$task_id:$agent_id")
|
|
45
|
-
assert_json_valid "$dlq_entry" "Invalid DLQ JSON structure"
|
|
46
|
-
|
|
47
|
-
# Check specific fields
|
|
48
|
-
local extracted_agent_id=$(echo "$dlq_entry" | jq -r '.agent_id')
|
|
49
|
-
assert_equal "$extracted_agent_id" "$agent_id" "Agent ID not preserved in DLQ"
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
# Test TTL expiration
|
|
53
|
-
test_dlq_ttl() {
|
|
54
|
-
local config_file=$(generate_test_config)
|
|
55
|
-
local task_id="ttl-test-$(date +%s)"
|
|
56
|
-
local agent_id="tester-ttl"
|
|
57
|
-
local error_details='{"code": 404, "message": "Resource Not Found"}'
|
|
58
|
-
|
|
59
|
-
# Write to DLQ
|
|
60
|
-
./.claude/skills/cfn-redis-coordination/write-to-dlq.sh \
|
|
61
|
-
--task-id "$task_id" \
|
|
62
|
-
--agent-id "$agent_id" \
|
|
63
|
-
--error "$error_details" \
|
|
64
|
-
--config "$config_file"
|
|
65
|
-
|
|
66
|
-
# Check TTL (should be close to 7 days)
|
|
67
|
-
local ttl=$(redis-cli ttl "dlq:$task_id:$agent_id")
|
|
68
|
-
assert "[ $ttl -ge 604600 ] && [ $ttl -le 604800 ]" "TTL not set correctly"
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
# Test query-dlq script
|
|
72
|
-
test_dlq_query() {
|
|
73
|
-
# Populate test DLQ entries
|
|
74
|
-
local task_ids=("query-test-1" "query-test-2")
|
|
75
|
-
for task_id in "${task_ids[@]}"; do
|
|
76
|
-
./.claude/skills/cfn-redis-coordination/write-to-dlq.sh \
|
|
77
|
-
--task-id "$task_id" \
|
|
78
|
-
--agent-id "tester-query" \
|
|
79
|
-
--error '{"code": 503, "message": "Test Query Error"}'
|
|
80
|
-
done
|
|
81
|
-
|
|
82
|
-
# Query DLQ
|
|
83
|
-
local query_result=$(./.claude/skills/cfn-redis-coordination/query-dlq.sh \
|
|
84
|
-
--agent-id "tester-query")
|
|
85
|
-
|
|
86
|
-
assert_not_empty "$query_result" "DLQ query returned no results"
|
|
87
|
-
|
|
88
|
-
# Validate query results contain expected task IDs
|
|
89
|
-
for task_id in "${task_ids[@]}"; do
|
|
90
|
-
assert "echo '$query_result' | grep -q '$task_id'" "Task ID $task_id not found in query results"
|
|
91
|
-
done
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
# Run tests
|
|
95
|
-
main() {
|
|
96
|
-
test_dlq_write
|
|
97
|
-
test_dlq_ttl
|
|
98
|
-
test_dlq_query
|
|
99
|
-
echo "DLQ Functionality Tests: PASSED"
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
main
|