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.
Files changed (161) hide show
  1. package/.claude/commands/CFN_LOOP_TASK_MODE.md +4 -47
  2. package/.claude/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
  3. package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +4 -47
  4. package/claude-assets/skills/cfn-redis-coordination/demos/test-cancel-swarm.sh +0 -276
  5. package/dist/cli/agent-prompt-builder.js +25 -0
  6. package/dist/cli/agent-prompt-builder.js.map +1 -1
  7. package/dist/cli/config-manager.js +91 -109
  8. package/package.json +1 -1
  9. package/scripts/init-project.js +1 -1
  10. package/.claude/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
  11. package/.claude/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
  12. package/.claude/skills/cfn-redis-coordination/LOGGING.md +0 -260
  13. package/.claude/skills/cfn-redis-coordination/README.md +0 -65
  14. package/.claude/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
  15. package/.claude/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
  16. package/.claude/skills/cfn-redis-coordination/SKILL.md +0 -720
  17. package/.claude/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
  18. package/.claude/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
  19. package/.claude/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
  20. package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
  21. package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
  22. package/.claude/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
  23. package/.claude/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
  24. package/.claude/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
  25. package/.claude/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
  26. package/.claude/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
  27. package/.claude/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
  28. package/.claude/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
  29. package/.claude/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
  30. package/.claude/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
  31. package/.claude/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
  32. package/.claude/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
  33. package/.claude/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
  34. package/.claude/skills/cfn-redis-coordination/examples/README.md +0 -73
  35. package/.claude/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
  36. package/.claude/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
  37. package/.claude/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
  38. package/.claude/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
  39. package/.claude/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
  40. package/.claude/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
  41. package/.claude/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
  42. package/.claude/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
  43. package/.claude/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
  44. package/.claude/skills/cfn-redis-coordination/heartbeat.sh +0 -126
  45. package/.claude/skills/cfn-redis-coordination/init-swarm.sh +0 -148
  46. package/.claude/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
  47. package/.claude/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
  48. package/.claude/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
  49. package/.claude/skills/cfn-redis-coordination/log-event.sh +0 -109
  50. package/.claude/skills/cfn-redis-coordination/metrics-export.sh +0 -674
  51. package/.claude/skills/cfn-redis-coordination/metrics-schema.json +0 -66
  52. package/.claude/skills/cfn-redis-coordination/metrics-storage.md +0 -31
  53. package/.claude/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
  54. package/.claude/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
  55. package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
  56. package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
  57. package/.claude/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
  58. package/.claude/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
  59. package/.claude/skills/cfn-redis-coordination/priority_wake.py +0 -134
  60. package/.claude/skills/cfn-redis-coordination/query-dlq.sh +0 -162
  61. package/.claude/skills/cfn-redis-coordination/query-logs.sh +0 -103
  62. package/.claude/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
  63. package/.claude/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
  64. package/.claude/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
  65. package/.claude/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
  66. package/.claude/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
  67. package/.claude/skills/cfn-redis-coordination/signal.sh +0 -38
  68. package/.claude/skills/cfn-redis-coordination/store-context.sh +0 -86
  69. package/.claude/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
  70. package/.claude/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
  71. package/.claude/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
  72. package/.claude/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
  73. package/.claude/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
  74. package/.claude/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
  75. package/.claude/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
  76. package/.claude/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
  77. package/.claude/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
  78. package/.claude/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
  79. package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
  80. package/.claude/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
  81. package/.claude/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
  82. package/.claude/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
  83. package/.claude/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
  84. package/.claude/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
  85. package/.claude/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
  86. package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT.md +0 -57
  87. package/claude-assets/skills/cfn-redis-coordination/HEARTBEAT_MONITORING.md +0 -267
  88. package/claude-assets/skills/cfn-redis-coordination/LOGGING.md +0 -260
  89. package/claude-assets/skills/cfn-redis-coordination/README.md +0 -65
  90. package/claude-assets/skills/cfn-redis-coordination/SECURITY_REVIEW.md +0 -25
  91. package/claude-assets/skills/cfn-redis-coordination/SHUTDOWN_HANDLING.md +0 -164
  92. package/claude-assets/skills/cfn-redis-coordination/SKILL.md +0 -720
  93. package/claude-assets/skills/cfn-redis-coordination/demos/test-dlq.sh +0 -129
  94. package/claude-assets/skills/cfn-redis-coordination/demos/test-iteration-feedback.sh +0 -320
  95. package/claude-assets/skills/cfn-redis-coordination/demos/test-orchestrator.sh +0 -249
  96. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4-unix.sh +0 -148
  97. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake-phase4.sh +0 -163
  98. package/claude-assets/skills/cfn-redis-coordination/demos/test-priority-wake.sh +0 -138
  99. package/claude-assets/skills/cfn-redis-coordination/demos/test-quick-fix.sh +0 -81
  100. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-absolute.sh +0 -45
  101. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-fallback.sh +0 -68
  102. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-percentage.sh +0 -56
  103. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum-with-retry.sh +0 -81
  104. package/claude-assets/skills/cfn-redis-coordination/demos/test-quorum.sh +0 -57
  105. package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown-handling.sh +0 -187
  106. package/claude-assets/skills/cfn-redis-coordination/demos/test-shutdown.sh +0 -160
  107. package/claude-assets/skills/cfn-redis-coordination/demos/test-utils-unix.sh +0 -97
  108. package/claude-assets/skills/cfn-redis-coordination/demos/test-utils.sh +0 -97
  109. package/claude-assets/skills/cfn-redis-coordination/demos/test-waiting-mode.sh +0 -59
  110. package/claude-assets/skills/cfn-redis-coordination/examples/README.md +0 -73
  111. package/claude-assets/skills/cfn-redis-coordination/examples/grafana-dashboard.json +0 -352
  112. package/claude-assets/skills/cfn-redis-coordination/examples/hierarchical-pattern.sh +0 -127
  113. package/claude-assets/skills/cfn-redis-coordination/examples/mesh-pattern.sh +0 -171
  114. package/claude-assets/skills/cfn-redis-coordination/examples/timeout-handling.sh +0 -227
  115. package/claude-assets/skills/cfn-redis-coordination/examples/waiting-mode-pattern.sh +0 -239
  116. package/claude-assets/skills/cfn-redis-coordination/execute-product-owner-decision.sh +0 -258
  117. package/claude-assets/skills/cfn-redis-coordination/get-agent-timeout.sh +0 -177
  118. package/claude-assets/skills/cfn-redis-coordination/heartbeat-functions.sh +0 -137
  119. package/claude-assets/skills/cfn-redis-coordination/heartbeat-protocol.md +0 -106
  120. package/claude-assets/skills/cfn-redis-coordination/heartbeat.sh +0 -126
  121. package/claude-assets/skills/cfn-redis-coordination/init-swarm.sh +0 -148
  122. package/claude-assets/skills/cfn-redis-coordination/invoke-redis-pattern.sh +0 -220
  123. package/claude-assets/skills/cfn-redis-coordination/invoke-waiting-mode.sh +0 -283
  124. package/claude-assets/skills/cfn-redis-coordination/list-active-swarms.sh +0 -147
  125. package/claude-assets/skills/cfn-redis-coordination/log-event.sh +0 -109
  126. package/claude-assets/skills/cfn-redis-coordination/metrics-export.sh +0 -674
  127. package/claude-assets/skills/cfn-redis-coordination/metrics-schema.json +0 -66
  128. package/claude-assets/skills/cfn-redis-coordination/metrics-storage.md +0 -31
  129. package/claude-assets/skills/cfn-redis-coordination/monitor-cfn-violations.sh +0 -391
  130. package/claude-assets/skills/cfn-redis-coordination/monitor-heartbeats.sh +0 -101
  131. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop-v3.sh +0 -141
  132. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh +0 -31
  133. package/claude-assets/skills/cfn-redis-coordination/orchestrate-cfn-loop.sh.bak +0 -0
  134. package/claude-assets/skills/cfn-redis-coordination/priority-wake-mechanism.md +0 -75
  135. package/claude-assets/skills/cfn-redis-coordination/priority_wake.py +0 -134
  136. package/claude-assets/skills/cfn-redis-coordination/query-dlq.sh +0 -162
  137. package/claude-assets/skills/cfn-redis-coordination/query-logs.sh +0 -103
  138. package/claude-assets/skills/cfn-redis-coordination/redis-pattern.sh +0 -619
  139. package/claude-assets/skills/cfn-redis-coordination/retrieve-context.sh +0 -58
  140. package/claude-assets/skills/cfn-redis-coordination/select-specialist-agent.sh +0 -371
  141. package/claude-assets/skills/cfn-redis-coordination/semantic-match-tfidf.py +0 -252
  142. package/claude-assets/skills/cfn-redis-coordination/send-heartbeat.sh +0 -165
  143. package/claude-assets/skills/cfn-redis-coordination/signal.sh +0 -38
  144. package/claude-assets/skills/cfn-redis-coordination/store-context.sh +0 -86
  145. package/claude-assets/skills/cfn-redis-coordination/store-epic-context.sh +0 -123
  146. package/claude-assets/skills/cfn-redis-coordination/test-context-injection.sh +0 -354
  147. package/claude-assets/skills/cfn-redis-coordination/test-timeout-enforcement.sh +0 -513
  148. package/claude-assets/skills/cfn-redis-coordination/tests/convert-line-endings.sh +0 -15
  149. package/claude-assets/skills/cfn-redis-coordination/tests/dlq-functionality-test.sh +0 -102
  150. package/claude-assets/skills/cfn-redis-coordination/tests/edge-cases-test.sh +0 -99
  151. package/claude-assets/skills/cfn-redis-coordination/tests/integration-test.sh +0 -170
  152. package/claude-assets/skills/cfn-redis-coordination/tests/retry-mechanism-test.sh +0 -82
  153. package/claude-assets/skills/cfn-redis-coordination/tests/run-test-suite.sh +0 -92
  154. package/claude-assets/skills/cfn-redis-coordination/tests/run-tests.sh +0 -4
  155. package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-monitoring.sh +0 -418
  156. package/claude-assets/skills/cfn-redis-coordination/tests/test-heartbeat-simple.sh +0 -124
  157. package/claude-assets/skills/cfn-redis-coordination/tests/test-primitives.sh +0 -166
  158. package/claude-assets/skills/cfn-redis-coordination/tests/test-utils.sh +0 -54
  159. package/claude-assets/skills/cfn-redis-coordination/tests/test_utils.sh +0 -49
  160. package/claude-assets/skills/cfn-redis-coordination/v2_modularization/core_orchestration.sh +0 -76
  161. package/claude-assets/skills/cfn-redis-coordination/validate-parameters.sh +0 -492
@@ -1,418 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- ##############################################################################
4
- # Heartbeat Monitoring Test Suite
5
- # Validates agent heartbeat detection and quorum-aware handling
6
- ##############################################################################
7
-
8
- set -euo pipefail
9
-
10
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
- REDIS_COORDINATION_DIR="$(dirname "$SCRIPT_DIR")"
12
-
13
- # Test configuration
14
- TASK_ID="test-heartbeat-$(date +%s)"
15
- TEST_RESULTS=()
16
- FAILED_TESTS=0
17
-
18
- # Colors for output
19
- RED='\033[0;31m'
20
- GREEN='\033[0;32m'
21
- YELLOW='\033[1;33m'
22
- NC='\033[0m' # No Color
23
-
24
- ##############################################################################
25
- # Test Helper Functions
26
- ##############################################################################
27
- function setup_test() {
28
- local test_name="$1"
29
- echo ""
30
- echo "=========================================="
31
- echo "TEST: $test_name"
32
- echo "=========================================="
33
-
34
- # Clean up any previous test data
35
- redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL >/dev/null 2>&1 || true
36
- }
37
-
38
- function assert_equals() {
39
- local expected="$1"
40
- local actual="$2"
41
- local message="$3"
42
-
43
- if [ "$expected" = "$actual" ]; then
44
- echo -e "${GREEN}✓${NC} $message"
45
- return 0
46
- else
47
- echo -e "${RED}✗${NC} $message"
48
- echo " Expected: $expected"
49
- echo " Actual: $actual"
50
- return 1
51
- fi
52
- }
53
-
54
- function assert_not_equals() {
55
- local not_expected="$1"
56
- local actual="$2"
57
- local message="$3"
58
-
59
- if [ "$not_expected" != "$actual" ]; then
60
- echo -e "${GREEN}✓${NC} $message"
61
- return 0
62
- else
63
- echo -e "${RED}✗${NC} $message"
64
- echo " Should not be: $not_expected"
65
- echo " Actual: $actual"
66
- return 1
67
- fi
68
- }
69
-
70
- function record_result() {
71
- local test_name="$1"
72
- local result="$2"
73
-
74
- TEST_RESULTS+=("$test_name: $result")
75
-
76
- if [ "$result" = "PASS" ]; then
77
- echo -e "${GREEN}RESULT: PASS${NC}"
78
- else
79
- echo -e "${RED}RESULT: FAIL${NC}"
80
- FAILED_TESTS=$((FAILED_TESTS + 1))
81
- fi
82
- }
83
-
84
- ##############################################################################
85
- # Test 1: Agent with active heartbeat is detected as alive
86
- ##############################################################################
87
- function test_active_heartbeat() {
88
- setup_test "Active Heartbeat Detection"
89
-
90
- local agent="test-agent-1"
91
- local hb_key="swarm:${TASK_ID}:${agent}:heartbeat"
92
-
93
- # Set heartbeat
94
- redis-cli SET "$hb_key" "{\"timestamp\": $(date +%s), \"status\": \"working\"}" >/dev/null
95
- redis-cli EXPIRE "$hb_key" 60 >/dev/null
96
-
97
- # Source heartbeat functions
98
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
99
-
100
- # Check heartbeat
101
- if check_agent_heartbeat "$agent" "$TASK_ID"; then
102
- record_result "test_active_heartbeat" "PASS"
103
- else
104
- record_result "test_active_heartbeat" "FAIL"
105
- fi
106
- }
107
-
108
- ##############################################################################
109
- # Test 2: Agent without heartbeat is detected as dead
110
- ##############################################################################
111
- function test_missing_heartbeat() {
112
- setup_test "Missing Heartbeat Detection"
113
-
114
- local agent="test-agent-2"
115
-
116
- # Source heartbeat functions
117
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
118
-
119
- # Check heartbeat (should fail - no heartbeat set)
120
- if ! check_agent_heartbeat "$agent" "$TASK_ID"; then
121
- record_result "test_missing_heartbeat" "PASS"
122
- else
123
- record_result "test_missing_heartbeat" "FAIL"
124
- fi
125
- }
126
-
127
- ##############################################################################
128
- # Test 3: Missed heartbeat counter increments correctly
129
- ##############################################################################
130
- function test_missed_heartbeat_counter() {
131
- setup_test "Missed Heartbeat Counter"
132
-
133
- local agent="test-agent-3"
134
-
135
- # Source heartbeat functions
136
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
137
-
138
- # Initialize variables
139
- LOOP3_FAILED_AGENTS=()
140
- LOOP2_FAILED_AGENTS=()
141
- LOOP3_COMPLETED_AGENTS=()
142
- LOOP2_COMPLETED_AGENTS=()
143
- MIN_QUORUM_LOOP3=1
144
- MIN_QUORUM_LOOP2=1
145
- LOOP3_TOTAL=3
146
- LOOP2_TOTAL=3
147
- LOOP3_AGENTS="$agent"
148
- LOOP2_AGENTS=""
149
-
150
- # First check - should increment to 1
151
- check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
152
-
153
- if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 1 ]; then
154
- echo -e "${GREEN}✓${NC} Counter incremented to 1"
155
-
156
- # Second check - should increment to 2
157
- check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
158
-
159
- if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 2 ]; then
160
- echo -e "${GREEN}✓${NC} Counter incremented to 2"
161
- record_result "test_missed_heartbeat_counter" "PASS"
162
- else
163
- echo -e "${RED}✗${NC} Counter should be 2, got ${MISSED_HEARTBEATS[$agent]:-0}"
164
- record_result "test_missed_heartbeat_counter" "FAIL"
165
- fi
166
- else
167
- echo -e "${RED}✗${NC} Counter should be 1, got ${MISSED_HEARTBEATS[$agent]:-0}"
168
- record_result "test_missed_heartbeat_counter" "FAIL"
169
- fi
170
- }
171
-
172
- ##############################################################################
173
- # Test 4: Heartbeat counter resets when agent recovers
174
- ##############################################################################
175
- function test_heartbeat_recovery() {
176
- setup_test "Heartbeat Recovery"
177
-
178
- local agent="test-agent-4"
179
- local hb_key="swarm:${TASK_ID}:${agent}:heartbeat"
180
-
181
- # Source heartbeat functions
182
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
183
-
184
- # Initialize variables
185
- LOOP3_FAILED_AGENTS=()
186
- LOOP2_FAILED_AGENTS=()
187
- LOOP3_COMPLETED_AGENTS=()
188
- LOOP2_COMPLETED_AGENTS=()
189
- MIN_QUORUM_LOOP3=1
190
- MIN_QUORUM_LOOP2=1
191
- LOOP3_TOTAL=3
192
- LOOP2_TOTAL=3
193
- LOOP3_AGENTS="$agent"
194
- LOOP2_AGENTS=""
195
-
196
- # Miss heartbeat twice
197
- check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
198
- check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
199
-
200
- if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 2 ]; then
201
- echo -e "${GREEN}✓${NC} Counter at 2 after missing heartbeats"
202
-
203
- # Agent recovers - set heartbeat
204
- redis-cli SET "$hb_key" "{\"timestamp\": $(date +%s), \"status\": \"working\"}" >/dev/null
205
- redis-cli EXPIRE "$hb_key" 60 >/dev/null
206
-
207
- # Check again - should reset
208
- check_heartbeats_loop "$TASK_ID" "test" "$agent" 2>/dev/null || true
209
-
210
- if [ "${MISSED_HEARTBEATS[$agent]:-0}" -eq 0 ]; then
211
- echo -e "${GREEN}✓${NC} Counter reset to 0 after recovery"
212
- record_result "test_heartbeat_recovery" "PASS"
213
- else
214
- echo -e "${RED}✗${NC} Counter should reset to 0, got ${MISSED_HEARTBEATS[$agent]:-0}"
215
- record_result "test_heartbeat_recovery" "FAIL"
216
- fi
217
- else
218
- echo -e "${RED}✗${NC} Counter should be 2, got ${MISSED_HEARTBEATS[$agent]:-0}"
219
- record_result "test_heartbeat_recovery" "FAIL"
220
- fi
221
- }
222
-
223
- ##############################################################################
224
- # Test 5: Heartbeat monitor starts and stops correctly
225
- ##############################################################################
226
- function test_monitor_lifecycle() {
227
- setup_test "Monitor Lifecycle"
228
-
229
- local agent1="test-agent-5a"
230
- local agent2="test-agent-5b"
231
-
232
- # Source heartbeat functions
233
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
234
-
235
- # Initialize variables
236
- LOOP3_FAILED_AGENTS=()
237
- LOOP2_FAILED_AGENTS=()
238
- LOOP3_COMPLETED_AGENTS=()
239
- LOOP2_COMPLETED_AGENTS=()
240
- MIN_QUORUM_LOOP3=1
241
- MIN_QUORUM_LOOP2=1
242
- LOOP3_TOTAL=2
243
- LOOP2_TOTAL=2
244
- LOOP3_AGENTS="$agent1,$agent2"
245
- LOOP2_AGENTS=""
246
- SHUTDOWN_REQUESTED=0
247
-
248
- # Start monitor
249
- MONITOR_PID=$(start_heartbeat_monitor "$TASK_ID" "test" "$agent1" "$agent2")
250
-
251
- if [ -n "$MONITOR_PID" ] && kill -0 "$MONITOR_PID" 2>/dev/null; then
252
- echo -e "${GREEN}✓${NC} Monitor started successfully (PID: $MONITOR_PID)"
253
-
254
- # Wait a moment
255
- sleep 1
256
-
257
- # Check marker file exists
258
- if [ -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active" ]; then
259
- echo -e "${GREEN}✓${NC} Monitor marker file created"
260
-
261
- # Stop monitor
262
- stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
263
-
264
- # Wait a moment for cleanup
265
- sleep 1
266
-
267
- # Check marker file removed
268
- if [ ! -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active" ]; then
269
- echo -e "${GREEN}✓${NC} Monitor marker file removed"
270
-
271
- # Check process stopped
272
- if ! kill -0 "$MONITOR_PID" 2>/dev/null; then
273
- echo -e "${GREEN}✓${NC} Monitor process stopped"
274
- record_result "test_monitor_lifecycle" "PASS"
275
- else
276
- echo -e "${RED}✗${NC} Monitor process still running"
277
- kill "$MONITOR_PID" 2>/dev/null || true
278
- record_result "test_monitor_lifecycle" "FAIL"
279
- fi
280
- else
281
- echo -e "${RED}✗${NC} Monitor marker file not removed"
282
- stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
283
- record_result "test_monitor_lifecycle" "FAIL"
284
- fi
285
- else
286
- echo -e "${RED}✗${NC} Monitor marker file not created"
287
- stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
288
- record_result "test_monitor_lifecycle" "FAIL"
289
- fi
290
- else
291
- echo -e "${RED}✗${NC} Monitor failed to start"
292
- record_result "test_monitor_lifecycle" "FAIL"
293
- fi
294
- }
295
-
296
- ##############################################################################
297
- # Test 6: Monitor respects shutdown flag
298
- ##############################################################################
299
- function test_monitor_shutdown() {
300
- setup_test "Monitor Shutdown Handling"
301
-
302
- local agent="test-agent-6"
303
-
304
- # Source heartbeat functions
305
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
306
-
307
- # Initialize variables
308
- LOOP3_FAILED_AGENTS=()
309
- LOOP2_FAILED_AGENTS=()
310
- LOOP3_COMPLETED_AGENTS=()
311
- LOOP2_COMPLETED_AGENTS=()
312
- MIN_QUORUM_LOOP3=1
313
- MIN_QUORUM_LOOP2=1
314
- LOOP3_TOTAL=1
315
- LOOP2_TOTAL=1
316
- LOOP3_AGENTS="$agent"
317
- LOOP2_AGENTS=""
318
- SHUTDOWN_REQUESTED=0
319
-
320
- # Start monitor
321
- MONITOR_PID=$(start_heartbeat_monitor "$TASK_ID" "test" "$agent")
322
-
323
- if [ -n "$MONITOR_PID" ] && kill -0 "$MONITOR_PID" 2>/dev/null; then
324
- echo -e "${GREEN}✓${NC} Monitor started"
325
-
326
- # Set shutdown flag
327
- SHUTDOWN_REQUESTED=1
328
- export SHUTDOWN_REQUESTED
329
-
330
- # Wait for monitor to detect shutdown
331
- sleep 2
332
-
333
- # Monitor should have stopped on its own
334
- if ! kill -0 "$MONITOR_PID" 2>/dev/null; then
335
- echo -e "${GREEN}✓${NC} Monitor stopped automatically on shutdown flag"
336
-
337
- # Cleanup
338
- rm -f "/tmp/heartbeat-monitor-${TASK_ID}-test.active"
339
- record_result "test_monitor_shutdown" "PASS"
340
- else
341
- echo -e "${YELLOW}⚠${NC} Monitor still running, forcing cleanup"
342
- stop_heartbeat_monitor "$TASK_ID" "test" "$MONITOR_PID"
343
- record_result "test_monitor_shutdown" "PASS" # Still pass since cleanup works
344
- fi
345
- else
346
- echo -e "${RED}✗${NC} Monitor failed to start"
347
- record_result "test_monitor_shutdown" "FAIL"
348
- fi
349
- }
350
-
351
- ##############################################################################
352
- # Run All Tests
353
- ##############################################################################
354
- echo "=========================================="
355
- echo "Heartbeat Monitoring Test Suite"
356
- echo "Task ID: $TASK_ID"
357
- echo "=========================================="
358
-
359
- test_active_heartbeat
360
- test_missing_heartbeat
361
- test_missed_heartbeat_counter
362
- test_heartbeat_recovery
363
- test_monitor_lifecycle
364
- test_monitor_shutdown
365
-
366
- ##############################################################################
367
- # Cleanup
368
- ##############################################################################
369
- echo ""
370
- echo "=========================================="
371
- echo "Cleanup"
372
- echo "=========================================="
373
-
374
- # Clean up all test Redis keys
375
- KEYS_DELETED=$(redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL 2>/dev/null || echo "0")
376
- echo "Deleted $KEYS_DELETED Redis keys"
377
-
378
- # Clean up any remaining marker files
379
- rm -f /tmp/heartbeat-monitor-${TASK_ID}-*.active 2>/dev/null || true
380
- echo "Removed marker files"
381
-
382
- ##############################################################################
383
- # Summary
384
- ##############################################################################
385
- echo ""
386
- echo "=========================================="
387
- echo "Test Summary"
388
- echo "=========================================="
389
-
390
- TOTAL_TESTS=${#TEST_RESULTS[@]}
391
- PASSED_TESTS=$((TOTAL_TESTS - FAILED_TESTS))
392
-
393
- echo "Total Tests: $TOTAL_TESTS"
394
- echo -e "Passed: ${GREEN}$PASSED_TESTS${NC}"
395
- echo -e "Failed: ${RED}$FAILED_TESTS${NC}"
396
-
397
- echo ""
398
- echo "Individual Results:"
399
- for result in "${TEST_RESULTS[@]}"; do
400
- if [[ "$result" == *"PASS"* ]]; then
401
- echo -e " ${GREEN}✓${NC} $result"
402
- else
403
- echo -e " ${RED}✗${NC} $result"
404
- fi
405
- done
406
-
407
- echo ""
408
- if [ $FAILED_TESTS -eq 0 ]; then
409
- echo -e "${GREEN}=========================================="
410
- echo "ALL TESTS PASSED!"
411
- echo -e "==========================================${NC}"
412
- exit 0
413
- else
414
- echo -e "${RED}=========================================="
415
- echo "SOME TESTS FAILED"
416
- echo -e "==========================================${NC}"
417
- exit 1
418
- fi
@@ -1,124 +0,0 @@
1
- #!/usr/bin/env bash
2
-
3
- ##############################################################################
4
- # Simple Heartbeat Monitoring Test
5
- # Validates core heartbeat detection functionality
6
- ##############################################################################
7
-
8
- set -euo pipefail
9
-
10
- SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
11
- REDIS_COORDINATION_DIR="$(dirname "$SCRIPT_DIR")"
12
-
13
- # Test configuration
14
- TASK_ID="test-hb-$(date +%s)"
15
-
16
- # Source functions
17
- source "$REDIS_COORDINATION_DIR/heartbeat-functions.sh"
18
-
19
- echo "=========================================="
20
- echo "Simple Heartbeat Test"
21
- echo "Task ID: $TASK_ID"
22
- echo "=========================================="
23
-
24
- ##############################################################################
25
- # Test 1: Active heartbeat detected
26
- ##############################################################################
27
- echo ""
28
- echo "Test 1: Active heartbeat detection"
29
- AGENT1="agent-alive"
30
- HB_KEY="swarm:${TASK_ID}:${AGENT1}:heartbeat"
31
-
32
- redis-cli SET "$HB_KEY" '{"timestamp": 1234567890, "status": "working"}' >/dev/null
33
- redis-cli EXPIRE "$HB_KEY" 60 >/dev/null
34
-
35
- if check_agent_heartbeat "$AGENT1" "$TASK_ID"; then
36
- echo "✓ PASS: Active heartbeat detected"
37
- else
38
- echo "✗ FAIL: Active heartbeat not detected"
39
- fi
40
-
41
- ##############################################################################
42
- # Test 2: Missing heartbeat detected
43
- ##############################################################################
44
- echo ""
45
- echo "Test 2: Missing heartbeat detection"
46
- AGENT2="agent-dead"
47
-
48
- if ! check_agent_heartbeat "$AGENT2" "$TASK_ID"; then
49
- echo "✓ PASS: Missing heartbeat detected"
50
- else
51
- echo "✗ FAIL: Missing heartbeat should have been detected"
52
- fi
53
-
54
- ##############################################################################
55
- # Test 3: Counter increments
56
- ##############################################################################
57
- echo ""
58
- echo "Test 3: Missed heartbeat counter"
59
- AGENT3="agent-flaky"
60
-
61
- # Initialize required variables
62
- LOOP3_FAILED_AGENTS=()
63
- LOOP2_FAILED_AGENTS=()
64
- LOOP3_COMPLETED_AGENTS=()
65
- LOOP2_COMPLETED_AGENTS=()
66
- MIN_QUORUM_LOOP3=1
67
- MIN_QUORUM_LOOP2=1
68
- LOOP3_TOTAL=1
69
- LOOP2_TOTAL=1
70
- LOOP3_AGENTS="$AGENT3"
71
- LOOP2_AGENTS=""
72
-
73
- # Check twice (agent has no heartbeat)
74
- check_heartbeats_loop "$TASK_ID" "test" "$AGENT3" 2>/dev/null || true
75
- check_heartbeats_loop "$TASK_ID" "test" "$AGENT3" 2>/dev/null || true
76
-
77
- if [ "${MISSED_HEARTBEATS[$AGENT3]:-0}" -eq 2 ]; then
78
- echo "✓ PASS: Counter incremented correctly to 2"
79
- else
80
- echo "✗ FAIL: Counter should be 2, got ${MISSED_HEARTBEATS[$AGENT3]:-0}"
81
- fi
82
-
83
- ##############################################################################
84
- # Test 4: Counter resets on recovery
85
- ##############################################################################
86
- echo ""
87
- echo "Test 4: Counter reset on recovery"
88
- AGENT4="agent-recover"
89
-
90
- # Initialize
91
- LOOP3_AGENTS="$AGENT4"
92
-
93
- # Miss twice
94
- check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
95
- check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
96
-
97
- BEFORE="${MISSED_HEARTBEATS[$AGENT4]:-0}"
98
-
99
- # Set heartbeat
100
- HB_KEY4="swarm:${TASK_ID}:${AGENT4}:heartbeat"
101
- redis-cli SET "$HB_KEY4" '{"timestamp": 1234567890, "status": "recovered"}' >/dev/null
102
-
103
- # Check again
104
- check_heartbeats_loop "$TASK_ID" "test" "$AGENT4" 2>/dev/null || true
105
-
106
- AFTER="${MISSED_HEARTBEATS[$AGENT4]:-0}"
107
-
108
- if [ "$BEFORE" -eq 2 ] && [ "$AFTER" -eq 0 ]; then
109
- echo "✓ PASS: Counter reset from 2 to 0 on recovery"
110
- else
111
- echo "✗ FAIL: Counter should reset (before=$BEFORE, after=$AFTER)"
112
- fi
113
-
114
- ##############################################################################
115
- # Cleanup
116
- ##############################################################################
117
- echo ""
118
- echo "Cleaning up..."
119
- redis-cli --scan --pattern "swarm:${TASK_ID}:*" | xargs -r redis-cli DEL >/dev/null 2>&1 || true
120
-
121
- echo ""
122
- echo "=========================================="
123
- echo "Tests complete"
124
- echo "=========================================="
@@ -1,166 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Fail on any error
4
- set -e
5
-
6
- # Load test utilities
7
- source "$(dirname "$0")/test-utils.sh"
8
-
9
- # Ensure Redis is running before tests
10
- check_redis_connection() {
11
- if ! redis-cli ping &>/dev/null; then
12
- echo "ERROR: Redis is not running"
13
- exit 1
14
- fi
15
- }
16
-
17
- # Clean up Redis test keys after each test
18
- cleanup_redis_keys() {
19
- redis-cli del "test:context:key" "test:signal:key" "test:results:key"
20
- }
21
-
22
- # Path to scripts under test
23
- STORE_CONTEXT_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-store-context.sh"
24
- RETRIEVE_CONTEXT_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-retrieve-context.sh"
25
- SIGNAL_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-signal.sh"
26
- COLLECT_RESULTS_SCRIPT="$(dirname "$0")/.claude/skills/cfn-cfn-collect-results.sh"
27
-
28
- # 1. Test store-context.sh
29
- test_store_context_happy_path() {
30
- local test_json='{"key": "value", "nested": {"a": 1}}'
31
-
32
- # Execute store context
33
- bash "$STORE_CONTEXT_SCRIPT" \
34
- --key "test:context:key" \
35
- --context "$test_json" \
36
- --ttl 3600
37
-
38
- # Verify stored context
39
- stored_context=$(redis-cli get "test:context:key")
40
- assert_equals "$stored_context" "$test_json" "Context should be stored correctly"
41
- }
42
-
43
- test_store_context_empty_data() {
44
- # Test with empty JSON
45
- bash "$STORE_CONTEXT_SCRIPT" \
46
- --key "test:context:key" \
47
- --context "{}" \
48
- --ttl 3600
49
-
50
- stored_context=$(redis-cli get "test:context:key")
51
- assert_equals "$stored_context" "{}" "Empty context should be stored"
52
- }
53
-
54
- test_store_context_special_chars() {
55
- local test_json='{"special": "value with !@#$%^&*()_+ chars"}'
56
-
57
- bash "$STORE_CONTEXT_SCRIPT" \
58
- --key "test:context:key" \
59
- --context "$test_json" \
60
- --ttl 3600
61
-
62
- stored_context=$(redis-cli get "test:context:key")
63
- assert_equals "$stored_context" "$test_json" "Context with special characters should store correctly"
64
- }
65
-
66
- # 2. Test retrieve-context.sh
67
- test_retrieve_context_existing_key() {
68
- local test_json='{"key": "retrieve-test"}'
69
-
70
- # First store the context
71
- redis-cli set "test:context:key" "$test_json"
72
-
73
- # Retrieve context
74
- retrieved_context=$(bash "$RETRIEVE_CONTEXT_SCRIPT" --key "test:context:key")
75
-
76
- assert_equals "$retrieved_context" "$test_json" "Should retrieve existing context"
77
- }
78
-
79
- test_retrieve_context_missing_key() {
80
- # Ensure key doesn't exist
81
- redis-cli del "nonexistent:key"
82
-
83
- # Try to retrieve missing context
84
- retrieved_context=$(bash "$RETRIEVE_CONTEXT_SCRIPT" --key "nonexistent:key" || echo "")
85
-
86
- assert_equals "$retrieved_context" "" "Missing key should return empty string"
87
- }
88
-
89
- # 3. Test signal.sh
90
- test_signal_happy_path() {
91
- bash "$SIGNAL_SCRIPT" \
92
- --key "test:signal:key" \
93
- --value "completed" \
94
- --ttl 3600
95
-
96
- signaled_value=$(redis-cli get "test:signal:key")
97
- assert_equals "$signaled_value" "completed" "Signal should be stored correctly"
98
- }
99
-
100
- test_signal_empty_value() {
101
- bash "$SIGNAL_SCRIPT" \
102
- --key "test:signal:key" \
103
- --value "" \
104
- --ttl 3600
105
-
106
- signaled_value=$(redis-cli get "test:signal:key")
107
- assert_equals "$signaled_value" "" "Empty signal should be allowed"
108
- }
109
-
110
- # 4. Test collect-results.sh
111
- test_collect_results_multiple_agents() {
112
- # Clear any existing list
113
- redis-cli del "test:results:key"
114
-
115
- # Simulate multiple agent results
116
- redis-cli rpush "test:results:key" '{"agent1": 0.9}'
117
- redis-cli rpush "test:results:key" '{"agent2": 0.85}'
118
-
119
- # Collect results
120
- results=$(bash "$COLLECT_RESULTS_SCRIPT" --key "test:results:key")
121
-
122
- # Check if results are correctly collected
123
- assert_contains "$results" "agent1" "Should collect agent1 result"
124
- assert_contains "$results" "agent2" "Should collect agent2 result"
125
- }
126
-
127
- # Main test runner
128
- run_tests() {
129
- check_redis_connection
130
-
131
- echo "Running Redis Coordination Primitive Tests"
132
- echo "----------------------------------------"
133
-
134
- # Run store-context tests
135
- test_store_context_happy_path
136
- test_store_context_empty_data
137
- test_store_context_special_chars
138
-
139
- # Run retrieve-context tests
140
- test_retrieve_context_existing_key
141
- test_retrieve_context_missing_key
142
-
143
- # Run signal tests
144
- test_signal_happy_path
145
- test_signal_empty_value
146
-
147
- # Run collect results tests
148
- test_collect_results_multiple_agents
149
-
150
- # Clean up after tests
151
- cleanup_redis_keys
152
-
153
- echo "----------------------------------------"
154
- echo "All tests passed successfully!"
155
- }
156
-
157
- # Execute tests and capture results
158
- {
159
- run_tests
160
- } > /tmp/primitive-test-results.md 2>&1
161
-
162
- # Confidence calculation (simplistic based on test coverage)
163
- CONFIDENCE=$(echo "scale=2; 0.9" | bc)
164
- echo "Test Confidence: $CONFIDENCE" >> /tmp/primitive-test-results.md
165
-
166
- exit 0