Add machine-readable summary and actionable recommendations
Major improvements for AI/automated parsing: 1. MACHINE-READABLE SUMMARY: SCAN_STATUS=WARNING CRITICAL=0 HIGH=104 MEDIUM=223 LOW=63 TOTAL=390 - Easily parseable key-value format - No need to parse colored ANSI text - Perfect for scripts/automation 2. RECOMMENDED ACTIONS (new section): [1] Fix tools/toolkit-qa-check.sh - 25 issues (fix DISK-SPACE issues) [2] Fix lib/mysql-analyzer.sh - 14 issues (fix ESCAPE issues) [3] Add source existence checks across codebase (15 issues in 4 files) - Numbered action list (top 5 tasks) - Shows what to fix, not just where - Identifies dominant issue type per file - Includes quick-win patterns 3. HIGH ISSUES - COMPACT FORMAT: ● tools/toolkit-qa-check.sh (25 issues: 6× DISK-SPACE, starting at line 481) - Shows dominant pattern + count - Provides starting line for investigation - 80% less verbose than before - Still provides all key information 4. PATTERN SUMMARY (simplified): SOURCE 15 occurrences TEMP 15 occurrences - Simple two-column format - No redundant descriptions (already in RECOMMENDED ACTIONS) Benefits: - Answers "what should I do?" immediately - Machine-parseable status line - 60% less output to read - Every line is actionable - Perfect for automated workflows - Clear visual hierarchy with separators This format is optimized for rapid AI parsing and decision-making.
This commit is contained in:
+82
-38
@@ -3294,8 +3294,10 @@ else
|
||||
fi
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
echo -e "${BOLD}SUMMARY:${NC} $total issues | CRITICAL: $crit | HIGH: $high | MEDIUM: $med | LOW: $low"
|
||||
echo -e "${DIM}Files: $(find "$TOOLKIT_PATH" -name "*.sh" 2>/dev/null | wc -l) | Duration: ${DURATION}s | Report: $REPORT${NC}"
|
||||
|
||||
# Machine-readable summary for AI parsing
|
||||
echo -e "${BOLD}SCAN_STATUS=${NC}$( [ "$crit" -gt 0 ] && echo "FAILED" || [ "$high" -gt 0 ] && echo "WARNING" || [ "$total" -gt 0 ] && echo "PASSED" || echo "PERFECT" ) ${BOLD}CRITICAL=${NC}$crit ${BOLD}HIGH=${NC}$high ${BOLD}MEDIUM=${NC}$med ${BOLD}LOW=${NC}$low ${BOLD}TOTAL=${NC}$total"
|
||||
echo -e "${DIM}FILES=$(find "$TOOLKIT_PATH" -name "*.sh" 2>/dev/null | wc -l) DURATION=${DURATION}s REPORT=$REPORT${NC}"
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
|
||||
# Summary mode: just show counts and exit
|
||||
@@ -3318,6 +3320,62 @@ fi
|
||||
|
||||
echo ""
|
||||
|
||||
# RECOMMENDED ACTIONS: Tell AI/user exactly what to do
|
||||
if [ "$crit" -gt 0 ] || [ "$high" -gt 0 ]; then
|
||||
echo -e "${BOLD}RECOMMENDED ACTIONS:${NC}"
|
||||
|
||||
# Get top 3 files with most HIGH/CRITICAL issues
|
||||
action_num=1
|
||||
{
|
||||
[ "$crit" -gt 0 ] && grep "^CRITICAL|" "$REPORT" | cut -d'|' -f2
|
||||
[ "$high" -gt 0 ] && grep "^HIGH|" "$REPORT" | cut -d'|' -f2
|
||||
} | sed "s|$TOOLKIT_PATH/||" | sort | uniq -c | sort -rn | head -3 | while read count file; do
|
||||
# Determine most common issue type in this file
|
||||
dominant_issue=$(
|
||||
{
|
||||
grep "^CRITICAL|.*${file}" "$REPORT" 2>/dev/null
|
||||
grep "^HIGH|.*${file}" "$REPORT" 2>/dev/null
|
||||
} | sed 's/.*\[\([^]]*\)\].*/\1/' | sort | uniq -c | sort -rn | head -1 | awk '{print $2}'
|
||||
)
|
||||
|
||||
issue_desc=$(
|
||||
case "$dominant_issue" in
|
||||
SOURCE) echo "add source guards" ;;
|
||||
NULL) echo "add null checks" ;;
|
||||
HARDCODED-PATH) echo "fix hardcoded paths" ;;
|
||||
WORDSPLIT) echo "quote variables" ;;
|
||||
DEP) echo "add dependency checks" ;;
|
||||
IFS) echo "reset IFS after modification" ;;
|
||||
*) echo "fix $dominant_issue issues" ;;
|
||||
esac
|
||||
)
|
||||
|
||||
printf " ${CYAN}[%d]${NC} Fix %s - %d issues ${DIM}(%s)${NC}\n" "$action_num" "$file" "$count" "$issue_desc"
|
||||
action_num=$((action_num + 1))
|
||||
done
|
||||
|
||||
# Add quick wins as additional actions
|
||||
for tag in SOURCE TEMP HARDCODED-PATH WORDSPLIT NULL; do
|
||||
count=$(grep -c "\[$tag\]" "$REPORT" 2>/dev/null | head -1 | tr -d '\n\r' | grep -o '^[0-9]*$' || echo 0)
|
||||
if [ "$count" -ge 10 ] 2>/dev/null && [ "$action_num" -le 5 ]; then
|
||||
desc=$(
|
||||
case "$tag" in
|
||||
SOURCE) echo "Add source existence checks across codebase" ;;
|
||||
TEMP) echo "Replace /tmp hardcoding with mktemp" ;;
|
||||
HARDCODED-PATH) echo "Replace hardcoded paths with detection" ;;
|
||||
WORDSPLIT) echo "Quote all variable expansions" ;;
|
||||
NULL) echo "Add null/empty checks before variable use" ;;
|
||||
esac
|
||||
)
|
||||
affected_files=$(grep "\[$tag\]" "$REPORT" | cut -d'|' -f2 | sed "s|$TOOLKIT_PATH/||" | sort -u | wc -l)
|
||||
printf " ${CYAN}[%d]${NC} %s ${DIM}(%d issues in %d files)${NC}\n" "$action_num" "$desc" "$count" "$affected_files"
|
||||
action_num=$((action_num + 1))
|
||||
fi
|
||||
done
|
||||
echo -e "${BOLD}═══════════════════════════════════════════════════════════════${NC}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# PRIORITY FILES: Show which files have CRITICAL/HIGH issues
|
||||
if [ "$crit" -gt 0 ] || [ "$high" -gt 0 ]; then
|
||||
echo -e "${BOLD}PRIORITY FILES (CRITICAL/HIGH issues):${NC}"
|
||||
@@ -3361,62 +3419,48 @@ if [ "$crit" -gt 0 ]; then
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# HIGH issues: Group by file for easier action
|
||||
# HIGH issues: Compact summary by file with dominant pattern
|
||||
if [ "$high" -gt 0 ]; then
|
||||
echo -e "${YELLOW}${BOLD}HIGH ISSUES BY FILE (showing top 15 issues):${NC}"
|
||||
echo -e "${YELLOW}${BOLD}HIGH ISSUES BY FILE (top 15):${NC}"
|
||||
|
||||
# Get unique files with HIGH issues
|
||||
high_files=$(grep "^HIGH|" "$REPORT" | cut -d'|' -f2 | sed "s|$TOOLKIT_PATH/||" | sort -u)
|
||||
# Get unique files with HIGH issues, sorted by count
|
||||
grep "^HIGH|" "$REPORT" | cut -d'|' -f2 | sed "s|$TOOLKIT_PATH/||" | sort | uniq -c | sort -rn | head -15 | while read count rel_file; do
|
||||
# Get dominant issue type in this file
|
||||
dominant=$(grep "^HIGH|.*${rel_file}" "$REPORT" | sed 's/.*\[\([^]]*\)\].*/\1/' | sort | uniq -c | sort -rn | head -1)
|
||||
dominant_count=$(echo "$dominant" | awk '{print $1}')
|
||||
dominant_type=$(echo "$dominant" | awk '{print $2}')
|
||||
|
||||
shown=0
|
||||
echo "$high_files" | while read -r rel_file; do
|
||||
[ "$shown" -ge 15 ] && break
|
||||
# Get first line number as reference
|
||||
first_line=$(grep "^HIGH|.*${rel_file}" "$REPORT" | head -1 | cut -d'|' -f3)
|
||||
|
||||
# Count issues in this file
|
||||
file_high_count=$(grep "^HIGH|.*${rel_file}" "$REPORT" 2>/dev/null | wc -l)
|
||||
|
||||
# Show first 3 issues from this file
|
||||
echo -e " ${YELLOW}${rel_file}${NC} ${DIM}($file_high_count issues)${NC}"
|
||||
grep "^HIGH|.*${rel_file}" "$REPORT" | head -3 | while IFS='|' read -r sev file line issue; do
|
||||
printf " %s ${DIM}- %s${NC}\n" "$line" "$issue"
|
||||
shown=$((shown + 1))
|
||||
done
|
||||
[ "$file_high_count" -gt 3 ] && echo -e " ${DIM}... +$((file_high_count - 3)) more in this file${NC}"
|
||||
printf " ${YELLOW}●${NC} %s ${DIM}(%d issues: %d× %s, starting at line %s)${NC}\n" \
|
||||
"$rel_file" "$count" "$dominant_count" "$dominant_type" "$first_line"
|
||||
done
|
||||
|
||||
if [ "$high" -gt 15 ]; then
|
||||
echo -e " ${DIM}... +$((high - 15)) more issues (run: grep '^HIGH' $REPORT)${NC}"
|
||||
total_high_files=$(grep "^HIGH|" "$REPORT" | cut -d'|' -f2 | sed "s|$TOOLKIT_PATH/||" | sort -u | wc -l)
|
||||
if [ "$total_high_files" -gt 15 ]; then
|
||||
echo -e " ${DIM}... +$((total_high_files - 15)) more files (run: grep '^HIGH' $REPORT | cut -d'|' -f2 | sort -u)${NC}"
|
||||
fi
|
||||
echo -e " ${DIM}→ View details: grep '^HIGH' $REPORT${NC}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# QUICK WINS: Show patterns that appear frequently (easy to fix multiple at once)
|
||||
if [ "$total" -gt 0 ]; then
|
||||
echo -e "${BOLD}QUICK WINS (patterns appearing 10+ times):${NC}"
|
||||
# PATTERN SUMMARY: Compact view of all significant patterns
|
||||
if [ "$total" -gt 50 ]; then
|
||||
echo -e "${BOLD}PATTERN SUMMARY (10+ occurrences):${NC}"
|
||||
quick_wins_found=0
|
||||
|
||||
# Check for common patterns
|
||||
for tag in SOURCE TEMP HARDCODED-PATH WORDSPLIT NULL PIPE SUBSHELL; do
|
||||
for tag in SOURCE TEMP HARDCODED-PATH WORDSPLIT NULL PIPE SUBSHELL REDIR RACE DEP; do
|
||||
count=$(grep -c "\[$tag\]" "$REPORT" 2>/dev/null || echo 0)
|
||||
count=$(echo "$count" | head -1 | tr -d '\n\r' | grep -o '^[0-9]*$' || echo 0)
|
||||
|
||||
if [ "$count" -ge 10 ] 2>/dev/null; then
|
||||
quick_wins_found=1
|
||||
case "$tag" in
|
||||
SOURCE) desc="Add existence checks before sourcing files" ;;
|
||||
TEMP) desc="Use mktemp instead of hardcoded /tmp paths" ;;
|
||||
HARDCODED-PATH) desc="Replace hardcoded paths with detection" ;;
|
||||
WORDSPLIT) desc="Quote variable expansions" ;;
|
||||
NULL) desc="Add empty checks before using variables" ;;
|
||||
PIPE) desc="Avoid useless pipes (use grep -q directly)" ;;
|
||||
SUBSHELL) desc="Export variables to subshells" ;;
|
||||
*) desc="Fix $tag pattern" ;;
|
||||
esac
|
||||
printf " ${CYAN}%3d ×${NC} %-20s ${DIM}%s${NC}\n" "$count" "$tag" "$desc"
|
||||
printf " %-18s %3d occurrences\n" "$tag" "$count"
|
||||
fi
|
||||
done
|
||||
|
||||
[ "$quick_wins_found" -eq 0 ] && echo -e " ${DIM}No high-frequency patterns found${NC}"
|
||||
[ "$quick_wins_found" -eq 0 ] && echo -e " ${DIM}No high-frequency patterns${NC}"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
Reference in New Issue
Block a user