claude-flow-novice 2.14.9 → 2.14.11

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.
@@ -0,0 +1,192 @@
1
+ #!/bin/bash
2
+ # CLI Environment Validation Script
3
+ # Ensures required tools are available before agent deployment
4
+
5
+ set -euo pipefail
6
+
7
+ # Colors for output
8
+ RED='\033[0;31m'
9
+ GREEN='\033[0;32m'
10
+ YELLOW='\033[1;33m'
11
+ NC='\033[0m' # No Color
12
+
13
+ # Required tools for CFN Loop CLI agents
14
+ REQUIRED_TOOLS=(
15
+ "rg:ripgrep"
16
+ "git"
17
+ "node"
18
+ "npm"
19
+ "jq"
20
+ "redis-cli"
21
+ "find"
22
+ "grep"
23
+ "sed"
24
+ "awk"
25
+ "sort"
26
+ "uniq"
27
+ "head"
28
+ "tail"
29
+ "wc"
30
+ "xargs"
31
+ )
32
+
33
+ echo -e "${GREEN}🔧 CFN Loop CLI Environment Validation${NC}"
34
+
35
+ # Function to check if a tool is available
36
+ check_tool() {
37
+ local tool_name="$1"
38
+ local tool_description="$2"
39
+
40
+ if command -v "$tool_name" >/dev/null 2>&1; then
41
+ echo -e " ${GREEN}✓${NC} $tool_name ($tool_description)"
42
+ return 0
43
+ else
44
+ echo -e " ${RED}✗${NC} $tool_name ($tool_description) - ${YELLOW}MISSING${NC}"
45
+ return 1
46
+ fi
47
+ }
48
+
49
+ # Function to validate Node.js version
50
+ validate_node_version() {
51
+ if command -v node >/dev/null 2>&1; then
52
+ local node_version=$(node --version 2>/dev/null | sed 's/v//')
53
+ local major_version=$(echo "$node_version" | cut -d. -f1)
54
+
55
+ if [ "$major_version" -ge 18 ]; then
56
+ echo -e " ${GREEN}✓${NC} Node.js v$node_version (>= 18 required)"
57
+ return 0
58
+ else
59
+ echo -e " ${RED}✗${NC} Node.js v$node_version (>= 18 required) - ${YELLOW}VERSION TOO OLD${NC}"
60
+ return 1
61
+ fi
62
+ else
63
+ echo -e " ${RED}✗${NC} Node.js - ${YELLOW}NOT FOUND${NC}"
64
+ return 1
65
+ fi
66
+ }
67
+
68
+ # Function to check PATH for common development directories
69
+ validate_path() {
70
+ echo -e "${YELLOW}Validating PATH...${NC}"
71
+
72
+ # Check for common development tool paths
73
+ local paths_to_check=(
74
+ "/usr/local/bin"
75
+ "/usr/bin"
76
+ "/bin"
77
+ "$HOME/.local/bin"
78
+ "$HOME/.cargo/bin"
79
+ "$HOME/.npm-global/bin"
80
+ "./node_modules/.bin"
81
+ )
82
+
83
+ local found_paths=0
84
+ for path in "${paths_to_check[@]}"; do
85
+ if [ -d "$path" ] && echo "$PATH" | grep -q "$path"; then
86
+ echo -e " ${GREEN}✓${NC} $path in PATH"
87
+ ((found_paths++))
88
+ fi
89
+ done
90
+
91
+ if [ "$found_paths" -eq 0 ]; then
92
+ echo -e " ${YELLOW}⚠${NC} Limited development directories in PATH"
93
+ return 1
94
+ fi
95
+
96
+ return 0
97
+ }
98
+
99
+ # Function to validate Redis connection
100
+ validate_redis() {
101
+ echo -e "${YELLOW}Validating Redis connection...${NC}"
102
+
103
+ if redis-cli ping >/dev/null 2>&1; then
104
+ local redis_info=$(redis-cli info server 2>/dev/null | grep "redis_version" | cut -d: -f2 | tr -d '\r')
105
+ echo -e " ${GREEN}✓${NC} Redis v$redis_info - Connected"
106
+ return 0
107
+ else
108
+ echo -e " ${RED}✗${NC} Redis - ${YELLOW}NOT CONNECTED${NC}"
109
+ return 1
110
+ fi
111
+ }
112
+
113
+ # Function to validate working directory
114
+ validate_working_directory() {
115
+ echo -e "${YELLOW}Validating working directory...${NC}"
116
+
117
+ # Check if we're in a git repository
118
+ if git rev-parse --git-dir >/dev/null 2>&1; then
119
+ echo -e " ${GREEN}✓${NC} Git repository detected"
120
+ else
121
+ echo -e " ${YELLOW}⚠${NC} Not in a git repository"
122
+ fi
123
+
124
+ # Check for claude-flow-novice installation
125
+ if [ -f "package.json" ] && grep -q "claude-flow-novice" package.json; then
126
+ echo -e " ${GREEN}✓${NC} claude-flow-novice dependency found"
127
+ else
128
+ echo -e " ${YELLOW}⚠${NC} claude-flow-novice not found in package.json"
129
+ fi
130
+
131
+ # Check for .claude directory
132
+ if [ -d ".claude" ]; then
133
+ echo -e " ${GREEN}✓${NC} .claude directory found"
134
+ else
135
+ echo -e " ${YELLOW}⚠${NC} .claude directory not found"
136
+ fi
137
+ }
138
+
139
+ # Function to install missing tools (suggestions)
140
+ suggest_installations() {
141
+ echo -e "\n${YELLOW}Installation Suggestions:${NC}"
142
+ echo -e " ${YELLOW}ripgrep:${NC} sudo apt-get install ripgrep # Debian/Ubuntu"
143
+ echo -e " ${YELLOW}ripgrep:${NC} brew install ripgrep # macOS"
144
+ echo -e " ${YELLOW}jq:${NC} sudo apt-get install jq # Debian/Ubuntu"
145
+ echo -e " ${YELLOW}jq:${NC} brew install jq # macOS"
146
+ echo -e " ${YELLOW}Redis:${NC} sudo systemctl start redis # Linux"
147
+ echo -e " ${YELLOW}Redis:${NC} brew services start redis # macOS"
148
+ }
149
+
150
+ # Main validation
151
+ main() {
152
+ local failed=0
153
+
154
+ echo -e "${YELLOW}Checking required tools...${NC}"
155
+ for tool in "${REQUIRED_TOOLS[@]}"; do
156
+ local tool_name=$(echo "$tool" | cut -d: -f1)
157
+ local tool_description=$(echo "$tool" | cut -d: -f2)
158
+
159
+ if ! check_tool "$tool_name" "$tool_description"; then
160
+ ((failed++))
161
+ fi
162
+ done
163
+
164
+ echo -e "\n${YELLOW}Checking Node.js version...${NC}"
165
+ if ! validate_node_version; then
166
+ ((failed++))
167
+ fi
168
+
169
+ echo -e "\n${YELLOW}Checking environment configuration...${NC}"
170
+ if ! validate_path; then
171
+ ((failed++))
172
+ fi
173
+
174
+ if ! validate_redis; then
175
+ ((failed++))
176
+ fi
177
+
178
+ validate_working_directory
179
+
180
+ echo -e "\n${GREEN}=== Validation Summary ===${NC}"
181
+ if [ "$failed" -eq 0 ]; then
182
+ echo -e "${GREEN}✅ All validations passed! CLI environment is ready.${NC}"
183
+ return 0
184
+ else
185
+ echo -e "${RED}❌ $failed validation(s) failed. CLI environment needs setup.${NC}"
186
+ suggest_installations
187
+ return 1
188
+ fi
189
+ }
190
+
191
+ # Run validation
192
+ main "$@"
@@ -0,0 +1,262 @@
1
+ #!/bin/bash
2
+ # Deliverable-Based Confidence Calculator
3
+ # Calculates confidence scores based on actual deliverable completion
4
+
5
+ set -euo pipefail
6
+
7
+ # Arguments
8
+ TASK_ID="$1"
9
+ AGENT_ID="$2"
10
+ EXPECTED_DELIVERABLES="$3" # JSON array of expected files/deliverables
11
+ WORKING_DIR="${4:-$(pwd)}"
12
+
13
+ # Colors for output
14
+ RED='\033[0;31m'
15
+ GREEN='\033[0;32m'
16
+ YELLOW='\033[1;33m'
17
+ BLUE='\033[0;34m'
18
+ NC='\033[0m' # No Color
19
+
20
+ echo -e "${BLUE}📊 Deliverable-Based Confidence Calculator${NC}"
21
+ echo "Task ID: $TASK_ID"
22
+ echo "Agent ID: $AGENT_ID"
23
+ echo "Working Directory: $WORKING_DIR"
24
+ echo ""
25
+
26
+ # Function to check if deliverable exists and is valid
27
+ validate_deliverable() {
28
+ local deliverable="$1"
29
+ local deliverable_path="$WORKING_DIR/$deliverable"
30
+
31
+ # Handle different deliverable types
32
+ case "$deliverable" in
33
+ *.md|*.txt|*.json|*.yaml|*.yml)
34
+ # Text files - check existence and content
35
+ if [ -f "$deliverable_path" ]; then
36
+ local size=$(stat -c%s "$deliverable_path" 2>/dev/null || echo "0")
37
+ if [ "$size" -gt 0 ]; then
38
+ echo "VALID:$size"
39
+ return 0
40
+ fi
41
+ fi
42
+ ;;
43
+ *.sh|*.js|*.ts|*.tsx|*.py)
44
+ # Code files - check existence and basic syntax
45
+ if [ -f "$deliverable_path" ]; then
46
+ local size=$(stat -c%s "$deliverable_path" 2>/dev/null || echo "0")
47
+ if [ "$size" -gt 100 ]; then
48
+ echo "VALID:$size"
49
+ return 0
50
+ fi
51
+ fi
52
+ ;;
53
+ */)
54
+ # Directories - check existence and contents
55
+ if [ -d "$deliverable_path" ]; then
56
+ local file_count=$(find "$deliverable_path" -type f | wc -l)
57
+ if [ "$file_count" -gt 0 ]; then
58
+ echo "VALID:$file_count"
59
+ return 0
60
+ fi
61
+ fi
62
+ ;;
63
+ *.json)
64
+ # JSON files - check validity
65
+ if [ -f "$deliverable_path" ]; then
66
+ if jq empty "$deliverable_path" 2>/dev/null; then
67
+ local size=$(stat -c%s "$deliverable_path" 2>/dev/null || echo "0")
68
+ echo "VALID:$size"
69
+ return 0
70
+ fi
71
+ fi
72
+ ;;
73
+ *)
74
+ # Generic file check
75
+ if [ -f "$deliverable_path" ]; then
76
+ local size=$(stat -c%s "$deliverable_path" 2>/dev/null || echo "0")
77
+ if [ "$size" -gt 0 ]; then
78
+ echo "VALID:$size"
79
+ return 0
80
+ fi
81
+ fi
82
+ ;;
83
+ esac
84
+
85
+ echo "INVALID"
86
+ return 1
87
+ }
88
+
89
+ # Function to calculate quality score based on deliverable characteristics
90
+ calculate_quality_score() {
91
+ local deliverable="$1"
92
+ local deliverable_path="$WORKING_DIR/$deliverable"
93
+
94
+ local quality_score=0.5 # Base score for existing
95
+
96
+ # Size scoring (larger files with meaningful content)
97
+ if [ -f "$deliverable_path" ]; then
98
+ local size=$(stat -c%s "$deliverable_path" 2>/dev/null || echo "0")
99
+
100
+ if [ "$size" -gt 5000 ]; then
101
+ quality_score=0.9 # Substantial content
102
+ elif [ "$size" -gt 1000 ]; then
103
+ quality_score=0.8 # Good content
104
+ elif [ "$size" -gt 100 ]; then
105
+ quality_score=0.7 # Adequate content
106
+ else
107
+ quality_score=0.6 # Minimal content
108
+ fi
109
+ fi
110
+
111
+ # Content-specific scoring
112
+ case "$deliverable" in
113
+ *.md)
114
+ # Markdown files - check for structure
115
+ if grep -q "^#" "$deliverable_path" 2>/dev/null; then
116
+ quality_score=$((quality_score + 10)) # Has headers
117
+ fi
118
+ if grep -q "^```" "$deliverable_path" 2>/dev/null; then
119
+ quality_score=$((quality_score + 5)) # Has code blocks
120
+ fi
121
+ ;;
122
+ *.ts|*.tsx|*.js|*.jsx)
123
+ # Code files - check for functions/exports
124
+ if grep -q "function\|export\|class\|const.*=" "$deliverable_path" 2>/dev/null; then
125
+ quality_score=$((quality_score + 10)) # Has functions/exports
126
+ fi
127
+ ;;
128
+ *.json)
129
+ # JSON files - check for structure
130
+ if jq -e 'type == "object" and keys > 0' "$deliverable_path" >/dev/null 2>&1; then
131
+ quality_score=$((quality_score + 10)) # Has meaningful structure
132
+ fi
133
+ ;;
134
+ esac
135
+
136
+ # Cap at 1.0
137
+ if [ "$quality_score" -gt 100 ]; then
138
+ quality_score=100
139
+ fi
140
+
141
+ echo "$quality_score"
142
+ }
143
+
144
+ # Main confidence calculation
145
+ main() {
146
+ echo -e "${YELLOW}Analyzing expected deliverables...${NC}"
147
+
148
+ # Parse expected deliverables from JSON
149
+ if ! echo "$EXPECTED_DELIVERABLES" | jq empty 2>/dev/null; then
150
+ echo -e "${RED}❌ Invalid JSON in expected deliverables${NC}"
151
+ echo "0.0"
152
+ return 1
153
+ fi
154
+
155
+ local total_deliverables=$(echo "$EXPECTED_DELIVERABLES" | jq 'length')
156
+ local valid_deliverables=0
157
+ local total_quality_score=0
158
+
159
+ echo "Expected deliverables: $total_deliverables"
160
+ echo ""
161
+
162
+ # Check each deliverable
163
+ for ((i=0; i<total_deliverables; i++)); do
164
+ local deliverable=$(echo "$EXPECTED_DELIVERABLES" | jq -r ".[$i]")
165
+
166
+ echo -n " Checking: $deliverable ... "
167
+
168
+ local validation_result=$(validate_deliverable "$deliverable")
169
+
170
+ if [[ "$validation_result" == VALID* ]]; then
171
+ local quality_score=$(calculate_quality_score "$deliverable")
172
+ total_quality_score=$((total_quality_score + quality_score))
173
+ valid_deliverables=$((valid_deliverables + 1))
174
+
175
+ local size=$(echo "$validation_result" | cut -d: -f2)
176
+ echo -e "${GREEN}✓ VALID${NC} (size: $size, quality: $quality_score)"
177
+ else
178
+ echo -e "${RED}✗ MISSING/INVALID${NC}"
179
+ fi
180
+ done
181
+
182
+ echo ""
183
+ echo -e "${YELLOW}Summary:${NC}"
184
+ echo " Valid deliverables: $valid_deliverables/$total_deliverables"
185
+
186
+ # Calculate completion score (0-1)
187
+ local completion_score=0
188
+ if [ "$total_deliverables" -gt 0 ]; then
189
+ completion_score=$(echo "scale=3; $valid_deliverables / $total_deliverables" | bc -l)
190
+ fi
191
+
192
+ # Calculate average quality score (0-1)
193
+ local avg_quality_score=0.5 # Default if no deliverables
194
+ if [ "$valid_deliverables" -gt 0 ]; then
195
+ avg_quality_score=$(echo "scale=3; $total_quality_score / ($valid_deliverables * 100)" | bc -l)
196
+ fi
197
+
198
+ # Calculate final confidence score
199
+ # Weight: 60% completion, 40% quality
200
+ local final_confidence=$(echo "scale=3; ($completion_score * 0.6) + ($avg_quality_score * 0.4)" | bc -l)
201
+
202
+ # Round to 2 decimal places
203
+ final_confidence=$(echo "$final_confidence" | sed 's/^\./0./' | sed 's/\.\([0-9]\{2\}\)[0-9]*$/.\1/')
204
+
205
+ echo " Completion score: $completion_score"
206
+ echo " Quality score: $avg_quality_score"
207
+ echo " Final confidence: $final_confidence"
208
+
209
+ # Validation rules
210
+ if [ "$valid_deliverables" -eq 0 ]; then
211
+ echo -e "${RED}🚨 CRITICAL: No deliverables created - confidence should be 0.0${NC}"
212
+ echo "0.0"
213
+ return 1
214
+ elif (( $(echo "$final_confidence > 0.3" | bc -l) )); then
215
+ if [ "$valid_deliverables" -lt "$((total_deliverables / 2))" ]; then
216
+ echo -e "${YELLOW}⚠️ WARNING: Low deliverable completion (<50%) - confidence should be <= 0.3${NC}"
217
+ fi
218
+ fi
219
+
220
+ echo -e "${GREEN}✓ Calculated confidence: $final_confidence${NC}"
221
+ echo "$final_confidence"
222
+ }
223
+
224
+ # Store results in Redis if available
225
+ store_confidence_result() {
226
+ local confidence="$1"
227
+
228
+ if command -v redis-cli >/dev/null 2>&1; then
229
+ # Store detailed breakdown
230
+ local breakdown=$(cat << EOF
231
+ {
232
+ "task_id": "$TASK_ID",
233
+ "agent_id": "$AGENT_ID",
234
+ "calculated_confidence": $confidence,
235
+ "calculation_method": "deliverable-based",
236
+ "timestamp": "$(date -Iseconds)",
237
+ "working_directory": "$WORKING_DIR",
238
+ "expected_deliverables": $EXPECTED_DELIVERABLES
239
+ }
240
+ EOF
241
+ )
242
+
243
+ redis-cli set "${TASK_ID}:${AGENT_ID}:confidence-breakdown" "$breakdown" >/dev/null 2>&1 || true
244
+ redis-cli set "${TASK_ID}:${AGENT_ID}:confidence-score" "$confidence" >/dev/null 2>&1 || true
245
+
246
+ echo -e "📦 ${BLUE}Stored confidence breakdown in Redis:${NC} ${TASK_ID}:${AGENT_ID}:confidence-breakdown"
247
+ fi
248
+ }
249
+
250
+ # Execute main function
251
+ if [ "$#" -lt 3 ]; then
252
+ echo "Usage: $0 <task_id> <agent_id> <expected_deliverables_json> [working_directory]"
253
+ echo "Example: $0 task-123 agent-1 '[\"file1.txt\", \"script.sh\", \"docs/\"]' /path/to/project"
254
+ exit 1
255
+ fi
256
+
257
+ final_confidence=$(main "$@")
258
+
259
+ # Store results
260
+ store_confidence_result "$final_confidence"
261
+
262
+ echo "$final_confidence"
@@ -707,6 +707,17 @@ EOF
707
707
  # Main CFN Loop
708
708
  ##############################################################################
709
709
 
710
+ # Validate CLI environment before spawning agents
711
+ echo "🔧 Validating CLI environment..."
712
+ if [ -f "$PROJECT_ROOT/.claude/skills/cfn-cli-setup/validate-cli-environment.sh" ]; then
713
+ if ! bash "$PROJECT_ROOT/.claude/skills/cfn-cli-setup/validate-cli-environment.sh"; then
714
+ echo "❌ CLI environment validation failed. Agents may not have required tools."
715
+ echo "⚠️ Continuing anyway, but expect potential tool failures..."
716
+ fi
717
+ else
718
+ echo "⚠️ CLI environment validation script not found. Skipping validation."
719
+ fi
720
+
710
721
  # Store context in Redis
711
722
  store_context "$TASK_ID"
712
723
 
@@ -764,11 +775,41 @@ for ((ITERATION=1; ITERATION<=MAX_ITERATIONS; ITERATION++)); do
764
775
  --agents "$LOOP3_IDS" \
765
776
  --threshold "$GATE" \
766
777
  --min-quorum "$MIN_QUORUM_LOOP3"; then
767
- # Gate passed - store confidence
768
- LOOP3_FINAL_CONFIDENCE=$("$REDIS_COORD_SKILL/invoke-waiting-mode.sh" collect \
769
- --task-id "$TASK_ID" \
770
- --agent-ids "$LOOP3_IDS" \
771
- --min-quorum "$MIN_QUORUM_LOOP3")
778
+ # Gate passed - validate confidence based on deliverables
779
+ echo "🔍 Validating agent confidence scores against deliverables..."
780
+
781
+ # Re-calculate confidence based on actual deliverables
782
+ if [ -n "$EXPECTED_FILES" ] && [ -f "$PROJECT_ROOT/.claude/skills/cfn-deliverable-validation/confidence-calculator.sh" ]; then
783
+ VALIDATED_CONFIDENCE=0
784
+
785
+ for agent_id in ${LOOP3_IDS//,/ }; do
786
+ # Get agent's reported confidence
787
+ agent_confidence=$(redis-cli get "swarm:${TASK_ID}:${agent_id}:confidence" 2>/dev/null || echo "0.5")
788
+
789
+ # Calculate deliverable-based confidence
790
+ deliverable_confidence=$("$PROJECT_ROOT/.claude/skills/cfn-deliverable-validation/confidence-calculator.sh" \
791
+ "$TASK_ID" "$agent_id" "$EXPECTED_FILES" "$PROJECT_ROOT")
792
+
793
+ echo " Agent $agent_id: reported=$agent_confidence, deliverable-based=$deliverable_confidence"
794
+
795
+ # Use the lower of the two scores (inflation prevention)
796
+ if (( $(echo "$deliverable_confidence < $agent_confidence" | bc -l) )); then
797
+ echo " ⚠️ Downgrading confidence for $agent_id (inflated score detected)"
798
+ VALIDATED_CONFIDENCE=$deliverable_confidence
799
+ else
800
+ VALIDATED_CONFIDENCE=$agent_confidence
801
+ fi
802
+ done
803
+
804
+ LOOP3_FINAL_CONFIDENCE=$VALIDATED_CONFIDENCE
805
+ echo "✅ Final validated Loop 3 confidence: $LOOP3_FINAL_CONFIDENCE"
806
+ else
807
+ # Store confidence (fallback method)
808
+ LOOP3_FINAL_CONFIDENCE=$("$REDIS_COORD_SKILL/invoke-waiting-mode.sh" collect \
809
+ --task-id "$TASK_ID" \
810
+ --agent-ids "$LOOP3_IDS" \
811
+ --min-quorum "$MIN_QUORUM_LOOP3")
812
+ fi
772
813
  else
773
814
  # Gate failed - iterate Loop 3
774
815
  echo "❌ Gate check failed - iterating Loop 3"