claude-flow-novice 2.14.13 → 2.14.15
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 +7 -51
- package/.claude/commands/cfn-loop-cli.md +50 -125
- package/.claude/skills/cfn-agent-selector/SKILL.md +2 -2
- package/.claude/skills/cfn-agent-selector/select-agents.sh +0 -45
- package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +6 -69
- package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -17
- package/README.md +2 -2
- package/claude-assets/agents/cfn-dev-team/CLAUDE.md +3 -3
- package/claude-assets/agents/cfn-dev-team/README.md +1 -1
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +2 -2
- package/claude-assets/agents/cfn-dev-team/developers/README.md +3 -3
- package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +1 -1
- package/claude-assets/agents/cfn-dev-team/test-agent.md +2 -2
- package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +7 -51
- package/claude-assets/commands/cfn-loop-cli.md +50 -125
- package/claude-assets/skills/cfn-agent-selector/SKILL.md +2 -2
- package/claude-assets/skills/cfn-agent-selector/select-agents.sh +0 -45
- package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +6 -69
- package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -17
- package/claude-assets/skills/cfn-multi-coordinator-planning/README.md +256 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/SKILL.md +62 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/map-dependencies-conflicts.sh +376 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-coordinator-resources.sh +258 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-multi-coordinator-work.sh +267 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/plan-risk-rollout.sh +350 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/test-multi-coordinator-planning.sh +338 -0
- package/claude-assets/skills/cfn-multi-coordinator-planning/validate-task-planning.sh +189 -0
- package/dist/agents/agent-loader.js +165 -146
- package/dist/agents/agent-loader.js.map +1 -1
- package/package.json +1 -1
- package/.claude/skills/cfn-agent-selector/SKILL.md.backup_before_replace +0 -91
- package/.claude/skills/cfn-loop-orchestration/helpers/validate-task-context.sh +0 -241
- package/.claude/skills/pre-edit-backup/backup.sh +0 -130
- package/.claude/skills/pre-edit-backup/cleanup.sh +0 -155
- package/.claude/skills/pre-edit-backup/restore.sh +0 -128
- package/.claude/skills/pre-edit-backup/revert-file.sh +0 -168
- package/claude-assets/agents/cfn-dev-team/CLAUDE.md.backup_before_replace +0 -1086
- package/claude-assets/agents/cfn-dev-team/README.md.backup_before_replace +0 -116
- package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md.backup_before_replace +0 -451
- package/claude-assets/agents/cfn-dev-team/developers/README.md.backup_before_replace +0 -69
- package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md.backup_before_replace +0 -465
- package/claude-assets/agents/cfn-dev-team/test-agent.md.backup_before_replace +0 -141
- package/claude-assets/skills/CFN-LOOP-VALIDATION.md +0 -202
- package/claude-assets/skills/REDIS-COORDINATION.md +0 -187
- package/claude-assets/skills/SKILL.md +0 -229
- package/claude-assets/skills/agent-discovery/agents-registry.json +0 -484
- package/claude-assets/skills/agent-name-validation/README.md +0 -28
- package/claude-assets/skills/agent-name-validation/SKILL.md +0 -168
- package/claude-assets/skills/agent-name-validation/validate-agent-names.sh +0 -47
- package/claude-assets/skills/cfn-agent-selector/SKILL.md.backup_before_replace +0 -91
- package/claude-assets/skills/cfn-loop-orchestration/helpers/validate-task-context.sh +0 -241
- package/claude-assets/skills/consensus-calculator.js +0 -45
- package/claude-assets/skills/evidence-chain.sql +0 -66
- package/claude-assets/skills/hook-pipeline/bash-dependency-checker.sh +0 -89
- package/claude-assets/skills/hook-pipeline/bash-pipe-safety.sh +0 -69
- package/claude-assets/skills/hook-pipeline/enforce-lf.sh +0 -36
- package/claude-assets/skills/hook-pipeline/js-promise-safety.sh +0 -110
- package/claude-assets/skills/hook-pipeline/python-async-safety.py +0 -124
- package/claude-assets/skills/hook-pipeline/python-import-checker.py +0 -114
- package/claude-assets/skills/hook-pipeline/python-subprocess-safety.py +0 -77
- package/claude-assets/skills/hook-pipeline/rust-command-safety.sh +0 -38
- package/claude-assets/skills/hook-pipeline/rust-dependency-checker.sh +0 -50
- package/claude-assets/skills/hook-pipeline/rust-future-safety.sh +0 -50
- package/claude-assets/skills/pre-edit-backup/backup.sh +0 -130
- package/claude-assets/skills/pre-edit-backup/cleanup.sh +0 -155
- package/claude-assets/skills/pre-edit-backup/restore.sh +0 -128
- package/claude-assets/skills/pre-edit-backup/revert-file.sh +0 -168
- package/claude-assets/skills/run-all-skill-tests.sh +0 -124
- package/claude-assets/skills/seo-orchestration/SKILL.md +0 -292
- package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh +0 -566
- package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh.backup +0 -755
- package/claude-assets/skills/seo-orchestration/validate-consensus.sh +0 -270
- package/claude-assets/skills/team-provider-routing/execute-agent.sh +0 -76
- package/claude-assets/skills/test-execution-coordinator-pattern.md +0 -228
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
|
|
7
|
+
# Configuration
|
|
8
|
+
DEFAULT_PHASE_TIMEOUT=1800 # 30 minutes per phase
|
|
9
|
+
DEFAULT_ROLLBACK_TIMEOUT=600 # 10 minutes for rollback
|
|
10
|
+
SUCCESS_THRESHOLD=0.85
|
|
11
|
+
|
|
12
|
+
# Colors
|
|
13
|
+
RED='\033[0;31m'
|
|
14
|
+
GREEN='\033[0;32m'
|
|
15
|
+
YELLOW='\033[1;33m'
|
|
16
|
+
BLUE='\033[0;34m'
|
|
17
|
+
NC='\033[0m'
|
|
18
|
+
|
|
19
|
+
log() {
|
|
20
|
+
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $1${NC}"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
warn() {
|
|
24
|
+
echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
error() {
|
|
28
|
+
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}"
|
|
29
|
+
exit 1
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
info() {
|
|
33
|
+
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $1${NC}"
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
calculate_zone_complexity() {
|
|
37
|
+
local zone_data="$1"
|
|
38
|
+
local complexity_score=0
|
|
39
|
+
|
|
40
|
+
# Base complexity from agent count
|
|
41
|
+
local agent_count
|
|
42
|
+
agent_count=$(echo "$zone_data" | jq -r '.agent_types | length // 0')
|
|
43
|
+
complexity_score=$((complexity_score + agent_count * 10))
|
|
44
|
+
|
|
45
|
+
# Complexity from deliverable count
|
|
46
|
+
local deliverable_count
|
|
47
|
+
deliverable_count=$(echo "$zone_data" | jq -r '.deliverables | length // 0')
|
|
48
|
+
complexity_score=$((complexity_score + deliverable_count * 5))
|
|
49
|
+
|
|
50
|
+
# Complexity from task description length (longer = more complex)
|
|
51
|
+
local task_description
|
|
52
|
+
task_description=$(echo "$zone_data" | jq -r '.task_description // ""')
|
|
53
|
+
local description_length=${#task_description}
|
|
54
|
+
if [[ $description_length -gt 100 ]]; then
|
|
55
|
+
complexity_score=$((complexity_score + 15))
|
|
56
|
+
elif [[ $description_length -gt 50 ]]; then
|
|
57
|
+
complexity_score=$((complexity_score + 10))
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# Complexity from acceptance criteria
|
|
61
|
+
local acceptance_count
|
|
62
|
+
acceptance_count=$(echo "$zone_data" | jq -r '.acceptance_criteria | length // 0')
|
|
63
|
+
complexity_score=$((complexity_score + acceptance_count * 8))
|
|
64
|
+
|
|
65
|
+
# Risk factors
|
|
66
|
+
if echo "$zone_data" | jq -e '.risk_factors' >/dev/null 2>&1; then
|
|
67
|
+
local risk_factors
|
|
68
|
+
risk_factors=$(echo "$zone_data" | jq -r '.risk_factors | length // 0')
|
|
69
|
+
complexity_score=$((complexity_score + risk_factors * 20))
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
echo "$complexity_score"
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
rank_zones_by_complexity() {
|
|
76
|
+
local zone_config="$1"
|
|
77
|
+
local zones_with_complexity="[]"
|
|
78
|
+
|
|
79
|
+
local i=0
|
|
80
|
+
while IFS= read -r zone_name; do
|
|
81
|
+
local zone_data
|
|
82
|
+
zone_data=$(echo "$zone_config" | jq -r ".zones[$i]")
|
|
83
|
+
|
|
84
|
+
local complexity
|
|
85
|
+
complexity=$(calculate_zone_complexity "$zone_data")
|
|
86
|
+
|
|
87
|
+
local zone_entry="{
|
|
88
|
+
\"name\": \"$zone_name\",
|
|
89
|
+
\"complexity_score\": $complexity,
|
|
90
|
+
\"data\": $zone_data
|
|
91
|
+
}"
|
|
92
|
+
|
|
93
|
+
zones_with_complexity=$(echo "$zones_with_complexity" | jq ". + [$zone_entry]")
|
|
94
|
+
((i++))
|
|
95
|
+
done < <(echo "$zone_config" | jq -r '.zones[].name')
|
|
96
|
+
|
|
97
|
+
# Sort by complexity score (ascending)
|
|
98
|
+
echo "$zones_with_complexity" | jq 'sort_by(.complexity_score)'
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
create_rollout_phases() {
|
|
102
|
+
local ranked_zones="$1"
|
|
103
|
+
local max_zones_per_phase="${2:-2}"
|
|
104
|
+
|
|
105
|
+
local rollout_phases="[]"
|
|
106
|
+
local phase_number=1
|
|
107
|
+
local i=0
|
|
108
|
+
|
|
109
|
+
while true; do
|
|
110
|
+
local phase_zones="[]"
|
|
111
|
+
local zones_in_phase=0
|
|
112
|
+
|
|
113
|
+
while [[ $zones_in_phase -lt $max_zones_per_phase ]]; do
|
|
114
|
+
local zone_data
|
|
115
|
+
zone_data=$(echo "$ranked_zones" | jq ".[$i] // empty")
|
|
116
|
+
|
|
117
|
+
if [[ "$zone_data" == "null" || "$zone_data" == "" ]]; then
|
|
118
|
+
break 2
|
|
119
|
+
fi
|
|
120
|
+
|
|
121
|
+
phase_zones=$(echo "$phase_zones" | jq ". + [$zone_data]")
|
|
122
|
+
((i++))
|
|
123
|
+
((zones_in_phase++))
|
|
124
|
+
done
|
|
125
|
+
|
|
126
|
+
if [[ $zones_in_phase -eq 0 ]]; then
|
|
127
|
+
break
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
local phase_entry="{
|
|
131
|
+
\"phase\": $phase_number,
|
|
132
|
+
\"zones\": $phase_zones,
|
|
133
|
+
\"max_execution_time\": $DEFAULT_PHASE_TIMEOUT,
|
|
134
|
+
\"success_threshold\": $SUCCESS_THRESHOLD,
|
|
135
|
+
\"rollback_timeout\": $DEFAULT_ROLLBACK_TIMEOUT
|
|
136
|
+
}"
|
|
137
|
+
|
|
138
|
+
rollout_phases=$(echo "$rollout_phases" | jq ". + [$phase_entry]")
|
|
139
|
+
((phase_number++))
|
|
140
|
+
done
|
|
141
|
+
|
|
142
|
+
echo "$rollout_phases"
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
create_success_criteria() {
|
|
146
|
+
local rollout_phases="$1"
|
|
147
|
+
|
|
148
|
+
local success_criteria="[]"
|
|
149
|
+
|
|
150
|
+
local phase_count
|
|
151
|
+
phase_count=$(echo "$rollout_phases" | jq 'length')
|
|
152
|
+
|
|
153
|
+
for ((i=0; i<phase_count; i++)); do
|
|
154
|
+
local phase_data
|
|
155
|
+
phase_data=$(echo "$rollout_phases" | jq ".[$i]")
|
|
156
|
+
|
|
157
|
+
local zone_names
|
|
158
|
+
zone_names=$(echo "$phase_data" | jq -r '.zones[].name')
|
|
159
|
+
|
|
160
|
+
local phase_criteria="{
|
|
161
|
+
\"phase\": $((i + 1)),
|
|
162
|
+
\"required_success_zones\": [],
|
|
163
|
+
\"minimum_confidence_threshold\": $SUCCESS_THRESHOLD,
|
|
164
|
+
\"all_zones_must_complete\": true,
|
|
165
|
+
\"validation_checks\": [
|
|
166
|
+
\"redis_namespace_isolation\",
|
|
167
|
+
\"agent_completion_signaling\",
|
|
168
|
+
\"coordinator_lifecycle_management\",
|
|
169
|
+
\"deliverable_verification\"
|
|
170
|
+
]
|
|
171
|
+
}"
|
|
172
|
+
|
|
173
|
+
# Add required zone names
|
|
174
|
+
local zones_array="[]"
|
|
175
|
+
while IFS= read -r zone_name; do
|
|
176
|
+
zones_array=$(echo "$zones_array" | jq ". + [\"$zone_name\"]")
|
|
177
|
+
done <<< "$zone_names"
|
|
178
|
+
|
|
179
|
+
phase_criteria=$(echo "$phase_criteria" | jq ".required_success_zones = $zones_array")
|
|
180
|
+
success_criteria=$(echo "$success_criteria" | jq ". + [$phase_criteria]")
|
|
181
|
+
done
|
|
182
|
+
|
|
183
|
+
echo "$success_criteria"
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
create_rollback_triggers() {
|
|
187
|
+
local rollout_phases="$1"
|
|
188
|
+
|
|
189
|
+
local rollback_triggers="[]"
|
|
190
|
+
|
|
191
|
+
local phase_count
|
|
192
|
+
phase_count=$(echo "$rollout_phases" | jq 'length')
|
|
193
|
+
|
|
194
|
+
# Global rollback triggers
|
|
195
|
+
local global_triggers="[
|
|
196
|
+
{
|
|
197
|
+
\"trigger\": \"any_zone_critical_failure\",
|
|
198
|
+
\"action\": \"immediate_rollback_all\",
|
|
199
|
+
\"description\": \"Critical system failure in any zone\"
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
\"trigger\": \"redis_namespace_corruption\",
|
|
203
|
+
\"action\": \"emergency_stop_and_cleanup\",
|
|
204
|
+
\"description\": \"Redis namespace isolation breach\"
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
\"trigger\": \"resource_exhaustion\",
|
|
208
|
+
\"action\": \"scale_back_and_retry\",
|
|
209
|
+
\"description\": \"System resources exhausted\"
|
|
210
|
+
}
|
|
211
|
+
]"
|
|
212
|
+
|
|
213
|
+
# Phase-specific rollback triggers
|
|
214
|
+
local i=0
|
|
215
|
+
for ((i=0; i<phase_count; i++)); do
|
|
216
|
+
local phase_zones
|
|
217
|
+
phase_zones=$(echo "$rollout_phases" | jq -r ".[$i].zones[].name")
|
|
218
|
+
|
|
219
|
+
while IFS= read -r zone_name; do
|
|
220
|
+
local trigger="{
|
|
221
|
+
\"trigger\": \"zone_${zone_name}_completion_failure\",
|
|
222
|
+
\"phase\": $((i + 1)),
|
|
223
|
+
\"action\": \"rollback_current_phase\",
|
|
224
|
+
\"description\": \"Zone $zone_name failed to complete in phase $((i + 1))\"
|
|
225
|
+
}"
|
|
226
|
+
|
|
227
|
+
rollback_triggers=$(echo "$rollback_triggers" | jq ". + [$trigger]")
|
|
228
|
+
done <<< "$phase_zones"
|
|
229
|
+
done
|
|
230
|
+
|
|
231
|
+
# Combine global and specific triggers
|
|
232
|
+
echo "$global_triggers" | jq ". + $rollback_triggers"
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
generate_rollout_plan() {
|
|
236
|
+
local zone_config="$1"
|
|
237
|
+
local max_zones_per_phase="${2:-2}"
|
|
238
|
+
|
|
239
|
+
info "Analyzing zone complexity for rollout planning"
|
|
240
|
+
|
|
241
|
+
# Rank zones by complexity
|
|
242
|
+
local ranked_zones
|
|
243
|
+
ranked_zones=$(rank_zones_by_complexity "$zone_config")
|
|
244
|
+
|
|
245
|
+
# Create rollout phases
|
|
246
|
+
local rollout_phases
|
|
247
|
+
rollout_phases=$(create_rollout_phases "$ranked_zones" "$max_zones_per_phase")
|
|
248
|
+
|
|
249
|
+
# Create success criteria
|
|
250
|
+
local success_criteria
|
|
251
|
+
success_criteria=$(create_success_criteria "$rollout_phases")
|
|
252
|
+
|
|
253
|
+
# Create rollback triggers
|
|
254
|
+
local rollback_triggers
|
|
255
|
+
rollback_triggers=$(create_rollback_triggers "$rollout_phases")
|
|
256
|
+
|
|
257
|
+
# Generate complete rollout plan
|
|
258
|
+
local rollout_plan="{
|
|
259
|
+
\"timestamp\": $(date '+%s'),
|
|
260
|
+
\"total_zones\": $(echo "$zone_config" | jq '.zones | length'),
|
|
261
|
+
\"max_zones_per_phase\": $max_zones_per_phase,
|
|
262
|
+
\"phases\": $rollout_phases,
|
|
263
|
+
\"success_criteria\": $success_criteria,
|
|
264
|
+
\"rollback_triggers\": $rollback_triggers,
|
|
265
|
+
\"execution_strategy\": {
|
|
266
|
+
\"type\": \"graduated_rollout\",
|
|
267
|
+
\"monitoring_level\": \"enhanced\",
|
|
268
|
+
\"auto_rollback_enabled\": true,
|
|
269
|
+
\"manual_approval_required\": false
|
|
270
|
+
}
|
|
271
|
+
}"
|
|
272
|
+
|
|
273
|
+
echo "$rollout_plan"
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
display_rollout_summary() {
|
|
277
|
+
local rollout_plan="$1"
|
|
278
|
+
|
|
279
|
+
echo
|
|
280
|
+
info "=== Risk-Based Rollout Plan ==="
|
|
281
|
+
echo "Total zones: $(echo "$rollout_plan" | jq -r '.total_zones')"
|
|
282
|
+
echo "Maximum zones per phase: $(echo "$rollout_plan" | jq -r '.max_zones_per_phase')"
|
|
283
|
+
echo
|
|
284
|
+
|
|
285
|
+
local phase_count
|
|
286
|
+
phase_count=$(echo "$rollout_plan" | jq '.phases | length')
|
|
287
|
+
|
|
288
|
+
echo "Rollout Phases:"
|
|
289
|
+
for ((i=0; i<phase_count; i++)); do
|
|
290
|
+
local phase_data
|
|
291
|
+
phase_data=$(echo "$rollout_plan" | jq ".phases[$i]")
|
|
292
|
+
local phase_number=$((i + 1))
|
|
293
|
+
local zone_count
|
|
294
|
+
zone_count=$(echo "$phase_data" | jq '.zones | length')
|
|
295
|
+
local zone_names
|
|
296
|
+
zone_names=$(echo "$phase_data" | jq -r '.zones[].name' | tr '\n' ', ' | sed 's/,$//')
|
|
297
|
+
|
|
298
|
+
echo " Phase $phase_number: $zone_names ($zone_count zones)"
|
|
299
|
+
done
|
|
300
|
+
echo
|
|
301
|
+
|
|
302
|
+
echo "Success Criteria:"
|
|
303
|
+
echo " - Minimum confidence threshold: $(echo "$rollout_plan" | jq -r '.success_criteria[0].minimum_confidence_threshold')"
|
|
304
|
+
echo " - All zones must complete: $(echo "$rollout_plan" | jq -r '.success_criteria[0].all_zones_must_complete')"
|
|
305
|
+
echo " - Validation checks: $(echo "$rollout_plan" | jq -r '.success_criteria[0].validation_checks | length') checks"
|
|
306
|
+
echo
|
|
307
|
+
|
|
308
|
+
echo "Rollback Triggers:"
|
|
309
|
+
echo " - Global triggers: 3"
|
|
310
|
+
echo " - Phase-specific triggers: $(echo "$rollout_plan" | jq '.rollback_triggers | length - 3')"
|
|
311
|
+
echo
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
main() {
|
|
315
|
+
local config_file="$1"
|
|
316
|
+
local max_zones_per_phase="${2:-2}"
|
|
317
|
+
|
|
318
|
+
if [[ -z "$config_file" ]]; then
|
|
319
|
+
error "Usage: $0 <zone-config-file> [max-zones-per-phase]"
|
|
320
|
+
fi
|
|
321
|
+
|
|
322
|
+
if [[ ! -f "$config_file" ]]; then
|
|
323
|
+
error "Configuration file not found: $config_file"
|
|
324
|
+
fi
|
|
325
|
+
|
|
326
|
+
log "Starting risk-based rollout planning for: $config_file"
|
|
327
|
+
|
|
328
|
+
# Read configuration
|
|
329
|
+
local zone_config
|
|
330
|
+
if ! zone_config=$(jq . "$config_file" 2>/dev/null); then
|
|
331
|
+
error "Invalid JSON in configuration file: $config_file"
|
|
332
|
+
fi
|
|
333
|
+
|
|
334
|
+
# Generate rollout plan
|
|
335
|
+
local rollout_plan
|
|
336
|
+
rollout_plan=$(generate_rollout_plan "$zone_config" "$max_zones_per_phase")
|
|
337
|
+
|
|
338
|
+
# Save rollout plan
|
|
339
|
+
local output_file="/tmp/rollout-plan-$(date '+%s').json"
|
|
340
|
+
echo "$rollout_plan" > "$output_file"
|
|
341
|
+
|
|
342
|
+
log "✅ Risk-based rollout planning completed"
|
|
343
|
+
log "Rollout plan saved to: $output_file"
|
|
344
|
+
|
|
345
|
+
# Display summary
|
|
346
|
+
display_rollout_summary "$rollout_plan"
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
# Execute main function with all arguments
|
|
350
|
+
main "$@"
|
package/claude-assets/skills/cfn-multi-coordinator-planning/test-multi-coordinator-planning.sh
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
|
|
7
|
+
# Colors
|
|
8
|
+
RED='\033[0;31m'
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
YELLOW='\033[1;33m'
|
|
11
|
+
BLUE='\033[0;34m'
|
|
12
|
+
NC='\033[0m'
|
|
13
|
+
|
|
14
|
+
log() {
|
|
15
|
+
echo -e "${GREEN}[TEST:$(date '+%H:%M:%S')] $1${NC}"
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
warn() {
|
|
19
|
+
echo -e "${YELLOW}[TEST:$(date '+%H:%M:%S')] WARNING: $1${NC}"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
error() {
|
|
23
|
+
echo -e "${RED}[TEST:$(date '+%H:%M:%S')] ERROR: $1${NC}"
|
|
24
|
+
return 1
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
info() {
|
|
28
|
+
echo -e "${BLUE}[TEST:$(date '+%H:%M:%S')] INFO: $1${NC}"
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
# Test counters
|
|
32
|
+
TESTS_RUN=0
|
|
33
|
+
TESTS_PASSED=0
|
|
34
|
+
TESTS_FAILED=0
|
|
35
|
+
|
|
36
|
+
run_test() {
|
|
37
|
+
local test_name="$1"
|
|
38
|
+
local test_command="$2"
|
|
39
|
+
|
|
40
|
+
((TESTS_RUN++))
|
|
41
|
+
log "Running test: $test_name"
|
|
42
|
+
|
|
43
|
+
if eval "$test_command"; then
|
|
44
|
+
((TESTS_PASSED++))
|
|
45
|
+
log "✓ PASSED: $test_name"
|
|
46
|
+
else
|
|
47
|
+
((TESTS_FAILED++))
|
|
48
|
+
error "✗ FAILED: $test_name"
|
|
49
|
+
fi
|
|
50
|
+
echo
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
create_test_zone_config() {
|
|
54
|
+
local test_config="/tmp/test-zones-config-$(date '+%s').json"
|
|
55
|
+
|
|
56
|
+
cat > "$test_config" << 'EOF'
|
|
57
|
+
{
|
|
58
|
+
"zones": [
|
|
59
|
+
{
|
|
60
|
+
"name": "zone-alpha",
|
|
61
|
+
"task_description": "Implement React authentication component with TypeScript interfaces and comprehensive error handling",
|
|
62
|
+
"deliverables": [
|
|
63
|
+
"src/components/AuthForm.tsx",
|
|
64
|
+
"src/types/auth.ts",
|
|
65
|
+
"src/hooks/useAuth.ts",
|
|
66
|
+
"src/services/authService.ts",
|
|
67
|
+
"tests/auth.test.ts"
|
|
68
|
+
],
|
|
69
|
+
"agent_types": ["react-frontend-engineer", "reviewer", "tester"],
|
|
70
|
+
"acceptance_criteria": [
|
|
71
|
+
"Form validates user input",
|
|
72
|
+
"Authentication state managed globally",
|
|
73
|
+
"Error handling for network failures",
|
|
74
|
+
"Component tested with >80% coverage"
|
|
75
|
+
],
|
|
76
|
+
"in_scope": ["React components", "TypeScript interfaces", "State management"],
|
|
77
|
+
"out_of_scope": ["Backend authentication", "Database integration"],
|
|
78
|
+
"directory": "src/auth",
|
|
79
|
+
"risk_factors": ["external_dependencies", "complex_state_management"]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "zone-beta",
|
|
83
|
+
"task_description": "Create REST API endpoints for user management with comprehensive validation",
|
|
84
|
+
"deliverables": [
|
|
85
|
+
"src/api/users.ts",
|
|
86
|
+
"src/middleware/validation.ts",
|
|
87
|
+
"src/types/user.ts",
|
|
88
|
+
"tests/users.test.ts"
|
|
89
|
+
],
|
|
90
|
+
"agent_types": ["backend-developer", "reviewer"],
|
|
91
|
+
"acceptance_criteria": [
|
|
92
|
+
"CRUD operations implemented",
|
|
93
|
+
"Input validation on all endpoints",
|
|
94
|
+
"Error responses standardized",
|
|
95
|
+
"API documentation generated"
|
|
96
|
+
],
|
|
97
|
+
"in_scope": ["REST API", "Validation middleware", "TypeScript types"],
|
|
98
|
+
"out_of_scope": ["Database queries", "Authentication"],
|
|
99
|
+
"directory": "src/api"
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
}
|
|
103
|
+
EOF
|
|
104
|
+
|
|
105
|
+
echo "$test_config"
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
test_task_validation() {
|
|
109
|
+
local test_config
|
|
110
|
+
test_config=$(create_test_zone_config)
|
|
111
|
+
|
|
112
|
+
# Test valid configuration
|
|
113
|
+
if "$SCRIPT_DIR/validate-task-planning.sh" "$test_config" >/dev/null 2>&1; then
|
|
114
|
+
rm -f "$test_config" "/tmp/validated-task-$(basename "$test_config")"
|
|
115
|
+
return 0
|
|
116
|
+
else
|
|
117
|
+
rm -f "$test_config" "/tmp/validated-task-$(basename "$test_config")"
|
|
118
|
+
return 1
|
|
119
|
+
fi
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
test_task_validation_failures() {
|
|
123
|
+
# Test invalid configuration (generic task)
|
|
124
|
+
local invalid_config="/tmp/invalid-zones-config-$(date '+%s').json"
|
|
125
|
+
|
|
126
|
+
cat > "$invalid_config" << 'EOF'
|
|
127
|
+
{
|
|
128
|
+
"zones": [
|
|
129
|
+
{
|
|
130
|
+
"name": "zone-bad",
|
|
131
|
+
"task_description": "CFN Loop implementation",
|
|
132
|
+
"deliverables": ["implementation"],
|
|
133
|
+
"agent_types": ["backend-developer"]
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
EOF
|
|
138
|
+
|
|
139
|
+
local result=0
|
|
140
|
+
if "$SCRIPT_DIR/validate-task-planning.sh" "$invalid_config" >/dev/null 2>&1; then
|
|
141
|
+
result=1 # Should have failed
|
|
142
|
+
else
|
|
143
|
+
result=0 # Correctly failed
|
|
144
|
+
fi
|
|
145
|
+
|
|
146
|
+
rm -f "$invalid_config"
|
|
147
|
+
return $result
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
test_resource_planning() {
|
|
151
|
+
local test_config
|
|
152
|
+
test_config=$(create_test_zone_config)
|
|
153
|
+
|
|
154
|
+
# Test resource planning
|
|
155
|
+
if "$SCRIPT_DIR/plan-coordinator-resources.sh" "$test_config" >/dev/null 2>&1; then
|
|
156
|
+
# Check if resource plan file was created
|
|
157
|
+
local plan_files
|
|
158
|
+
plan_files=$(find /tmp -name "coordinator-resource-plan-*.json" -type f | wc -l)
|
|
159
|
+
rm -f "$test_config"
|
|
160
|
+
[[ $plan_files -gt 0 ]]
|
|
161
|
+
else
|
|
162
|
+
rm -f "$test_config"
|
|
163
|
+
return 1
|
|
164
|
+
fi
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
test_dependency_analysis() {
|
|
168
|
+
local test_config
|
|
169
|
+
test_config=$(create_test_zone_config)
|
|
170
|
+
|
|
171
|
+
# Test dependency analysis
|
|
172
|
+
if "$SCRIPT_DIR/map-dependencies-conflicts.sh" "$test_config" >/dev/null 2>&1; then
|
|
173
|
+
# Check if analysis file was created
|
|
174
|
+
local analysis_files
|
|
175
|
+
analysis_files=$(find /tmp -name "dependency-conflict-analysis-*.json" -type f | wc -l)
|
|
176
|
+
rm -f "$test_config"
|
|
177
|
+
[[ $analysis_files -gt 0 ]]
|
|
178
|
+
else
|
|
179
|
+
rm -f "$test_config"
|
|
180
|
+
return 1
|
|
181
|
+
fi
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
test_rollout_planning() {
|
|
185
|
+
local test_config
|
|
186
|
+
test_config=$(create_test_zone_config)
|
|
187
|
+
|
|
188
|
+
# Test rollout planning
|
|
189
|
+
if "$SCRIPT_DIR/plan-risk-rollout.sh" "$test_config" 2 >/dev/null; then
|
|
190
|
+
# Check if rollout plan file was created
|
|
191
|
+
local rollout_files
|
|
192
|
+
rollout_files=$(find /tmp -name "rollout-plan-*.json" -type f | wc -l)
|
|
193
|
+
rm -f "$test_config"
|
|
194
|
+
[[ $rollout_files -gt 0 ]]
|
|
195
|
+
else
|
|
196
|
+
rm -f "$test_config"
|
|
197
|
+
return 1
|
|
198
|
+
fi
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
test_end_to_end_planning() {
|
|
202
|
+
local test_config
|
|
203
|
+
test_config=$(create_test_zone_config)
|
|
204
|
+
|
|
205
|
+
# Test end-to-end planning
|
|
206
|
+
if "$SCRIPT_DIR/plan-multi-coordinator-work.sh" "$test_config" --dry-run >/dev/null 2>&1; then
|
|
207
|
+
# Check if summary file was created
|
|
208
|
+
local summary_files
|
|
209
|
+
summary_files=$(find /tmp -name "multi-coordinator-planning-summary-*.json" -type f | wc -l)
|
|
210
|
+
rm -f "$test_config"
|
|
211
|
+
[[ $summary_files -gt 0 ]]
|
|
212
|
+
else
|
|
213
|
+
rm -f "$test_config"
|
|
214
|
+
return 1
|
|
215
|
+
fi
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
test_redis_connectivity() {
|
|
219
|
+
# Test Redis connectivity (required for namespace planning)
|
|
220
|
+
if redis-cli ping >/dev/null 2>&1; then
|
|
221
|
+
return 0
|
|
222
|
+
else
|
|
223
|
+
warn "Redis not available - skipping Redis-dependent tests"
|
|
224
|
+
return 0 # Don't fail test suite, just warn
|
|
225
|
+
fi
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
test_jq_availability() {
|
|
229
|
+
# Test jq availability (required for JSON processing)
|
|
230
|
+
if command -v jq >/dev/null 2>&1; then
|
|
231
|
+
return 0
|
|
232
|
+
else
|
|
233
|
+
return 1
|
|
234
|
+
fi
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
test_zone_config_json_validation() {
|
|
238
|
+
local test_config
|
|
239
|
+
test_config=$(create_test_zone_config)
|
|
240
|
+
|
|
241
|
+
# Test if the generated config is valid JSON
|
|
242
|
+
if jq . "$test_config" >/dev/null 2>&1; then
|
|
243
|
+
rm -f "$test_config"
|
|
244
|
+
return 0
|
|
245
|
+
else
|
|
246
|
+
rm -f "$test_config"
|
|
247
|
+
return 1
|
|
248
|
+
fi
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
test_complexity_scoring() {
|
|
252
|
+
# Test complexity scoring algorithm
|
|
253
|
+
local simple_zone="/tmp/simple-zone-$(date '+%s').json"
|
|
254
|
+
cat > "$simple_zone" << 'EOF'
|
|
255
|
+
{
|
|
256
|
+
"zones": [
|
|
257
|
+
{
|
|
258
|
+
"name": "simple-zone",
|
|
259
|
+
"task_description": "Simple task",
|
|
260
|
+
"deliverables": ["file1.ts"],
|
|
261
|
+
"agent_types": ["developer"]
|
|
262
|
+
}
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
EOF
|
|
266
|
+
|
|
267
|
+
local complex_zone="/tmp/complex-zone-$(date '+%s').json"
|
|
268
|
+
cat > "$complex_zone" << 'EOF'
|
|
269
|
+
{
|
|
270
|
+
"zones": [
|
|
271
|
+
{
|
|
272
|
+
"name": "complex-zone",
|
|
273
|
+
"task_description": "This is a very complex task that requires multiple implementation steps and comprehensive testing strategies with many different components working together",
|
|
274
|
+
"deliverables": ["file1.ts", "file2.ts", "file3.ts", "file4.ts", "file5.ts"],
|
|
275
|
+
"agent_types": ["developer", "reviewer", "tester", "architect"],
|
|
276
|
+
"acceptance_criteria": ["criteria1", "criteria2", "criteria3"],
|
|
277
|
+
"risk_factors": ["risk1", "risk2"]
|
|
278
|
+
}
|
|
279
|
+
]
|
|
280
|
+
}
|
|
281
|
+
EOF
|
|
282
|
+
|
|
283
|
+
# Both should be valid JSON
|
|
284
|
+
local result=0
|
|
285
|
+
if ! jq . "$simple_zone" >/dev/null 2>&1 || ! jq . "$complex_zone" >/dev/null 2>&1; then
|
|
286
|
+
result=1
|
|
287
|
+
fi
|
|
288
|
+
|
|
289
|
+
rm -f "$simple_zone" "$complex_zone"
|
|
290
|
+
return $result
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
cleanup_test_artifacts() {
|
|
294
|
+
# Clean up any test files
|
|
295
|
+
find /tmp -name "test-*.json" -type f -delete 2>/dev/null || true
|
|
296
|
+
find /tmp -name "coordinator-resource-plan-*.json" -type f -delete 2>/dev/null || true
|
|
297
|
+
find /tmp -name "dependency-conflict-analysis-*.json" -type f -delete 2>/dev/null || true
|
|
298
|
+
find /tmp -name "rollout-plan-*.json" -type f -delete 2>/dev/null || true
|
|
299
|
+
find /tmp -name "multi-coordinator-planning-summary-*.json" -type f -delete 2>/dev/null || true
|
|
300
|
+
find /tmp -name "validated-task-*" -type f -delete 2>/dev/null || true
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
main() {
|
|
304
|
+
log "Starting multi-coordinator planning test suite"
|
|
305
|
+
|
|
306
|
+
# Setup cleanup trap
|
|
307
|
+
trap cleanup_test_artifacts EXIT
|
|
308
|
+
|
|
309
|
+
# Run individual tests
|
|
310
|
+
run_test "jq availability" "test_jq_availability"
|
|
311
|
+
run_test "Redis connectivity" "test_redis_connectivity"
|
|
312
|
+
run_test "Zone config JSON validation" "test_zone_config_json_validation"
|
|
313
|
+
run_test "Task validation (valid config)" "test_task_validation"
|
|
314
|
+
run_test "Task validation (invalid config rejection)" "test_task_validation_failures"
|
|
315
|
+
run_test "Resource planning" "test_resource_planning"
|
|
316
|
+
run_test "Dependency analysis" "test_dependency_analysis"
|
|
317
|
+
run_test "Rollout planning" "test_rollout_planning"
|
|
318
|
+
run_test "Complexity scoring" "test_complexity_scoring"
|
|
319
|
+
run_test "End-to-end planning" "test_end_to_end_planning"
|
|
320
|
+
|
|
321
|
+
# Display test results
|
|
322
|
+
echo
|
|
323
|
+
info "=== Test Results ==="
|
|
324
|
+
echo "Tests run: $TESTS_RUN"
|
|
325
|
+
echo "Tests passed: $TESTS_PASSED"
|
|
326
|
+
echo "Tests failed: $TESTS_FAILED"
|
|
327
|
+
|
|
328
|
+
if [[ $TESTS_FAILED -eq 0 ]]; then
|
|
329
|
+
log "✅ All tests passed successfully!"
|
|
330
|
+
exit 0
|
|
331
|
+
else
|
|
332
|
+
error "❌ $TESTS_FAILED test(s) failed"
|
|
333
|
+
exit 1
|
|
334
|
+
fi
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
# Execute main function
|
|
338
|
+
main "$@"
|