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,220 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -euo pipefail
|
|
3
|
-
|
|
4
|
-
# Version 1.3.0
|
|
5
|
-
# Redis Coordination Pattern CLI
|
|
6
|
-
|
|
7
|
-
# Load configuration
|
|
8
|
-
CONFIG_PATH="$(dirname "$0")/config.json"
|
|
9
|
-
REDIS_HOST=$(jq -r '.host' "$CONFIG_PATH")
|
|
10
|
-
REDIS_PORT=$(jq -r '.port' "$CONFIG_PATH")
|
|
11
|
-
REDIS_DB=$(jq -r '.db' "$CONFIG_PATH")
|
|
12
|
-
|
|
13
|
-
# Utility functions
|
|
14
|
-
log_error() {
|
|
15
|
-
echo "{\"status\": \"error\", \"message\": \"$1\"}" >&2
|
|
16
|
-
exit 1
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
invoke_redis_command() {
|
|
20
|
-
local command="$1"
|
|
21
|
-
shift
|
|
22
|
-
redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" "$command" "$@"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
# Waiting mode operations
|
|
26
|
-
wait_mode() {
|
|
27
|
-
local task_id=""
|
|
28
|
-
local agent_id=""
|
|
29
|
-
local context=""
|
|
30
|
-
|
|
31
|
-
while [[ $# -gt 0 ]]; do
|
|
32
|
-
case "$1" in
|
|
33
|
-
--task-id)
|
|
34
|
-
task_id="$2"
|
|
35
|
-
shift 2
|
|
36
|
-
;;
|
|
37
|
-
--agent-id)
|
|
38
|
-
agent_id="$2"
|
|
39
|
-
shift 2
|
|
40
|
-
;;
|
|
41
|
-
--context)
|
|
42
|
-
context="$2"
|
|
43
|
-
shift 2
|
|
44
|
-
;;
|
|
45
|
-
*)
|
|
46
|
-
log_error "Invalid argument for wait: $1"
|
|
47
|
-
;;
|
|
48
|
-
esac
|
|
49
|
-
done
|
|
50
|
-
|
|
51
|
-
[[ -z "$task_id" ]] && log_error "task-id is required"
|
|
52
|
-
[[ -z "$agent_id" ]] && log_error "agent-id is required"
|
|
53
|
-
|
|
54
|
-
local wake_channel="task:$task_id:agent:$agent_id:wake"
|
|
55
|
-
|
|
56
|
-
# Blocking pop with timeout
|
|
57
|
-
result=$(invoke_redis_command BLPOP "$wake_channel" 300)
|
|
58
|
-
|
|
59
|
-
if [[ -z "$result" ]]; then
|
|
60
|
-
echo "{\"status\": \"timeout\", \"task_id\": \"$task_id\", \"agent_id\": \"$agent_id\", \"context\": \"$context\"}"
|
|
61
|
-
else
|
|
62
|
-
echo "{\"status\": \"woken\", \"task_id\": \"$task_id\", \"agent_id\": \"$agent_id\", \"payload\": $result, \"context\": \"$context\"}"
|
|
63
|
-
fi
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
wake_mode() {
|
|
67
|
-
local task_id=""
|
|
68
|
-
local agent_id=""
|
|
69
|
-
local payload=""
|
|
70
|
-
|
|
71
|
-
while [[ $# -gt 0 ]]; do
|
|
72
|
-
case "$1" in
|
|
73
|
-
--task-id)
|
|
74
|
-
task_id="$2"
|
|
75
|
-
shift 2
|
|
76
|
-
;;
|
|
77
|
-
--agent-id)
|
|
78
|
-
agent_id="$2"
|
|
79
|
-
shift 2
|
|
80
|
-
;;
|
|
81
|
-
--payload)
|
|
82
|
-
payload="$2"
|
|
83
|
-
shift 2
|
|
84
|
-
;;
|
|
85
|
-
*)
|
|
86
|
-
log_error "Invalid argument for wake: $1"
|
|
87
|
-
;;
|
|
88
|
-
esac
|
|
89
|
-
done
|
|
90
|
-
|
|
91
|
-
[[ -z "$task_id" ]] && log_error "task-id is required"
|
|
92
|
-
[[ -z "$agent_id" ]] && log_error "agent-id is required"
|
|
93
|
-
[[ -z "$payload" ]] && log_error "payload is required"
|
|
94
|
-
|
|
95
|
-
local wake_channel="task:$task_id:agent:$agent_id:wake"
|
|
96
|
-
|
|
97
|
-
invoke_redis_command LPUSH "$wake_channel" "$payload" > /dev/null
|
|
98
|
-
|
|
99
|
-
echo "{\"status\": \"success\", \"task_id\": \"$task_id\", \"agent_id\": \"$agent_id\"}"
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
report_mode() {
|
|
103
|
-
local task_id=""
|
|
104
|
-
local agent_id=""
|
|
105
|
-
local confidence=0.0
|
|
106
|
-
local result=""
|
|
107
|
-
|
|
108
|
-
while [[ $# -gt 0 ]]; do
|
|
109
|
-
case "$1" in
|
|
110
|
-
--task-id)
|
|
111
|
-
task_id="$2"
|
|
112
|
-
shift 2
|
|
113
|
-
;;
|
|
114
|
-
--agent-id)
|
|
115
|
-
agent_id="$2"
|
|
116
|
-
shift 2
|
|
117
|
-
;;
|
|
118
|
-
--confidence)
|
|
119
|
-
confidence="$2"
|
|
120
|
-
shift 2
|
|
121
|
-
;;
|
|
122
|
-
--result)
|
|
123
|
-
result="$2"
|
|
124
|
-
shift 2
|
|
125
|
-
;;
|
|
126
|
-
*)
|
|
127
|
-
log_error "Invalid argument for report: $1"
|
|
128
|
-
;;
|
|
129
|
-
esac
|
|
130
|
-
done
|
|
131
|
-
|
|
132
|
-
[[ -z "$task_id" ]] && log_error "task-id is required"
|
|
133
|
-
[[ -z "$agent_id" ]] && log_error "agent-id is required"
|
|
134
|
-
|
|
135
|
-
local result_key="task:$task_id:agent:$agent_id:result"
|
|
136
|
-
local result_json=$(jq -n \
|
|
137
|
-
--arg r "$result" \
|
|
138
|
-
--arg c "$confidence" \
|
|
139
|
-
'{result: $r, confidence: ($c | tonumber), timestamp: now}')
|
|
140
|
-
|
|
141
|
-
invoke_redis_command SET "$result_key" "$result_json" > /dev/null
|
|
142
|
-
|
|
143
|
-
echo "{\"status\": \"success\", \"task_id\": \"$task_id\", \"agent_id\": \"$agent_id\", \"confidence\": $confidence}"
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
collect_mode() {
|
|
147
|
-
local task_id=""
|
|
148
|
-
local agent_ids=()
|
|
149
|
-
|
|
150
|
-
while [[ $# -gt 0 ]]; do
|
|
151
|
-
case "$1" in
|
|
152
|
-
--task-id)
|
|
153
|
-
task_id="$2"
|
|
154
|
-
shift 2
|
|
155
|
-
;;
|
|
156
|
-
--agent-ids)
|
|
157
|
-
IFS=',' read -r -a agent_ids <<< "$2"
|
|
158
|
-
shift 2
|
|
159
|
-
;;
|
|
160
|
-
*)
|
|
161
|
-
log_error "Invalid argument for collect: $1"
|
|
162
|
-
;;
|
|
163
|
-
esac
|
|
164
|
-
done
|
|
165
|
-
|
|
166
|
-
[[ -z "$task_id" ]] && log_error "task-id is required"
|
|
167
|
-
[[ ${#agent_ids[@]} -eq 0 ]] && log_error "agent-ids is required"
|
|
168
|
-
|
|
169
|
-
local results=()
|
|
170
|
-
local total_confidence=0.0
|
|
171
|
-
local valid_results=0
|
|
172
|
-
|
|
173
|
-
for agent_id in "${agent_ids[@]}"; do
|
|
174
|
-
local result_key="task:$task_id:agent:$agent_id:result"
|
|
175
|
-
result=$(invoke_redis_command GET "$result_key")
|
|
176
|
-
|
|
177
|
-
if [[ -n "$result" ]]; then
|
|
178
|
-
results+=("$result")
|
|
179
|
-
confidence=$(echo "$result" | jq '.confidence')
|
|
180
|
-
total_confidence=$(echo "$total_confidence + $confidence" | bc)
|
|
181
|
-
((valid_results++))
|
|
182
|
-
fi
|
|
183
|
-
done
|
|
184
|
-
|
|
185
|
-
local avg_confidence=0.0
|
|
186
|
-
if [[ $valid_results -gt 0 ]]; then
|
|
187
|
-
avg_confidence=$(echo "scale=2; $total_confidence / $valid_results" | bc)
|
|
188
|
-
fi
|
|
189
|
-
|
|
190
|
-
local consensus_threshold="0.90"
|
|
191
|
-
local status="insufficient_consensus"
|
|
192
|
-
if (( $(echo "$avg_confidence >= $consensus_threshold" | bc -l) )); then
|
|
193
|
-
status="consensus"
|
|
194
|
-
fi
|
|
195
|
-
|
|
196
|
-
echo "{\"status\": \"$status\", \"task_id\": \"$task_id\", \"results\": $(printf '%s\n' "${results[@]}" | jq -s '.'), \"avgConfidence\": $avg_confidence, \"consensusThreshold\": $consensus_threshold}"
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
# Determine action
|
|
200
|
-
case "${1:-}" in
|
|
201
|
-
wait)
|
|
202
|
-
shift
|
|
203
|
-
wait_mode "$@"
|
|
204
|
-
;;
|
|
205
|
-
wake)
|
|
206
|
-
shift
|
|
207
|
-
wake_mode "$@"
|
|
208
|
-
;;
|
|
209
|
-
report)
|
|
210
|
-
shift
|
|
211
|
-
report_mode "$@"
|
|
212
|
-
;;
|
|
213
|
-
collect)
|
|
214
|
-
shift
|
|
215
|
-
collect_mode "$@"
|
|
216
|
-
;;
|
|
217
|
-
*)
|
|
218
|
-
log_error "Usage: $0 {wait|wake|report|collect} [options]"
|
|
219
|
-
;;
|
|
220
|
-
esac
|
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
#
|
|
3
|
-
# Redis Waiting Mode CLI Wrapper for Agents
|
|
4
|
-
#
|
|
5
|
-
# Usage:
|
|
6
|
-
# ./invoke-waiting-mode.sh report --task-id <task> --agent-id <agent> --confidence <score> [--iteration <n>]
|
|
7
|
-
# ./invoke-waiting-mode.sh collect --task-id <task> --agent-ids <id1,id2,id3>
|
|
8
|
-
# ./invoke-waiting-mode.sh shutdown --task-id <task> [--reason <reason>]
|
|
9
|
-
#
|
|
10
|
-
# DEPRECATION NOTICE:
|
|
11
|
-
# - 'enter' and 'wake' subcommands are DEPRECATED
|
|
12
|
-
# - This script now only supports 'report', 'collect', and 'shutdown' subcommands
|
|
13
|
-
# - Agents are expected to exit cleanly without waiting mode
|
|
14
|
-
#
|
|
15
|
-
# Priority Levels (0-100, higher = more urgent, default = 50):
|
|
16
|
-
# 90-100: Critical (security patches, system failures)
|
|
17
|
-
# 70-89: High (urgent features, blocking bugs)
|
|
18
|
-
# 40-60: Medium (normal tasks, default)
|
|
19
|
-
# 20-39: Low (optimizations, refactoring)
|
|
20
|
-
# 0-19: Minimal (documentation, cleanup)
|
|
21
|
-
|
|
22
|
-
set -euo pipefail
|
|
23
|
-
|
|
24
|
-
# Debug mode (set DEBUG=true for verbose output)
|
|
25
|
-
DEBUG="${DEBUG:-false}"
|
|
26
|
-
|
|
27
|
-
# Parse command
|
|
28
|
-
COMMAND="${1:-}"
|
|
29
|
-
shift || true
|
|
30
|
-
|
|
31
|
-
# Parse arguments
|
|
32
|
-
TASK_ID=""
|
|
33
|
-
AGENT_ID=""
|
|
34
|
-
AGENT_IDS=""
|
|
35
|
-
REASON=""
|
|
36
|
-
ITERATION=""
|
|
37
|
-
CONFIDENCE=""
|
|
38
|
-
FEEDBACK=""
|
|
39
|
-
PRIORITY=50 # Default medium priority (0-100, higher = more urgent)
|
|
40
|
-
MIN_QUORUM="" # Minimum quorum for consensus validation
|
|
41
|
-
|
|
42
|
-
while [[ $# -gt 0 ]]; do
|
|
43
|
-
case $1 in
|
|
44
|
-
--task-id)
|
|
45
|
-
TASK_ID="$2"
|
|
46
|
-
shift 2
|
|
47
|
-
;;
|
|
48
|
-
--agent-id)
|
|
49
|
-
AGENT_ID="$2"
|
|
50
|
-
shift 2
|
|
51
|
-
;;
|
|
52
|
-
--agent-ids)
|
|
53
|
-
AGENT_IDS="$2"
|
|
54
|
-
shift 2
|
|
55
|
-
;;
|
|
56
|
-
--reason)
|
|
57
|
-
REASON="$2"
|
|
58
|
-
shift 2
|
|
59
|
-
;;
|
|
60
|
-
--iteration)
|
|
61
|
-
ITERATION="$2"
|
|
62
|
-
shift 2
|
|
63
|
-
;;
|
|
64
|
-
--confidence)
|
|
65
|
-
CONFIDENCE="$2"
|
|
66
|
-
shift 2
|
|
67
|
-
;;
|
|
68
|
-
--feedback)
|
|
69
|
-
FEEDBACK="$2"
|
|
70
|
-
shift 2
|
|
71
|
-
;;
|
|
72
|
-
--priority)
|
|
73
|
-
PRIORITY="$2"
|
|
74
|
-
shift 2
|
|
75
|
-
;;
|
|
76
|
-
--min-quorum)
|
|
77
|
-
MIN_QUORUM="$2"
|
|
78
|
-
shift 2
|
|
79
|
-
;;
|
|
80
|
-
*)
|
|
81
|
-
echo "Unknown argument: $1"
|
|
82
|
-
exit 1
|
|
83
|
-
;;
|
|
84
|
-
esac
|
|
85
|
-
done
|
|
86
|
-
|
|
87
|
-
case "$COMMAND" in
|
|
88
|
-
enter)
|
|
89
|
-
echo "[DEPRECATED] 'enter' subcommand is no longer supported."
|
|
90
|
-
echo "Agents should no longer use waiting mode. Exit cleanly."
|
|
91
|
-
exit 1
|
|
92
|
-
;;
|
|
93
|
-
|
|
94
|
-
wake)
|
|
95
|
-
echo "[DEPRECATED] 'wake' subcommand is no longer supported."
|
|
96
|
-
echo "Coordinator should spawn agents directly without waiting mode."
|
|
97
|
-
exit 1
|
|
98
|
-
;;
|
|
99
|
-
|
|
100
|
-
report)
|
|
101
|
-
if [ -z "$TASK_ID" ] || [ -z "$AGENT_ID" ] || [ -z "$CONFIDENCE" ]; then
|
|
102
|
-
echo "Error: report requires --task-id, --agent-id, and --confidence"
|
|
103
|
-
exit 1
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
RESULT_KEY="swarm:${TASK_ID}:${AGENT_ID}:result"
|
|
107
|
-
|
|
108
|
-
# Build result message with optional feedback
|
|
109
|
-
RESULT_MSG=$(jq -n \
|
|
110
|
-
--arg confidence "$CONFIDENCE" \
|
|
111
|
-
--arg iteration "${ITERATION:-0}" \
|
|
112
|
-
--arg feedback "${FEEDBACK:-}" \
|
|
113
|
-
--arg ts "$(date +%s)" \
|
|
114
|
-
'{
|
|
115
|
-
confidence: ($confidence | tonumber),
|
|
116
|
-
iteration: ($iteration | tonumber),
|
|
117
|
-
feedback: ($feedback | split(",") | map(select(length > 0))),
|
|
118
|
-
timestamp: ($ts | tonumber)
|
|
119
|
-
}')
|
|
120
|
-
|
|
121
|
-
echo "$RESULT_MSG" | redis-cli -x LPUSH "$RESULT_KEY" >/dev/null
|
|
122
|
-
|
|
123
|
-
echo "[$AGENT_ID] ✅ Result reported"
|
|
124
|
-
echo " Confidence: $CONFIDENCE"
|
|
125
|
-
[ -n "$ITERATION" ] && echo " Iteration: $ITERATION"
|
|
126
|
-
if [ -n "$FEEDBACK" ]; then
|
|
127
|
-
echo " Feedback items: $(echo "$FEEDBACK" | tr ',' '\n' | wc -l)"
|
|
128
|
-
fi
|
|
129
|
-
;;
|
|
130
|
-
|
|
131
|
-
collect)
|
|
132
|
-
if [ -z "$TASK_ID" ] || [ -z "$AGENT_IDS" ]; then
|
|
133
|
-
echo "Error: collect requires --task-id and --agent-ids" >&2
|
|
134
|
-
exit 1
|
|
135
|
-
fi
|
|
136
|
-
|
|
137
|
-
# Output verbose messages to stderr
|
|
138
|
-
echo "[Coordinator] Collecting results from agents..." >&2
|
|
139
|
-
echo "" >&2
|
|
140
|
-
|
|
141
|
-
# Split agent IDs
|
|
142
|
-
IFS=',' read -ra AGENTS <<< "$AGENT_IDS"
|
|
143
|
-
|
|
144
|
-
RESULTS=()
|
|
145
|
-
CONFIDENCES=()
|
|
146
|
-
ALL_FEEDBACK=()
|
|
147
|
-
|
|
148
|
-
for AGENT in "${AGENTS[@]}"; do
|
|
149
|
-
RESULT_KEY="swarm:${TASK_ID}:${AGENT}:result"
|
|
150
|
-
|
|
151
|
-
# Get latest result (non-blocking, non-destructive)
|
|
152
|
-
# Use LINDEX instead of LPOP to preserve results for multiple reads
|
|
153
|
-
RESULT=$(redis-cli LINDEX "$RESULT_KEY" 0)
|
|
154
|
-
|
|
155
|
-
if [ -n "$RESULT" ] && [ "$RESULT" != "(nil)" ]; then
|
|
156
|
-
# Handle both simple numeric format and JSON format
|
|
157
|
-
# Try to parse as JSON first, fall back to simple number
|
|
158
|
-
if CONF=$(echo "$RESULT" | jq -r '.confidence' 2>/dev/null) && [ "$CONF" != "null" ]; then
|
|
159
|
-
# JSON format: {"confidence":0.85,"iteration":1,...}
|
|
160
|
-
echo " [$AGENT] Confidence: $CONF" >&2
|
|
161
|
-
RESULTS+=("$RESULT")
|
|
162
|
-
CONFIDENCES+=("$CONF")
|
|
163
|
-
|
|
164
|
-
# Check if result includes feedback array
|
|
165
|
-
FEEDBACK=$(echo "$RESULT" | jq -r '.feedback // empty | .[]?' 2>/dev/null)
|
|
166
|
-
if [ -n "$FEEDBACK" ]; then
|
|
167
|
-
echo " [$AGENT] Feedback provided:" >&2
|
|
168
|
-
echo "$RESULT" | jq -r '.feedback[]' | sed 's/^/ - /' >&2
|
|
169
|
-
|
|
170
|
-
# Collect all feedback items
|
|
171
|
-
while IFS= read -r ITEM; do
|
|
172
|
-
ALL_FEEDBACK+=("$ITEM")
|
|
173
|
-
done < <(echo "$RESULT" | jq -r '.feedback[]')
|
|
174
|
-
fi
|
|
175
|
-
elif [[ "$RESULT" =~ ^[0-9]+\.?[0-9]*$ ]]; then
|
|
176
|
-
# Simple numeric format: "0.85"
|
|
177
|
-
CONF="$RESULT"
|
|
178
|
-
echo " [$AGENT] Confidence: $CONF" >&2
|
|
179
|
-
CONFIDENCES+=("$CONF")
|
|
180
|
-
else
|
|
181
|
-
echo " [$AGENT] ⚠️ Invalid result format: $RESULT" >&2
|
|
182
|
-
fi
|
|
183
|
-
else
|
|
184
|
-
echo " [$AGENT] ⚠️ No result found" >&2
|
|
185
|
-
fi
|
|
186
|
-
done
|
|
187
|
-
|
|
188
|
-
# Validate quorum if specified
|
|
189
|
-
TOTAL_AGENTS=${#AGENTS[@]}
|
|
190
|
-
RESPONDING_AGENTS=${#CONFIDENCES[@]}
|
|
191
|
-
|
|
192
|
-
if [ -n "$MIN_QUORUM" ]; then
|
|
193
|
-
# Parse min-quorum (supports: absolute number, percentage, or decimal)
|
|
194
|
-
if [[ "$MIN_QUORUM" =~ ^[0-9]+%$ ]]; then
|
|
195
|
-
# Percentage format: "66%"
|
|
196
|
-
PCT=${MIN_QUORUM%\%}
|
|
197
|
-
REQUIRED=$(echo "scale=0; ($TOTAL_AGENTS * $PCT) / 100" | bc)
|
|
198
|
-
elif [[ "$MIN_QUORUM" =~ ^0\.[0-9]+$ ]]; then
|
|
199
|
-
# Decimal format: "0.66"
|
|
200
|
-
REQUIRED=$(echo "scale=0; ($TOTAL_AGENTS * $MIN_QUORUM) / 1" | bc)
|
|
201
|
-
else
|
|
202
|
-
# Absolute number format: "2"
|
|
203
|
-
REQUIRED=$MIN_QUORUM
|
|
204
|
-
fi
|
|
205
|
-
|
|
206
|
-
if [ "$RESPONDING_AGENTS" -lt "$REQUIRED" ]; then
|
|
207
|
-
echo "" >&2
|
|
208
|
-
echo "[Coordinator] ❌ Quorum not met" >&2
|
|
209
|
-
echo " Required: $REQUIRED agents" >&2
|
|
210
|
-
echo " Responding: $RESPONDING_AGENTS agents" >&2
|
|
211
|
-
exit 1
|
|
212
|
-
fi
|
|
213
|
-
fi
|
|
214
|
-
|
|
215
|
-
# Calculate consensus
|
|
216
|
-
if [ ${#CONFIDENCES[@]} -gt 0 ]; then
|
|
217
|
-
SUM=0
|
|
218
|
-
for CONF in "${CONFIDENCES[@]}"; do
|
|
219
|
-
SUM=$(echo "$SUM + $CONF" | bc)
|
|
220
|
-
done
|
|
221
|
-
COUNT=${#CONFIDENCES[@]}
|
|
222
|
-
CONSENSUS=$(echo "scale=2; $SUM / $COUNT" | bc)
|
|
223
|
-
|
|
224
|
-
# Ensure leading zero for bc output (handles .87 -> 0.87)
|
|
225
|
-
if [[ "$CONSENSUS" =~ ^\. ]]; then
|
|
226
|
-
CONSENSUS="0$CONSENSUS"
|
|
227
|
-
fi
|
|
228
|
-
|
|
229
|
-
echo "" >&2
|
|
230
|
-
echo "[Coordinator] Consensus: $CONSENSUS" >&2
|
|
231
|
-
|
|
232
|
-
# Print aggregated feedback if available
|
|
233
|
-
if [ ${#ALL_FEEDBACK[@]} -gt 0 ]; then
|
|
234
|
-
echo "[Coordinator] Aggregated Feedback (${#ALL_FEEDBACK[@]} items):" >&2
|
|
235
|
-
printf '%s\n' "${ALL_FEEDBACK[@]}" | sort -u | sed 's/^/ - /' >&2
|
|
236
|
-
fi
|
|
237
|
-
|
|
238
|
-
# Output only consensus value to stdout for callers
|
|
239
|
-
echo "$CONSENSUS"
|
|
240
|
-
else
|
|
241
|
-
echo "" >&2
|
|
242
|
-
echo "[Coordinator] No results to calculate consensus" >&2
|
|
243
|
-
echo "0.0"
|
|
244
|
-
fi
|
|
245
|
-
;;
|
|
246
|
-
|
|
247
|
-
shutdown)
|
|
248
|
-
if [ -z "$TASK_ID" ]; then
|
|
249
|
-
echo "Error: shutdown requires --task-id"
|
|
250
|
-
exit 1
|
|
251
|
-
fi
|
|
252
|
-
|
|
253
|
-
SHUTDOWN_KEY="swarm:${TASK_ID}:shutdown"
|
|
254
|
-
|
|
255
|
-
# Build shutdown message
|
|
256
|
-
SHUTDOWN_MSG=$(jq -n \
|
|
257
|
-
--arg reason "${REASON:-task_complete}" \
|
|
258
|
-
--arg ts "$(date +%s)" \
|
|
259
|
-
'{
|
|
260
|
-
reason: $reason,
|
|
261
|
-
timestamp: ($ts | tonumber)
|
|
262
|
-
}')
|
|
263
|
-
|
|
264
|
-
# Broadcast shutdown signal
|
|
265
|
-
echo "$SHUTDOWN_MSG" | redis-cli -x LPUSH "$SHUTDOWN_KEY" >/dev/null
|
|
266
|
-
|
|
267
|
-
echo "[Coordinator] 🛑 Shutdown signal broadcasted"
|
|
268
|
-
echo " Task ID: $TASK_ID"
|
|
269
|
-
echo " Reason: ${REASON:-task_complete}"
|
|
270
|
-
;;
|
|
271
|
-
|
|
272
|
-
*)
|
|
273
|
-
echo "Usage: $0 <command> [options]"
|
|
274
|
-
echo ""
|
|
275
|
-
echo "Commands:"
|
|
276
|
-
echo " report - Agent reports result"
|
|
277
|
-
echo " collect - Coordinator collects results"
|
|
278
|
-
echo " shutdown - Coordinator broadcasts shutdown signal"
|
|
279
|
-
echo ""
|
|
280
|
-
echo "Note: 'enter' and 'wake' subcommands are DEPRECATED"
|
|
281
|
-
exit 1
|
|
282
|
-
;;
|
|
283
|
-
esac
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
##############################################################################
|
|
4
|
-
# List Active Swarms - Redis Coordination
|
|
5
|
-
#
|
|
6
|
-
# Queries Redis for all active swarm metadata to help track multiple
|
|
7
|
-
# concurrent CFN Loop sessions.
|
|
8
|
-
#
|
|
9
|
-
# Usage:
|
|
10
|
-
# ./list-active-swarms.sh [--task-id <id>] [--mode <mode>] [--json]
|
|
11
|
-
##############################################################################
|
|
12
|
-
|
|
13
|
-
set -euo pipefail
|
|
14
|
-
|
|
15
|
-
# Configuration
|
|
16
|
-
TASK_ID_FILTER=""
|
|
17
|
-
MODE_FILTER=""
|
|
18
|
-
JSON_OUTPUT=false
|
|
19
|
-
|
|
20
|
-
# Parse arguments
|
|
21
|
-
while [[ $# -gt 0 ]]; do
|
|
22
|
-
case $1 in
|
|
23
|
-
--task-id)
|
|
24
|
-
TASK_ID_FILTER="$2"
|
|
25
|
-
shift 2
|
|
26
|
-
;;
|
|
27
|
-
--mode)
|
|
28
|
-
MODE_FILTER="$2"
|
|
29
|
-
shift 2
|
|
30
|
-
;;
|
|
31
|
-
--json)
|
|
32
|
-
JSON_OUTPUT=true
|
|
33
|
-
shift
|
|
34
|
-
;;
|
|
35
|
-
*)
|
|
36
|
-
echo "Unknown option: $1"
|
|
37
|
-
echo "Usage: $0 [--task-id <id>] [--mode <mode>] [--json]"
|
|
38
|
-
exit 1
|
|
39
|
-
;;
|
|
40
|
-
esac
|
|
41
|
-
done
|
|
42
|
-
|
|
43
|
-
# Get all swarm metadata keys
|
|
44
|
-
SWARM_KEYS=$(redis-cli --scan --pattern "swarm:*:metadata" 2>/dev/null || echo "")
|
|
45
|
-
|
|
46
|
-
if [ -z "$SWARM_KEYS" ]; then
|
|
47
|
-
if [ "$JSON_OUTPUT" = true ]; then
|
|
48
|
-
echo '{"swarms": [], "count": 0}'
|
|
49
|
-
else
|
|
50
|
-
echo "No active swarms found"
|
|
51
|
-
fi
|
|
52
|
-
exit 0
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# Initialize JSON array
|
|
56
|
-
if [ "$JSON_OUTPUT" = true ]; then
|
|
57
|
-
echo '{"swarms": ['
|
|
58
|
-
FIRST=true
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
# Process each swarm
|
|
62
|
-
while IFS= read -r KEY; do
|
|
63
|
-
if [ -z "$KEY" ]; then
|
|
64
|
-
continue
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# Extract swarm ID from key (swarm:swarm-<task-id>:metadata)
|
|
68
|
-
SWARM_ID=$(echo "$KEY" | sed 's/swarm:\(.*\):metadata/\1/')
|
|
69
|
-
|
|
70
|
-
# Get metadata
|
|
71
|
-
TASK_ID=$(redis-cli hget "$KEY" task_id 2>/dev/null || echo "")
|
|
72
|
-
MODE=$(redis-cli hget "$KEY" mode 2>/dev/null || echo "")
|
|
73
|
-
MAX_AGENTS=$(redis-cli hget "$KEY" max_agents 2>/dev/null || echo "")
|
|
74
|
-
LOOP3_AGENTS=$(redis-cli hget "$KEY" loop3_agents 2>/dev/null || echo "")
|
|
75
|
-
LOOP2_AGENTS=$(redis-cli hget "$KEY" loop2_agents 2>/dev/null || echo "")
|
|
76
|
-
PRODUCT_OWNER=$(redis-cli hget "$KEY" product_owner 2>/dev/null || echo "")
|
|
77
|
-
CREATED_AT=$(redis-cli hget "$KEY" created_at 2>/dev/null || echo "")
|
|
78
|
-
STATUS=$(redis-cli hget "$KEY" status 2>/dev/null || echo "in_progress")
|
|
79
|
-
FINAL_CONSENSUS=$(redis-cli hget "$KEY" final_consensus 2>/dev/null || echo "")
|
|
80
|
-
TOTAL_ITERATIONS=$(redis-cli hget "$KEY" total_iterations 2>/dev/null || echo "")
|
|
81
|
-
COMPLETED_AT=$(redis-cli hget "$KEY" completed_at 2>/dev/null || echo "")
|
|
82
|
-
|
|
83
|
-
# Apply filters
|
|
84
|
-
if [ -n "$TASK_ID_FILTER" ] && [ "$TASK_ID" != "$TASK_ID_FILTER" ]; then
|
|
85
|
-
continue
|
|
86
|
-
fi
|
|
87
|
-
|
|
88
|
-
if [ -n "$MODE_FILTER" ] && [ "$MODE" != "$MODE_FILTER" ]; then
|
|
89
|
-
continue
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
# Output
|
|
93
|
-
if [ "$JSON_OUTPUT" = true ]; then
|
|
94
|
-
if [ "$FIRST" = false ]; then
|
|
95
|
-
echo ","
|
|
96
|
-
fi
|
|
97
|
-
FIRST=false
|
|
98
|
-
|
|
99
|
-
cat <<EOF
|
|
100
|
-
{
|
|
101
|
-
"swarm_id": "$SWARM_ID",
|
|
102
|
-
"task_id": "$TASK_ID",
|
|
103
|
-
"mode": "$MODE",
|
|
104
|
-
"status": "$STATUS",
|
|
105
|
-
"max_agents": $MAX_AGENTS,
|
|
106
|
-
"loop3_agents": "$LOOP3_AGENTS",
|
|
107
|
-
"loop2_agents": "$LOOP2_AGENTS",
|
|
108
|
-
"product_owner": "$PRODUCT_OWNER",
|
|
109
|
-
"created_at": "$CREATED_AT",
|
|
110
|
-
"final_consensus": "$FINAL_CONSENSUS",
|
|
111
|
-
"total_iterations": "$TOTAL_ITERATIONS",
|
|
112
|
-
"completed_at": "$COMPLETED_AT"
|
|
113
|
-
}
|
|
114
|
-
EOF
|
|
115
|
-
else
|
|
116
|
-
echo "========================================="
|
|
117
|
-
echo "Swarm ID: $SWARM_ID"
|
|
118
|
-
echo "Task ID: $TASK_ID"
|
|
119
|
-
echo "Mode: $MODE"
|
|
120
|
-
echo "Status: $STATUS"
|
|
121
|
-
echo "Agents: $MAX_AGENTS total"
|
|
122
|
-
echo " Loop 3: $LOOP3_AGENTS"
|
|
123
|
-
echo " Loop 2: $LOOP2_AGENTS"
|
|
124
|
-
echo " Product Owner: $PRODUCT_OWNER"
|
|
125
|
-
echo "Created: $CREATED_AT"
|
|
126
|
-
|
|
127
|
-
if [ -n "$COMPLETED_AT" ]; then
|
|
128
|
-
echo "Completed: $COMPLETED_AT"
|
|
129
|
-
echo "Final Consensus: $FINAL_CONSENSUS"
|
|
130
|
-
echo "Total Iterations: $TOTAL_ITERATIONS"
|
|
131
|
-
fi
|
|
132
|
-
|
|
133
|
-
echo ""
|
|
134
|
-
fi
|
|
135
|
-
|
|
136
|
-
done <<< "$SWARM_KEYS"
|
|
137
|
-
|
|
138
|
-
# Close JSON array
|
|
139
|
-
if [ "$JSON_OUTPUT" = true ]; then
|
|
140
|
-
echo ""
|
|
141
|
-
echo "],"
|
|
142
|
-
|
|
143
|
-
# Count swarms
|
|
144
|
-
COUNT=$(echo "$SWARM_KEYS" | wc -l)
|
|
145
|
-
echo "\"count\": $COUNT"
|
|
146
|
-
echo "}"
|
|
147
|
-
fi
|