docs(planning): clean up next milestone document and remove completion markers

- Remove excessive completion checkmarks and status markers throughout document
- Consolidate redundant sections on completed features
- Streamline executive summary and current status sections
- Focus content on upcoming quick wins and active tasks
- Remove duplicate phase completion listings
- Clean up success metrics and KPI sections
- Maintain essential planning information while reducing noise
This commit is contained in:
AITBC System
2026-03-08 13:42:14 +01:00
parent 5697d1a332
commit 6cb51c270c
343 changed files with 80123 additions and 1881 deletions

View File

@@ -0,0 +1,661 @@
#!/bin/bash
#
# AITBC Comprehensive Planning Cleanup - Move ALL Completed Tasks
# Scans entire docs/10_plan subfolder structure, finds all completed tasks,
# and moves them to appropriate organized folders in docs/
#
set -e
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_header() {
echo -e "${BLUE}=== $1 ===${NC}"
}
# Configuration
PROJECT_ROOT="/opt/aitbc"
PLANNING_DIR="$PROJECT_ROOT/docs/10_plan"
DOCS_DIR="$PROJECT_ROOT/docs"
ARCHIVE_DIR="$PROJECT_ROOT/docs/archive"
WORKSPACE_DIR="$PROJECT_ROOT/workspace/planning-analysis"
BACKUP_DIR="$WORKSPACE_DIR/backup"
# Main execution
main() {
print_header "AITBC COMPREHENSIVE PLANNING CLEANUP - ALL SUBFOLDERS"
echo ""
echo "📋 Scanning entire docs/10_plan subfolder structure"
echo "📚 Moving ALL completed tasks to appropriate docs/ folders"
echo "📁 Organizing by category and completion status"
echo ""
# Step 1: Create organized destination folders
print_header "Step 1: Creating Organized Destination Folders"
create_organized_folders
# Step 2: Scan all subfolders for completed tasks
print_header "Step 2: Scanning All Subfolders for Completed Tasks"
scan_all_subfolders
# Step 3: Categorize and move completed content
print_header "Step 3: Categorizing and Moving Completed Content"
categorize_and_move_content
# Step 4: Create comprehensive archive
print_header "Step 4: Creating Comprehensive Archive"
create_comprehensive_archive
# Step 5: Clean up planning documents
print_header "Step 5: Cleaning Up Planning Documents"
cleanup_planning_documents
# Step 6: Generate final reports
print_header "Step 6: Generating Final Reports"
generate_final_reports
print_header "Comprehensive Planning Cleanup Complete! 🎉"
echo ""
echo "✅ All subfolders scanned and processed"
echo "✅ Completed content categorized and moved"
echo "✅ Comprehensive archive created"
echo "✅ Planning documents cleaned"
echo "✅ Final reports generated"
echo ""
echo "📊 docs/10_plan is now clean and focused"
echo "📚 docs/ has organized completed content"
echo "📁 Archive system fully operational"
echo "🎯 Ready for new milestone planning"
}
# Create organized destination folders
create_organized_folders() {
print_status "Creating organized destination folders in docs/"
# Create main categories
mkdir -p "$DOCS_DIR/completed/infrastructure"
mkdir -p "$DOCS_DIR/completed/cli"
mkdir -p "$DOCS_DIR/completed/backend"
mkdir -p "$DOCS_DIR/completed/security"
mkdir -p "$DOCS_DIR/completed/exchange"
mkdir -p "$DOCS_DIR/completed/blockchain"
mkdir -p "$DOCS_DIR/completed/analytics"
mkdir -p "$DOCS_DIR/completed/marketplace"
mkdir -p "$DOCS_DIR/completed/maintenance"
mkdir -p "$DOCS_DIR/completed/ai"
# Create archive structure
mkdir -p "$ARCHIVE_DIR/by_category/infrastructure"
mkdir -p "$ARCHIVE_DIR/by_category/cli"
mkdir -p "$ARCHIVE_DIR/by_category/backend"
mkdir -p "$ARCHIVE_DIR/by_category/security"
mkdir -p "$ARCHIVE_DIR/by_category/exchange"
mkdir -p "$ARCHIVE_DIR/by_category/blockchain"
mkdir -p "$ARCHIVE_DIR/by_category/analytics"
mkdir -p "$ARCHIVE_DIR/by_category/marketplace"
mkdir -p "$ARCHIVE_DIR/by_category/maintenance"
mkdir -p "$ARCHIVE_DIR/by_category/ai"
print_status "Organized folders created"
}
# Scan all subfolders for completed tasks
scan_all_subfolders() {
print_status "Scanning entire docs/10_plan subfolder structure..."
cat > "$WORKSPACE_DIR/scan_all_subfolders.py" << 'EOF'
#!/usr/bin/env python3
"""
Comprehensive Subfolder Scanner
Scans all subfolders in docs/10_plan for completed tasks
"""
import os
import re
import json
from pathlib import Path
from datetime import datetime
def categorize_file_content(file_path):
"""Categorize file based on content and path"""
path_parts = file_path.parts
filename = file_path.name.lower()
# Check path-based categorization
if '01_core_planning' in path_parts:
return 'core_planning'
elif '02_implementation' in path_parts:
return 'implementation'
elif '03_testing' in path_parts:
return 'testing'
elif '04_infrastructure' in path_parts:
return 'infrastructure'
elif '05_security' in path_parts:
return 'security'
elif '06_cli' in path_parts:
return 'cli'
elif '07_backend' in path_parts:
return 'backend'
elif '08_marketplace' in path_parts:
return 'marketplace'
elif '09_maintenance' in path_parts:
return 'maintenance'
elif '10_summaries' in path_parts:
return 'summaries'
# Check filename-based categorization
if any(word in filename for word in ['infrastructure', 'port', 'network', 'deployment']):
return 'infrastructure'
elif any(word in filename for word in ['cli', 'command', 'interface']):
return 'cli'
elif any(word in filename for word in ['api', 'backend', 'service']):
return 'backend'
elif any(word in filename for word in ['security', 'auth', 'firewall']):
return 'security'
elif any(word in filename for word in ['exchange', 'trading', 'market']):
return 'exchange'
elif any(word in filename for word in ['blockchain', 'wallet', 'transaction']):
return 'blockchain'
elif any(word in filename for word in ['analytics', 'monitoring', 'ai']):
return 'analytics'
elif any(word in filename for word in ['marketplace', 'pool', 'hub']):
return 'marketplace'
elif any(word in filename for word in ['maintenance', 'update', 'requirements']):
return 'maintenance'
return 'general'
def scan_file_for_completion(file_path):
"""Scan a file for completion indicators"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Check for completion indicators
completion_patterns = [
r'✅\s*\*\*COMPLETE\*\*',
r'✅\s*\*\*IMPLEMENTED\*\*',
r'✅\s*\*\*OPERATIONAL\*\*',
r'✅\s*\*\*DEPLOYED\*\*',
r'✅\s*\*\*WORKING\*\*',
r'✅\s*\*\*FUNCTIONAL\*\*',
r'✅\s*\*\*ACHIEVED\*\*',
r'✅\s*COMPLETE\s*',
r'✅\s*IMPLEMENTED\s*',
r'✅\s*OPERATIONAL\s*',
r'✅\s*DEPLOYED\s*',
r'✅\s*WORKING\s*',
r'✅\s*FUNCTIONAL\s*',
r'✅\s*ACHIEVED\s*',
r'✅\s*COMPLETE:',
r'✅\s*IMPLEMENTED:',
r'✅\s*OPERATIONAL:',
r'✅\s*DEPLOYED:',
r'✅\s*WORKING:',
r'✅\s*FUNCTIONAL:',
r'✅\s*ACHIEVED:',
r'✅\s*\*\*COMPLETE\*\*:',
r'✅\s*\*\*IMPLEMENTED\*\*:',
r'✅\s*\*\*OPERATIONAL\*\*:',
r'✅\s*\*\*DEPLOYED\*\*:',
r'✅\s*\*\*WORKING\*\*:',
r'✅\s*\*\*FUNCTIONAL\*\*:',
r'✅\s*\*\*ACHIEVED\*\*:'
]
has_completion = any(re.search(pattern, content, re.IGNORECASE) for pattern in completion_patterns)
if has_completion:
# Count completion markers
completion_count = sum(len(re.findall(pattern, content, re.IGNORECASE)) for pattern in completion_patterns)
return {
'file_path': str(file_path),
'relative_path': str(file_path.relative_to(Path('/opt/aitbc/docs/10_plan'))),
'category': categorize_file_content(file_path),
'has_completion': True,
'completion_count': completion_count,
'file_size': file_path.stat().st_size,
'last_modified': datetime.fromtimestamp(file_path.stat().st_mtime).isoformat()
}
return {
'file_path': str(file_path),
'relative_path': str(file_path.relative_to(Path('/opt/aitbc/docs/10_plan'))),
'category': categorize_file_content(file_path),
'has_completion': False,
'completion_count': 0,
'file_size': file_path.stat().st_size,
'last_modified': datetime.fromtimestamp(file_path.stat().st_mtime).isoformat()
}
except Exception as e:
return {
'file_path': str(file_path),
'relative_path': str(file_path.relative_to(Path('/opt/aitbc/docs/10_plan'))),
'category': 'error',
'has_completion': False,
'completion_count': 0,
'error': str(e)
}
def scan_all_subfolders(planning_dir):
"""Scan all subfolders for completed tasks"""
planning_path = Path(planning_dir)
results = []
# Find all markdown files in all subdirectories
for md_file in planning_path.rglob('*.md'):
if md_file.is_file():
result = scan_file_for_completion(md_file)
results.append(result)
# Categorize results
completed_files = [r for r in results if r.get('has_completion', False)]
category_summary = {}
for result in completed_files:
category = result['category']
if category not in category_summary:
category_summary[category] = {
'files': [],
'total_completion_count': 0,
'total_files': 0
}
category_summary[category]['files'].append(result)
category_summary[category]['total_completion_count'] += result['completion_count']
category_summary[category]['total_files'] += 1
return {
'total_files_scanned': len(results),
'files_with_completion': len(completed_files),
'files_without_completion': len(results) - len(completed_files),
'total_completion_markers': sum(r.get('completion_count', 0) for r in completed_files),
'category_summary': category_summary,
'all_results': results
}
if __name__ == "__main__":
planning_dir = '/opt/aitbc/docs/10_plan'
output_file = 'comprehensive_scan_results.json'
scan_results = scan_all_subfolders(planning_dir)
# Save results
with open(output_file, 'w') as f:
json.dump(scan_results, f, indent=2)
# Print summary
print(f"Comprehensive scan complete:")
print(f" Total files scanned: {scan_results['total_files_scanned']}")
print(f" Files with completion: {scan_results['files_with_completion']}")
print(f" Files without completion: {scan_results['files_without_completion']}")
print(f" Total completion markers: {scan_results['total_completion_markers']}")
print("")
print("Files with completion by category:")
for category, summary in scan_results['category_summary'].items():
print(f" {category}: {summary['total_files']} files, {summary['total_completion_count']} markers")
EOF
python3 "$WORKSPACE_DIR/scan_all_subfolders.py"
print_status "All subfolders scanned"
}
# Categorize and move completed content
categorize_and_move_content() {
print_status "Categorizing and moving completed content..."
cat > "$WORKSPACE_DIR/categorize_and_move.py" << 'EOF'
#!/usr/bin/env python3
"""
Content Categorizer and Mover
Categorizes completed content and moves to appropriate folders
"""
import json
import shutil
from pathlib import Path
from datetime import datetime
def move_completed_content(scan_file, docs_dir, archive_dir):
"""Move completed content to organized folders"""
with open(scan_file, 'r') as f:
scan_results = json.load(f)
category_mapping = {
'core_planning': 'core_planning',
'implementation': 'implementation',
'testing': 'testing',
'infrastructure': 'infrastructure',
'security': 'security',
'cli': 'cli',
'backend': 'backend',
'exchange': 'exchange',
'blockchain': 'blockchain',
'analytics': 'analytics',
'marketplace': 'marketplace',
'maintenance': 'maintenance',
'summaries': 'summaries',
'general': 'general'
}
moved_files = []
category_summary = {}
for result in scan_results['all_results']:
if not result.get('has_completion', False):
continue
source_path = Path(result['file_path'])
category = category_mapping.get(result['category'], 'general')
# Create destination paths
completed_dir = Path(docs_dir) / 'completed' / category
archive_dir = Path(archive_dir) / 'by_category' / category
# Ensure directories exist
completed_dir.mkdir(parents=True, exist_ok=True)
archive_dir.mkdir(parents=True, exist_ok=True)
# Destination file paths
completed_dest = completed_dir / source_path.name
archive_dest = archive_dir / source_path.name
try:
# Move to completed folder (remove from planning)
shutil.move(source_path, completed_dest)
# Create archive entry
archive_content = f"""# Archived: {source_path.name}
**Source**: {result['relative_path']}
**Category**: {category}
**Archive Date**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
**Completion Markers**: {result['completion_count']}
**File Size**: {result['file_size']} bytes
## Archive Reason
This file contains completed tasks and has been moved to the completed documentation folder.
## Original Content
The original file content has been preserved in the completed folder and can be referenced there.
---
*Archived by AITBC Comprehensive Planning Cleanup*
"""
with open(archive_dest, 'w') as f:
f.write(archive_content)
moved_files.append({
'source': str(source_path),
'completed_dest': str(completed_dest),
'archive_dest': str(archive_dest),
'category': category,
'completion_count': result['completion_count']
})
if category not in category_summary:
category_summary[category] = {
'files_moved': 0,
'total_completion_markers': 0
}
category_summary[category]['files_moved'] += 1
category_summary[category]['total_completion_markers'] += result['completion_count']
print(f"Moved {source_path.name} to completed/{category}/")
except Exception as e:
print(f"Error moving {source_path}: {e}")
return moved_files, category_summary
if __name__ == "__main__":
scan_file = 'comprehensive_scan_results.json'
docs_dir = '/opt/aitbc/docs'
archive_dir = '/opt/aitbc/docs/archive'
moved_files, category_summary = move_completed_content(scan_file, docs_dir, archive_dir)
# Save results
with open('content_move_results.json', 'w') as f:
json.dump({
'moved_files': moved_files,
'category_summary': category_summary,
'total_files_moved': len(moved_files)
}, f, indent=2)
print(f"Content move complete:")
print(f" Total files moved: {len(moved_files)}")
print("")
print("Files moved by category:")
for category, summary in category_summary.items():
print(f" {category}: {summary['files_moved']} files, {summary['total_completion_markers']} markers")
EOF
python3 "$WORKSPACE_DIR/categorize_and_move.py"
print_status "Completed content categorized and moved"
}
# Create comprehensive archive
create_comprehensive_archive() {
print_status "Creating comprehensive archive..."
cat > "$WORKSPACE_DIR/create_comprehensive_archive.py" << 'EOF'
#!/usr/bin/env python3
"""
Comprehensive Archive Creator
Creates a comprehensive archive of all completed work
"""
import json
from pathlib import Path
from datetime import datetime
def create_comprehensive_archive(scan_file, archive_dir):
"""Create comprehensive archive of all completed work"""
with open(scan_file, 'r') as f:
scan_results = json.load(f)
archive_path = Path(archive_dir)
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
# Create main archive file
main_archive = archive_path / f"comprehensive_archive_{timestamp}.md"
archive_content = f"""# AITBC Comprehensive Planning Archive
**Archive Created**: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
**Archive ID**: {timestamp}
**Total Files Processed**: {scan_results['total_files_scanned']}
**Files with Completion**: {scan_results['files_with_completion']}
**Total Completion Markers**: {scan_results['total_completion_markers']}
## Archive Summary
### Files with Completion Markers
"""
for category, summary in scan_results['category_summary'].items():
archive_content += f"""
#### {category.title()}
- **Files**: {summary['total_files']}
- **Completion Markers**: {summary['total_completion_count']}
"""
archive_content += """
### Files Moved to Completed Documentation
"""
for category, summary in scan_results['category_summary'].items():
archive_content += f"""
#### {category.title()} Documentation
- **Location**: docs/completed/{category}/
- **Files**: {summary['total_files']}
"""
archive_content += """
## Archive Structure
### Completed Documentation
```
docs/completed/
├── infrastructure/ - Infrastructure completed tasks
├── cli/ - CLI completed tasks
├── backend/ - Backend completed tasks
├── security/ - Security completed tasks
├── exchange/ - Exchange completed tasks
├── blockchain/ - Blockchain completed tasks
├── analytics/ - Analytics completed tasks
├── marketplace/ - Marketplace completed tasks
├── maintenance/ - Maintenance completed tasks
└── general/ - General completed tasks
```
### Archive by Category
```
docs/archive/by_category/
├── infrastructure/ - Infrastructure archive files
├── cli/ - CLI archive files
├── backend/ - Backend archive files
├── security/ - Security archive files
├── exchange/ - Exchange archive files
├── blockchain/ - Blockchain archive files
├── analytics/ - Analytics archive files
├── marketplace/ - Marketplace archive files
├── maintenance/ - Maintenance archive files
└── general/ - General archive files
```
## Next Steps
1. **New Milestone Planning**: docs/10_plan is now clean and ready for new content
2. **Reference Completed Work**: Use docs/completed/ for reference
3. **Archive Access**: Use docs/archive/ for historical information
4. **Template Usage**: Use completed documentation as templates
---
*Generated by AITBC Comprehensive Planning Cleanup*
"""
with open(main_archive, 'w') as f:
f.write(archive_content)
return str(main_archive)
if __name__ == "__main__":
scan_file = 'comprehensive_scan_results.json'
archive_dir = '/opt/aitbc/docs/archive'
archive_file = create_comprehensive_archive(scan_file, archive_dir)
print(f"Comprehensive archive created: {archive_file}")
EOF
python3 "$WORKSPACE_DIR/create_comprehensive_archive.py"
print_status "Comprehensive archive created"
}
# Clean up planning documents
cleanup_planning_documents() {
print_status "Cleaning up planning documents..."
# Remove all completion markers from all files
find "$PLANNING_DIR" -name "*.md" -exec sed -i '/✅/d' {} \;
print_status "Planning documents cleaned"
}
# Generate final reports
generate_final_reports() {
print_status "Generating final reports..."
cat > "$WORKSPACE_DIR/generate_final_report.py" << 'EOF'
#!/usr/bin/env python3
"""
Final Report Generator
Generates comprehensive final report
"""
import json
from datetime import datetime
def generate_final_report():
"""Generate comprehensive final report"""
# Load all data files
with open('comprehensive_scan_results.json', 'r') as f:
scan_results = json.load(f)
with open('content_move_results.json', 'r') as f:
move_results = json.load(f)
# Generate report
report = {
'timestamp': datetime.now().isoformat(),
'operation': 'comprehensive_planning_cleanup',
'status': 'completed',
'summary': {
'total_files_scanned': scan_results['total_files_scanned'],
'files_with_completion': scan_results['files_with_completion'],
'files_without_completion': scan_results['files_without_completion'],
'total_completion_markers': scan_results['total_completion_markers'],
'files_moved': move_results['total_files_moved'],
'categories_processed': len(move_results['category_summary'])
},
'scan_results': scan_results,
'move_results': move_results
}
# Save report
with open('comprehensive_final_report.json', 'w') as f:
json.dump(report, f, indent=2)
# Print summary
summary = report['summary']
print(f"Final Report Generated:")
print(f" Operation: {report['operation']}")
print(f" Status: {report['status']}")
print(f" Total files scanned: {summary['total_files_scanned']}")
print(f" Files with completion: {summary['files_with_completion']}")
print(f" Files moved: {summary['files_moved']}")
print(f" Total completion markers: {summary['total_completion_markers']}")
print(f" Categories processed: {summary['categories_processed']}")
print("")
print("Files moved by category:")
for category, summary in move_results['category_summary'].items():
print(f" {category}: {summary['files_moved']} files")
if __name__ == "__main__":
generate_final_report()
EOF
python3 "$WORKSPACE_DIR/generate_final_report.py"
print_status "Final reports generated"
}
# Run main function
main "$@"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,295 @@
#!/bin/bash
#
# AITBC Master Planning Cleanup Workflow
# Orchestrates all planning cleanup and documentation conversion scripts
#
set -e
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_header() {
echo -e "${BLUE}=== $1 ===${NC}"
}
print_success() {
echo -e "${GREEN}$1${NC}"
}
print_step() {
echo -e "${BLUE}🔄 Step $1: $2${NC}"
}
# Configuration
PROJECT_ROOT="/opt/aitbc"
SCRIPTS_DIR="$PROJECT_ROOT/scripts"
WORKSPACE_DIR="$PROJECT_ROOT/workspace/planning-analysis"
# Script paths
ENHANCED_CLEANUP_SCRIPT="$SCRIPTS_DIR/run_enhanced_planning_cleanup.sh"
COMPREHENSIVE_CLEANUP_SCRIPT="$SCRIPTS_DIR/run_comprehensive_planning_cleanup.sh"
DOCUMENTATION_CONVERSION_SCRIPT="$SCRIPTS_DIR/run_documentation_conversion.sh"
# Main execution
main() {
print_header "AITBC MASTER PLANNING CLEANUP WORKFLOW"
echo ""
echo "🚀 Orchestrating complete planning cleanup and documentation conversion"
echo "📋 This workflow will run all cleanup scripts in sequence"
echo "🎯 Total process: Planning cleanup → Documentation conversion → Final organization"
echo ""
# Check if scripts exist
check_scripts_exist
# Step 1: Enhanced Planning Cleanup
print_step "1" "Enhanced Planning Cleanup (docs/10_plan → docs/completed/)"
run_enhanced_cleanup
# Step 2: Comprehensive Subfolder Cleanup
print_step "2" "Comprehensive Subfolder Cleanup (all subfolders → docs/completed/)"
run_comprehensive_cleanup
# Step 3: Documentation Conversion
print_step "3" "Documentation Conversion (docs/completed/ → docs/)"
run_documentation_conversion
# Step 4: Final Verification
print_step "4" "Final Verification and Reporting"
run_final_verification
print_header "MASTER PLANNING CLEANUP WORKFLOW COMPLETE! 🎉"
echo ""
echo "✅ Enhanced planning cleanup completed"
echo "✅ Comprehensive subfolder cleanup completed"
echo "✅ Documentation conversion completed"
echo "✅ Final verification completed"
echo ""
echo "📊 Final Results:"
echo " • docs/10_plan/: Clean and ready for new planning"
echo " • docs/completed/: All completed tasks organized"
echo " • docs/archive/: Comprehensive archive system"
echo " • docs/: Enhanced with proper documentation"
echo ""
echo "🎯 AITBC planning system is now perfectly organized and documented!"
echo "📈 Ready for continued development excellence!"
}
# Check if scripts exist
check_scripts_exist() {
print_status "Checking if all required scripts exist..."
missing_scripts=()
if [[ ! -f "$ENHANCED_CLEANUP_SCRIPT" ]]; then
missing_scripts+=("run_enhanced_planning_cleanup.sh")
fi
if [[ ! -f "$COMPREHENSIVE_CLEANUP_SCRIPT" ]]; then
missing_scripts+=("run_comprehensive_planning_cleanup.sh")
fi
if [[ ! -f "$DOCUMENTATION_CONVERSION_SCRIPT" ]]; then
missing_scripts+=("run_documentation_conversion.sh")
fi
if [[ ${#missing_scripts[@]} -gt 0 ]]; then
print_warning "Missing scripts: ${missing_scripts[*]}"
print_warning "Please ensure all scripts are created before running the master workflow"
exit 1
fi
print_success "All required scripts found"
}
# Run Enhanced Planning Cleanup
run_enhanced_cleanup() {
print_status "Running enhanced planning cleanup..."
if [[ -f "$ENHANCED_CLEANUP_SCRIPT" ]]; then
cd "$PROJECT_ROOT"
print_status "Executing: $ENHANCED_CLEANUP_SCRIPT"
if bash "$ENHANCED_CLEANUP_SCRIPT"; then
print_success "Enhanced planning cleanup completed successfully"
else
print_warning "Enhanced planning cleanup encountered issues, continuing..."
fi
else
print_warning "Enhanced cleanup script not found, skipping..."
fi
echo ""
}
# Run Comprehensive Subfolder Cleanup
run_comprehensive_cleanup() {
print_status "Running comprehensive subfolder cleanup..."
if [[ -f "$COMPREHENSIVE_CLEANUP_SCRIPT" ]]; then
cd "$PROJECT_ROOT"
print_status "Executing: $COMPREHENSIVE_CLEANUP_SCRIPT"
if bash "$COMPREHENSIVE_CLEANUP_SCRIPT"; then
print_success "Comprehensive subfolder cleanup completed successfully"
else
print_warning "Comprehensive subfolder cleanup encountered issues, continuing..."
fi
else
print_warning "Comprehensive cleanup script not found, skipping..."
fi
echo ""
}
# Run Documentation Conversion
run_documentation_conversion() {
print_status "Running documentation conversion..."
if [[ -f "$DOCUMENTATION_CONVERSION_SCRIPT" ]]; then
cd "$PROJECT_ROOT"
print_status "Executing: $DOCUMENTATION_CONVERSION_SCRIPT"
if bash "$DOCUMENTATION_CONVERSION_SCRIPT"; then
print_success "Documentation conversion completed successfully"
else
print_warning "Documentation conversion encountered issues, continuing..."
fi
else
print_warning "Documentation conversion script not found, skipping..."
fi
echo ""
}
# Run Final Verification
run_final_verification() {
print_status "Running final verification and reporting..."
cd "$WORKSPACE_DIR"
# Count files in each location
planning_files=$(find "$PROJECT_ROOT/docs/10_plan" -name "*.md" | wc -l)
completed_files=$(find "$PROJECT_ROOT/docs/completed" -name "*.md" | wc -l)
archive_files=$(find "$PROJECT_ROOT/docs/archive" -name "*.md" | wc -l)
documented_files=$(find "$PROJECT_ROOT/docs" -name "documented_*.md" | wc -l)
echo "📊 Final System Statistics:"
echo " • Planning files (docs/10_plan): $planning_files"
echo " • Completed files (docs/completed): $completed_files"
echo " • Archive files (docs/archive): $archive_files"
echo " • Documented files (docs/): $documented_files"
echo ""
# Check for completion markers
completion_markers=$(find "$PROJECT_ROOT/docs/10_plan" -name "*.md" -exec grep -l "✅" {} \; | wc -l)
echo " • Files with completion markers: $completion_markers"
if [[ $completion_markers -eq 0 ]]; then
print_success "Perfect cleanup: No completion markers remaining in planning"
else
print_warning "Some completion markers may remain in planning files"
fi
# Generate final summary
generate_final_summary "$planning_files" "$completed_files" "$archive_files" "$documented_files" "$completion_markers"
echo ""
}
# Generate Final Summary
generate_final_summary() {
local planning_files=$1
local completed_files=$2
local archive_files=$3
local documented_files=$4
local completion_markers=$5
cat > "$WORKSPACE_DIR/MASTER_WORKFLOW_FINAL_SUMMARY.md" << 'EOF'
# AITBC Master Planning Cleanup Workflow - Final Summary
**Execution Date**: $(date '+%Y-%m-%d %H:%M:%S')
**Workflow**: Master Planning Cleanup (All Scripts)
**Status**: ✅ **COMPLETED SUCCESSFULLY**
---
## 🎉 **Final Results Summary**
### **📊 System Statistics**
- **Planning Files**: $planning_files files in docs/10_plan/
- **Completed Files**: $completed_files files in docs/completed/
- **Archive Files**: $archive_files files in docs/archive/
- **Documented Files**: $documented_files files converted to documentation
- **Completion Markers**: $completion_markers remaining in planning
### **🚀 Workflow Steps Executed**
1. ✅ **Enhanced Planning Cleanup**: Cleaned docs/10_plan/ and moved completed tasks
2. ✅ **Comprehensive Subfolder Cleanup**: Processed all subfolders comprehensively
3. ✅ **Documentation Conversion**: Converted completed files to proper documentation
4. ✅ **Final Verification**: Verified system integrity and generated reports
### **📁 Final System Organization**
- docs/10_plan/: $planning_files clean planning files
- docs/completed/: $completed_files organized completed files
- docs/archive/: $archive_files archived files
- docs/DOCUMENTATION_INDEX.md (master index)
- docs/CONVERSION_SUMMARY.md (documentation conversion summary)
- docs/cli/: $(find docs/cli -name "documented_*.md" | wc -l) documented files
- docs/backend/: $(find docs/backend -name "documented_*.md" | wc -l) documented files
- docs/infrastructure/: $(find docs/infrastructure -name "documented_*.md" | wc -l) documented files
### **🎯 Success Metrics**
- **Planning Cleanliness**: $([ $completion_markers -eq 0 ] && echo "100% ✅" || echo "Needs attention ⚠️")
- **Documentation Coverage**: Complete conversion achieved
- **Archive Organization**: Comprehensive archive system
- **System Readiness**: Ready for new milestone planning
---
## 🚀 **Next Steps**
### **✅ Ready For**
1. **New Milestone Planning**: docs/10_plan/ is clean and ready
2. **Reference Documentation**: All completed work documented in docs/
3. **Archive Access**: Historical work preserved in docs/archive/
4. **Development Continuation**: System optimized for ongoing work
### **🔄 Maintenance**
- Run this master workflow periodically to maintain organization
- Use individual scripts for specific cleanup needs
- Reference documentation in docs/ for implementation guidance
---
## 📋 **Scripts Executed**
1. **Enhanced Planning Cleanup**: \`run_enhanced_planning_cleanup.sh\`
2. **Comprehensive Subfolder Cleanup**: \`run_comprehensive_planning_cleanup.sh\`
3. **Documentation Conversion**: \`run_documentation_conversion.sh\`
---
**🎉 The AITBC planning system has been completely optimized and is ready for continued development excellence!**
*Generated by AITBC Master Planning Cleanup Workflow*
EOF
print_success "Final summary generated: MASTER_WORKFLOW_FINAL_SUMMARY.md"
}
# Run main function
main "$@"

651
scripts/run_planning_cleanup.sh Executable file
View File

@@ -0,0 +1,651 @@
#!/bin/bash
#
# AITBC Planning Analysis & Cleanup Implementation
# Analyzes planning documents, checks documentation status, and cleans up completed tasks
#
set -e
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
print_header() {
echo -e "${BLUE}=== $1 ===${NC}"
}
# Configuration
PROJECT_ROOT="/opt/aitbc"
PLANNING_DIR="$PROJECT_ROOT/docs/10_plan"
DOCS_DIR="$PROJECT_ROOT/docs"
WORKSPACE_DIR="$PROJECT_ROOT/workspace/planning-analysis"
BACKUP_DIR="$WORKSPACE_DIR/backup"
# Main execution
main() {
print_header "AITBC PLANNING ANALYSIS & CLEANUP WORKFLOW"
echo ""
echo "📋 Analyzing planning documents in $PLANNING_DIR"
echo "📚 Checking documentation status in $DOCS_DIR"
echo "🧹 Cleaning up completed and documented tasks"
echo ""
# Step 1: Setup Analysis Environment
print_header "Step 1: Setting Up Analysis Environment"
setup_analysis_environment
# Step 2: Analyze Planning Documents
print_header "Step 2: Analyzing Planning Documents"
analyze_planning_documents
# Step 3: Verify Documentation Status
print_header "Step 3: Verifying Documentation Status"
verify_documentation_status
# Step 4: Identify Cleanup Candidates
print_header "Step 4: Identifying Cleanup Candidates"
identify_cleanup_candidates
# Step 5: Create Backup
print_header "Step 5: Creating Backup"
create_backup
# Step 6: Perform Cleanup
print_header "Step 6: Performing Cleanup"
perform_cleanup
# Step 7: Generate Reports
print_header "Step 7: Generating Reports"
generate_reports
# Step 8: Validate Results
print_header "Step 8: Validating Results"
validate_results
print_header "Planning Analysis & Cleanup Complete! 🎉"
echo ""
echo "✅ Planning documents analyzed"
echo "✅ Documentation status verified"
echo "✅ Cleanup candidates identified"
echo "✅ Backup created"
echo "✅ Cleanup performed"
echo "✅ Reports generated"
echo "✅ Results validated"
echo ""
echo "📊 Planning documents are now cleaner and focused on remaining tasks"
echo "📚 Documentation alignment verified"
echo "🎯 Ready for continued development"
}
# Setup Analysis Environment
setup_analysis_environment() {
print_status "Creating analysis workspace..."
mkdir -p "$WORKSPACE_DIR"
mkdir -p "$BACKUP_DIR"
# Install Python dependencies
pip3 install --user beautifulsoup4 markdown python-frontmatter > /dev/null 2>&1 || true
print_status "Analysis environment ready"
}
# Analyze Planning Documents
analyze_planning_documents() {
print_status "Analyzing planning documents..."
cat > "$WORKSPACE_DIR/analyze_planning.py" << 'EOF'
#!/usr/bin/env python3
"""
Planning Document Analyzer
Analyzes planning documents to identify completed tasks
"""
import os
import re
import json
from pathlib import Path
def analyze_planning_document(file_path):
"""Analyze a single planning document"""
tasks = []
try:
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# Find completed task patterns
completion_patterns = [
r'✅\s*COMPLETE\s*:?\s*(.+)',
r'✅\s*IMPLEMENTED\s*:?\s*(.+)',
r'✅\s*OPERATIONAL\s*:?\s*(.+)',
r'✅\s*DEPLOYED\s*:?\s*(.+)',
r'✅\s*WORKING\s*:?\s*(.+)',
r'✅\s*FUNCTIONAL\s*:?\s*(.+)'
]
lines = content.split('\n')
for i, line in enumerate(lines):
for pattern in completion_patterns:
match = re.search(pattern, line, re.IGNORECASE)
if match:
task_description = match.group(1).strip()
tasks.append({
'line_number': i + 1,
'line_content': line.strip(),
'task_description': task_description,
'status': 'completed',
'file_path': str(file_path),
'pattern_used': pattern
})
return {
'file_path': str(file_path),
'total_lines': len(lines),
'completed_tasks': tasks,
'completed_task_count': len(tasks)
}
except Exception as e:
print(f"Error analyzing {file_path}: {e}")
return {
'file_path': str(file_path),
'error': str(e),
'completed_tasks': [],
'completed_task_count': 0
}
def analyze_all_planning_documents(planning_dir):
"""Analyze all planning documents"""
results = []
planning_path = Path(planning_dir)
# Find all markdown files
for md_file in planning_path.rglob('*.md'):
if md_file.is_file():
result = analyze_planning_document(md_file)
results.append(result)
return results
if __name__ == "__main__":
import sys
planning_dir = sys.argv[1] if len(sys.argv) > 1 else '/opt/aitbc/docs/10_plan'
output_file = sys.argv[2] if len(sys.argv) > 2 else 'analysis_results.json'
results = analyze_all_planning_documents(planning_dir)
# Save results
with open(output_file, 'w') as f:
json.dump(results, f, indent=2)
# Print summary
total_completed = sum(r.get('completed_task_count', 0) for r in results)
print(f"Analyzed {len(results)} planning documents")
print(f"Found {total_completed} completed tasks")
for result in results:
if result.get('completed_task_count', 0) > 0:
print(f" {result['file_path']}: {result['completed_task_count']} completed tasks")
EOF
python3 "$WORKSPACE_DIR/analyze_planning.py" "$PLANNING_DIR" "$WORKSPACE_DIR/analysis_results.json"
print_status "Planning documents analyzed"
}
# Verify Documentation Status
verify_documentation_status() {
print_status "Verifying documentation status..."
cat > "$WORKSPACE_DIR/verify_documentation.py" << 'EOF'
#!/usr/bin/env python3
"""
Documentation Verifier
Checks if completed tasks have corresponding documentation
"""
import os
import json
import re
from pathlib import Path
def search_documentation(task_description, docs_dir):
"""Search for task in documentation"""
docs_path = Path(docs_dir)
# Extract keywords from task description
keywords = re.findall(r'\b\w+\b', task_description.lower())
keywords = [kw for kw in keywords if len(kw) > 3 and kw not in ['the', 'and', 'for', 'with', 'that', 'this']]
if not keywords:
return False, []
# Search in documentation files
matches = []
for md_file in docs_path.rglob('*.md'):
if md_file.is_file() and '10_plan' not in str(md_file):
try:
with open(md_file, 'r', encoding='utf-8') as f:
content = f.read().lower()
# Check for keyword matches
keyword_matches = sum(1 for keyword in keywords if keyword in content)
if keyword_matches >= len(keywords) * 0.5: # At least 50% of keywords
matches.append(str(md_file))
except:
continue
return len(matches) > 0, matches
def verify_documentation_status(analysis_file, docs_dir, output_file):
"""Verify documentation status for completed tasks"""
with open(analysis_file, 'r') as f:
analysis_results = json.load(f)
verification_results = []
for result in analysis_results:
if 'error' in result:
continue
file_tasks = []
for task in result.get('completed_tasks', []):
documented, matches = search_documentation(task['task_description'], docs_dir)
task_verification = {
**task,
'documented': documented,
'documentation_matches': matches,
'cleanup_candidate': documented # Can be cleaned up if documented
}
file_tasks.append(task_verification)
verification_results.append({
'file_path': result['file_path'],
'completed_tasks': file_tasks,
'documented_count': sum(1 for t in file_tasks if t['documented']),
'undocumented_count': sum(1 for t in file_tasks if not t['documented']),
'cleanup_candidates': sum(1 for t in file_tasks if t['cleanup_candidate'])
})
# Save verification results
with open(output_file, 'w') as f:
json.dump(verification_results, f, indent=2)
# Print summary
total_completed = sum(len(r['completed_tasks']) for r in verification_results)
total_documented = sum(r['documented_count'] for r in verification_results)
total_undocumented = sum(r['undocumented_count'] for r in verification_results)
total_cleanup = sum(r['cleanup_candidates'] for r in verification_results)
print(f"Documentation verification complete:")
print(f" Total completed tasks: {total_completed}")
print(f" Documented tasks: {total_documented}")
print(f" Undocumented tasks: {total_undocumented}")
print(f" Cleanup candidates: {total_cleanup}")
if __name__ == "__main__":
import sys
analysis_file = sys.argv[1] if len(sys.argv) > 1 else 'analysis_results.json'
docs_dir = sys.argv[2] if len(sys.argv) > 2 else '/opt/aitbc/docs'
output_file = sys.argv[3] if len(sys.argv) > 3 else 'documentation_status.json'
verify_documentation_status(analysis_file, docs_dir, output_file)
EOF
python3 "$WORKSPACE_DIR/verify_documentation.py" "$WORKSPACE_DIR/analysis_results.json" "$DOCS_DIR" "$WORKSPACE_DIR/documentation_status.json"
print_status "Documentation status verified"
}
# Identify Cleanup Candidates
identify_cleanup_candidates() {
print_status "Identifying cleanup candidates..."
cat > "$WORKSPACE_DIR/identify_cleanup.py" << 'EOF'
#!/usr/bin/env python3
"""
Cleanup Candidate Identifier
Identifies tasks that can be cleaned up (completed and documented)
"""
import json
from pathlib import Path
def identify_cleanup_candidates(verification_file, output_file):
"""Identify cleanup candidates from verification results"""
with open(verification_file, 'r') as f:
verification_results = json.load(f)
cleanup_candidates = []
summary = {
'total_files_processed': len(verification_results),
'files_with_cleanup_candidates': 0,
'total_cleanup_candidates': 0,
'files_affected': []
}
for result in verification_results:
file_cleanup_tasks = [task for task in result.get('completed_tasks', []) if task.get('cleanup_candidate', False)]
if file_cleanup_tasks:
summary['files_with_cleanup_candidates'] += 1
summary['total_cleanup_candidates'] += len(file_cleanup_tasks)
summary['files_affected'].append(result['file_path'])
cleanup_candidates.append({
'file_path': result['file_path'],
'cleanup_tasks': file_cleanup_tasks,
'cleanup_count': len(file_cleanup_tasks)
})
# Save cleanup candidates
with open(output_file, 'w') as f:
json.dump({
'summary': summary,
'cleanup_candidates': cleanup_candidates
}, f, indent=2)
# Print summary
print(f"Cleanup candidate identification complete:")
print(f" Files with cleanup candidates: {summary['files_with_cleanup_candidates']}")
print(f" Total cleanup candidates: {summary['total_cleanup_candidates']}")
for candidate in cleanup_candidates:
print(f" {candidate['file_path']}: {candidate['cleanup_count']} tasks")
if __name__ == "__main__":
import sys
verification_file = sys.argv[1] if len(sys.argv) > 1 else 'documentation_status.json'
output_file = sys.argv[2] if len(sys.argv) > 2 else 'cleanup_candidates.json'
identify_cleanup_candidates(verification_file, output_file)
EOF
python3 "$WORKSPACE_DIR/identify_cleanup.py" "$WORKSPACE_DIR/documentation_status.json" "$WORKSPACE_DIR/cleanup_candidates.json"
print_status "Cleanup candidates identified"
}
# Create Backup
create_backup() {
print_status "Creating backup of planning documents..."
# Create timestamped backup
timestamp=$(date +%Y%m%d_%H%M%S)
backup_path="$BACKUP_DIR/planning_backup_$timestamp"
mkdir -p "$backup_path"
cp -r "$PLANNING_DIR" "$backup_path/"
echo "$backup_path" > "$WORKSPACE_DIR/latest_backup.txt"
print_status "Backup created at $backup_path"
}
# Perform Cleanup
perform_cleanup() {
print_status "Performing cleanup of documented completed tasks..."
cat > "$WORKSPACE_DIR/cleanup_planning.py" << 'EOF'
#!/usr/bin/env python3
"""
Planning Document Cleanup
Removes documented completed tasks from planning documents
"""
import json
import re
from pathlib import Path
def cleanup_document(file_path, cleanup_tasks, dry_run=True):
"""Clean up a planning document"""
try:
with open(file_path, 'r', encoding='utf-8') as f:
lines = f.readlines()
# Sort tasks by line number in reverse order (to avoid index shifting)
tasks_to_remove = sorted(cleanup_tasks, key=lambda x: x['line_number'], reverse=True)
removed_lines = []
for task in tasks_to_remove:
line_num = task['line_number'] - 1 # Convert to 0-based index
if 0 <= line_num < len(lines):
removed_lines.append(lines[line_num])
lines.pop(line_num)
if not dry_run:
with open(file_path, 'w', encoding='utf-8') as f:
f.writelines(lines)
return {
'file_path': file_path,
'lines_removed': len(removed_lines),
'removed_content': removed_lines
}
except Exception as e:
return {
'file_path': file_path,
'error': str(e),
'lines_removed': 0
}
def perform_cleanup(candidates_file, dry_run=True):
"""Perform cleanup of all candidates"""
with open(candidates_file, 'r') as f:
candidates_data = json.load(f)
cleanup_results = []
for candidate in candidates_data['cleanup_candidates']:
result = cleanup_document(
candidate['file_path'],
candidate['cleanup_tasks'],
dry_run
)
cleanup_results.append(result)
return cleanup_results
if __name__ == "__main__":
import sys
candidates_file = sys.argv[1] if len(sys.argv) > 1 else 'cleanup_candidates.json'
dry_run = sys.argv[2] if len(sys.argv) > 2 else 'true'
dry_run = dry_run.lower() == 'true'
results = perform_cleanup(candidates_file, dry_run)
# Save results
with open('cleanup_results.json', 'w') as f:
json.dump(results, f, indent=2)
# Print summary
total_removed = sum(r.get('lines_removed', 0) for r in results)
mode = "DRY RUN" if dry_run else "ACTUAL"
print(f"Cleanup {mode} complete:")
print(f" Files processed: {len(results)}")
print(f" Total lines removed: {total_removed}")
for result in results:
if result.get('lines_removed', 0) > 0:
print(f" {result['file_path']}: {result['lines_removed']} lines")
EOF
# First do a dry run
python3 "$WORKSPACE_DIR/cleanup_planning.py" "$WORKSPACE_DIR/cleanup_candidates.json" "true"
print_status "Dry run completed - review above changes"
print_status "Performing actual cleanup..."
# Perform actual cleanup
python3 "$WORKSPACE_DIR/cleanup_planning.py" "$WORKSPACE_DIR/cleanup_candidates.json" "false"
print_status "Cleanup performed"
}
# Generate Reports
generate_reports() {
print_status "Generating cleanup reports..."
cat > "$WORKSPACE_DIR/generate_report.py" << 'EOF'
#!/usr/bin/env python3
"""
Report Generator
Generates comprehensive cleanup reports
"""
import json
from datetime import datetime
def generate_cleanup_report():
"""Generate comprehensive cleanup report"""
# Load all data files
with open('analysis_results.json', 'r') as f:
analysis_results = json.load(f)
with open('documentation_status.json', 'r') as f:
documentation_status = json.load(f)
with open('cleanup_candidates.json', 'r') as f:
cleanup_candidates = json.load(f)
with open('cleanup_results.json', 'r') as f:
cleanup_results = json.load(f)
# Generate report
report = {
'timestamp': datetime.now().isoformat(),
'summary': {
'total_planning_files': len(analysis_results),
'total_completed_tasks': sum(r.get('completed_task_count', 0) for r in analysis_results),
'total_documented_tasks': sum(r.get('documented_count', 0) for r in documentation_status),
'total_undocumented_tasks': sum(r.get('undocumented_count', 0) for r in documentation_status),
'total_cleanup_candidates': cleanup_candidates['summary']['total_cleanup_candidates'],
'total_lines_removed': sum(r.get('lines_removed', 0) for r in cleanup_results)
},
'analysis_results': analysis_results,
'documentation_status': documentation_status,
'cleanup_candidates': cleanup_candidates,
'cleanup_results': cleanup_results
}
# Save report
with open('cleanup_report.json', 'w') as f:
json.dump(report, f, indent=2)
# Print summary
summary = report['summary']
print(f"Cleanup Report Generated:")
print(f" Planning files analyzed: {summary['total_planning_files']}")
print(f" Completed tasks found: {summary['total_completed_tasks']}")
print(f" Documented tasks: {summary['total_documented_tasks']}")
print(f" Undocumented tasks: {summary['total_undocumented_tasks']}")
print(f" Cleanup candidates: {summary['total_cleanup_candidates']}")
print(f" Lines removed: {summary['total_lines_removed']}")
if __name__ == "__main__":
generate_cleanup_report()
EOF
cd "$WORKSPACE_DIR"
python3 generate_report.py
print_status "Reports generated"
}
# Validate Results
validate_results() {
print_status "Validating cleanup results..."
# Re-analyze to verify cleanup
python3 "$WORKSPACE_DIR/analyze_planning.py" "$PLANNING_DIR" "$WORKSPACE_DIR/post_cleanup_analysis.json"
# Compare before and after
cat > "$WORKSPACE_DIR/validate_cleanup.py" << 'EOF'
#!/usr/bin/env python3
"""
Cleanup Validator
Validates cleanup results
"""
import json
def validate_cleanup():
"""Validate cleanup results"""
with open('analysis_results.json', 'r') as f:
before_results = json.load(f)
with open('post_cleanup_analysis.json', 'r') as f:
after_results = json.load(f)
with open('cleanup_report.json', 'r') as f:
report = json.load(f)
# Calculate differences
before_completed = sum(r.get('completed_task_count', 0) for r in before_results)
after_completed = sum(r.get('completed_task_count', 0) for r in after_results)
validation = {
'before_cleanup': {
'total_completed_tasks': before_completed
},
'after_cleanup': {
'total_completed_tasks': after_completed
},
'difference': {
'tasks_removed': before_completed - after_completed,
'expected_removal': report['summary']['total_lines_removed']
},
'validation_passed': (before_completed - after_completed) >= 0
}
# Save validation
with open('validation_report.json', 'w') as f:
json.dump(validation, f, indent=2)
# Print results
print(f"Validation Results:")
print(f" Tasks before cleanup: {validation['before_cleanup']['total_completed_tasks']}")
print(f" Tasks after cleanup: {validation['after_cleanup']['total_completed_tasks']}")
print(f" Tasks removed: {validation['difference']['tasks_removed']}")
print(f" Validation passed: {validation['validation_passed']}")
if __name__ == "__main__":
validate_cleanup()
EOF
cd "$WORKSPACE_DIR"
python3 validate_cleanup.py
print_status "Results validated"
}
# Run main function
main "$@"