Files
APAW/archive/scripts/review-watcher.sh
¨NW¨ 5a77528b23 refactor: clean up root directory - move deprecated files to archive
Archive:
- docker-compose.yml, Dockerfile.playwright
- scripts/ (legacy test scripts)
- docs/, .test/ (old documentation and tests)
- IMPROVEMENT_PROPOSAL.md (superseded by .kilo/)
- BROWSER_VISIBILITY.md, README.Docker.md
- cleanup-packages.sh, fix-permissions.sh, install-apaw.sh

Keep in root:
- .kilo/ (active system)
- .claude/ (Claude Code runtime)
- AGENTS.md (agent reference)
- README.md (main documentation)
- src/ (utility code)
- package.json, tsconfig.json (project config)
2026-04-05 03:52:10 +01:00

203 lines
6.2 KiB
Bash

#!/bin/bash
# Review Watcher Script
# Watches for completion comments and triggers automatic review
# Usage: ./scripts/review-watcher.sh [issue_number]
echo "=== Review Watcher ==="
echo ""
# Check for token
if [ -z "$GITEA_TOKEN" ]; then
echo "❌ GITEA_TOKEN not set!"
echo "Run: export GITEA_TOKEN=your_token"
exit 1
fi
API_URL="https://git.softuniq.eu/api/v1"
# Detect repository
REMOTE=$(git remote get-url origin 2>/dev/null | head -1)
OWNER=$(echo "$REMOTE" | sed 's/.*[:/]\([^/]*\)\/.*/\1/')
REPO=$(echo "$REMOTE" | sed 's/.*[:/][^/]*\/\([^/.]*\).*/\1/')
if [ -z "$OWNER" ] || [ -z "$REPO" ]; then
echo "❌ Could not detect repository"
exit 1
fi
echo "📦 Repository: $OWNER/$REPO"
echo ""
# Function to check issue for completion markers
check_issue() {
local ISSUE_NUM=$1
echo "🔎 Checking issue #$ISSUE_NUM..."
# Get issue details
ISSUE=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$API_URL/repos/$OWNER/$REPO/issues/$ISSUE_NUM")
ISSUE_BODY=$(echo "$ISSUE" | grep -o '"body":"[^"]*"' | sed 's/"body":"//; s/"$//')
ISSUE_TITLE=$(echo "$ISSUE" | grep -o '"title":"[^"]*"' | sed 's/"title":"//; s/"$//')
# Get comments
COMMENTS=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$API_URL/repos/$OWNER/$REPO/issues/$ISSUE_NUM/comments")
# Check for completion markers
COMPLETION_MARKERS="done completed ready выполнено готово сделано ✓ ✅"
FOUND_MARKER=""
for marker in $COMPLETION_MARKERS; do
if echo "$ISSUE_BODY $COMMENTS" | grep -qi "$marker"; then
FOUND_MARKER="$marker"
break
fi
done
# Check for checklist completion
CHECKLIST_COMPLETE=$(echo "$ISSUE_BODY" | grep -c '\- \[x\]' || echo 0)
CHECKLIST_TOTAL=$(echo "$ISSUE_BODY" | grep -c '\- \[' || echo 0)
if [ "$CHECKLIST_TOTAL" -gt 0 ] && [ "$CHECKLIST_COMPLETE" -eq "$CHECKLIST_TOTAL" ]; then
echo "✅ All checklist items complete ($CHECKLIST_COMPLETE/$CHECKLIST_TOTAL)"
FOUND_MARKER="checklist-complete"
fi
if [ -n "$FOUND_MARKER" ]; then
echo "✅ Completion marker found: $FOUND_MARKER"
echo ""
echo "📋 Issue: $ISSUE_TITLE"
echo " Body length: ${#ISSUE_BODY} chars"
echo " Comments: $(echo "$COMMENTS" | grep -c '"id"' || echo 0)"
echo ""
return 0
else
echo "⏳ No completion markers found"
return 1
fi
}
# Function to create fix task
create_fix_task() {
local PARENT_NUM=$1
local FIX_TITLE=$2
local FIX_BODY=$3
local PRIORITY=$4
echo "Creating fix task: $FIX_TITLE"
RESPONSE=$(curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"title\": \"Fix: $FIX_TITLE (from #$PARENT_NUM)\",
\"body\": \"## Parent Issue\n#$PARENT_NUM\n\n## Problem\n$FIX_BODY\n\n## Priority\n$PRIORITY\",
\"labels\": [\"type::bug\", \"$PRIORITY\", \"status::new\"]
}" \
"$API_URL/repos/$OWNER/$REPO/issues")
FIX_NUM=$(echo "$RESPONSE" | grep -o '"number":[0-9]*' | head -1 | cut -d: -f2)
if [ -n "$FIX_NUM" ]; then
echo "✅ Created fix task #$FIX_NUM"
# Comment on parent
curl -s -X POST \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"body\":\"Created fix task: #$FIX_NUM\n\n**Priority:** $PRIORITY\n**Action:** Fix required before merge\"}" \
"$API_URL/repos/$OWNER/$REPO/issues/$PARENT_NUM/comments" > /dev/null
return $FIX_NUM
else
echo "❌ Failed to create fix task"
return 0
fi
}
# Function to run validation
run_validation() {
local ISSUE_NUM=$1
echo ""
echo "🔍 Running validation..."
echo ""
# Get issue files (from body or comments)
FILES=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$API_URL/repos/$OWNER/$REPO/issues/$ISSUE_NUM" | \
grep -oE 'src/[a-zA-Z0-9_/.-]+\.(ts|js|tsx|jsx|go|py)' | \
head -10)
if [ -n "$FILES" ]; then
echo "Files to validate:"
echo "$FILES" | while read f; do echo " - $f"; done
echo ""
fi
# Placeholder for actual validation
# In real implementation, this would call validation agents
echo "Running checks:"
echo " ✅ Markdown validation"
echo " ✅ Syntax check"
echo " ⚠️ Security scan (2 issues found)"
echo " ⚠️ Performance check (1 issue found)"
echo ""
# Simulated issues for demo
echo "Creating fix tasks for found issues..."
create_fix_task "$ISSUE_NUM" \
"Add rate limiting to auth endpoints" \
"auth.ts lacks rate limiting, vulnerable to brute force attacks" \
"priority::high"
create_fix_task "$ISSUE_NUM" \
"Remove debug console.log statements" \
"Production code contains console.log in jwt.ts line 12" \
"priority::medium"
}
# Main logic
if [ -n "$1" ]; then
# Check specific issue
check_issue "$1"
if [ $? -eq 0 ]; then
run_validation "$1"
fi
else
# Check all open issues with status::review label
echo "Searching for issues ready for review..."
echo ""
ISSUES=$(curl -s -H "Authorization: token $GITEA_TOKEN" \
"$API_URL/repos/$OWNER/$REPO/issues?state=open&labels=status::review" | \
grep -o '"number":[0-9]*' | cut -d: -f2)
if [ -z "$ISSUES" ]; then
echo "No issues found with status::review label"
echo ""
echo "To check a specific issue: $0 <issue_number>"
exit 0
fi
for ISSUE_NUM in $ISSUES; do
echo "────────────────────────────────────"
check_issue "$ISSUE_NUM"
if [ $? -eq 0 ]; then
run_validation "$ISSUE_NUM"
fi
echo ""
done
fi
echo "=========================================="
echo "✅ Review watcher complete"
echo ""
echo "To manually trigger review:"
echo " $0 <issue_number>"
echo ""
echo "To watch continuously (webhook mode):"
echo " while true; do $0; sleep 300; done"
echo ""