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.
Files changed (74) hide show
  1. package/.claude/commands/CFN_LOOP_TASK_MODE.md +7 -51
  2. package/.claude/commands/cfn-loop-cli.md +50 -125
  3. package/.claude/skills/cfn-agent-selector/SKILL.md +2 -2
  4. package/.claude/skills/cfn-agent-selector/select-agents.sh +0 -45
  5. package/.claude/skills/cfn-loop-orchestration/helpers/context-injection.sh +6 -69
  6. package/.claude/skills/cfn-loop-orchestration/orchestrate.sh +0 -17
  7. package/README.md +2 -2
  8. package/claude-assets/agents/cfn-dev-team/CLAUDE.md +3 -3
  9. package/claude-assets/agents/cfn-dev-team/README.md +1 -1
  10. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md +2 -2
  11. package/claude-assets/agents/cfn-dev-team/developers/README.md +3 -3
  12. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md +1 -1
  13. package/claude-assets/agents/cfn-dev-team/test-agent.md +2 -2
  14. package/claude-assets/commands/CFN_LOOP_TASK_MODE.md +7 -51
  15. package/claude-assets/commands/cfn-loop-cli.md +50 -125
  16. package/claude-assets/skills/cfn-agent-selector/SKILL.md +2 -2
  17. package/claude-assets/skills/cfn-agent-selector/select-agents.sh +0 -45
  18. package/claude-assets/skills/cfn-loop-orchestration/helpers/context-injection.sh +6 -69
  19. package/claude-assets/skills/cfn-loop-orchestration/orchestrate.sh +0 -17
  20. package/claude-assets/skills/cfn-multi-coordinator-planning/README.md +256 -0
  21. package/claude-assets/skills/cfn-multi-coordinator-planning/SKILL.md +62 -0
  22. package/claude-assets/skills/cfn-multi-coordinator-planning/map-dependencies-conflicts.sh +376 -0
  23. package/claude-assets/skills/cfn-multi-coordinator-planning/plan-coordinator-resources.sh +258 -0
  24. package/claude-assets/skills/cfn-multi-coordinator-planning/plan-multi-coordinator-work.sh +267 -0
  25. package/claude-assets/skills/cfn-multi-coordinator-planning/plan-risk-rollout.sh +350 -0
  26. package/claude-assets/skills/cfn-multi-coordinator-planning/test-multi-coordinator-planning.sh +338 -0
  27. package/claude-assets/skills/cfn-multi-coordinator-planning/validate-task-planning.sh +189 -0
  28. package/dist/agents/agent-loader.js +165 -146
  29. package/dist/agents/agent-loader.js.map +1 -1
  30. package/package.json +1 -1
  31. package/.claude/skills/cfn-agent-selector/SKILL.md.backup_before_replace +0 -91
  32. package/.claude/skills/cfn-loop-orchestration/helpers/validate-task-context.sh +0 -241
  33. package/.claude/skills/pre-edit-backup/backup.sh +0 -130
  34. package/.claude/skills/pre-edit-backup/cleanup.sh +0 -155
  35. package/.claude/skills/pre-edit-backup/restore.sh +0 -128
  36. package/.claude/skills/pre-edit-backup/revert-file.sh +0 -168
  37. package/claude-assets/agents/cfn-dev-team/CLAUDE.md.backup_before_replace +0 -1086
  38. package/claude-assets/agents/cfn-dev-team/README.md.backup_before_replace +0 -116
  39. package/claude-assets/agents/cfn-dev-team/coordinators/cfn-v3-coordinator.md.backup_before_replace +0 -451
  40. package/claude-assets/agents/cfn-dev-team/developers/README.md.backup_before_replace +0 -69
  41. package/claude-assets/agents/cfn-dev-team/documentation/agent-type-guidelines.md.backup_before_replace +0 -465
  42. package/claude-assets/agents/cfn-dev-team/test-agent.md.backup_before_replace +0 -141
  43. package/claude-assets/skills/CFN-LOOP-VALIDATION.md +0 -202
  44. package/claude-assets/skills/REDIS-COORDINATION.md +0 -187
  45. package/claude-assets/skills/SKILL.md +0 -229
  46. package/claude-assets/skills/agent-discovery/agents-registry.json +0 -484
  47. package/claude-assets/skills/agent-name-validation/README.md +0 -28
  48. package/claude-assets/skills/agent-name-validation/SKILL.md +0 -168
  49. package/claude-assets/skills/agent-name-validation/validate-agent-names.sh +0 -47
  50. package/claude-assets/skills/cfn-agent-selector/SKILL.md.backup_before_replace +0 -91
  51. package/claude-assets/skills/cfn-loop-orchestration/helpers/validate-task-context.sh +0 -241
  52. package/claude-assets/skills/consensus-calculator.js +0 -45
  53. package/claude-assets/skills/evidence-chain.sql +0 -66
  54. package/claude-assets/skills/hook-pipeline/bash-dependency-checker.sh +0 -89
  55. package/claude-assets/skills/hook-pipeline/bash-pipe-safety.sh +0 -69
  56. package/claude-assets/skills/hook-pipeline/enforce-lf.sh +0 -36
  57. package/claude-assets/skills/hook-pipeline/js-promise-safety.sh +0 -110
  58. package/claude-assets/skills/hook-pipeline/python-async-safety.py +0 -124
  59. package/claude-assets/skills/hook-pipeline/python-import-checker.py +0 -114
  60. package/claude-assets/skills/hook-pipeline/python-subprocess-safety.py +0 -77
  61. package/claude-assets/skills/hook-pipeline/rust-command-safety.sh +0 -38
  62. package/claude-assets/skills/hook-pipeline/rust-dependency-checker.sh +0 -50
  63. package/claude-assets/skills/hook-pipeline/rust-future-safety.sh +0 -50
  64. package/claude-assets/skills/pre-edit-backup/backup.sh +0 -130
  65. package/claude-assets/skills/pre-edit-backup/cleanup.sh +0 -155
  66. package/claude-assets/skills/pre-edit-backup/restore.sh +0 -128
  67. package/claude-assets/skills/pre-edit-backup/revert-file.sh +0 -168
  68. package/claude-assets/skills/run-all-skill-tests.sh +0 -124
  69. package/claude-assets/skills/seo-orchestration/SKILL.md +0 -292
  70. package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh +0 -566
  71. package/claude-assets/skills/seo-orchestration/orchestrate-seo.sh.backup +0 -755
  72. package/claude-assets/skills/seo-orchestration/validate-consensus.sh +0 -270
  73. package/claude-assets/skills/team-provider-routing/execute-agent.sh +0 -76
  74. 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 "$@"
@@ -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 "$@"