Spaces:
Sleeping
Sleeping
Commit ·
ed5a85a
0
Parent(s):
Heroku deployment setup
Browse files- DIAGRAMS.md +198 -0
- DOCKER_SIMPLE.md +245 -0
- HOSTING.md +237 -0
- Procfile +1 -0
- README.md +318 -0
- RESEARCH_DIAGRAMS.md +215 -0
- WEBCRAFT_PROJECT_SUMMARY.md +527 -0
- code_commenter.py +333 -0
- github_utils.py +161 -0
- main.py +215 -0
- requirements.txt +16 -0
- title_generator.py +127 -0
DIAGRAMS.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# WebCraft GitHub Integration - Visual Diagrams
|
| 2 |
+
|
| 3 |
+
This document contains professional diagrams explaining how the AI agent works in the WebCraft GitHub Integration system.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## 📊 System Architecture Diagram
|
| 8 |
+
|
| 9 |
+

|
| 10 |
+
|
| 11 |
+
**Description**: This diagram shows the overall system architecture, including:
|
| 12 |
+
- WebCraft editor as the entry point
|
| 13 |
+
- Three main API endpoints and their workflows
|
| 14 |
+
- AI models (CodeT5 and T5-small) integration
|
| 15 |
+
- GitHub repository creation and hosting
|
| 16 |
+
- Data flow between all components
|
| 17 |
+
|
| 18 |
+
---
|
| 19 |
+
|
| 20 |
+
## 🔄 AI Commenting Workflow (Flowchart)
|
| 21 |
+
|
| 22 |
+

|
| 23 |
+
|
| 24 |
+
**Description**: Detailed flowchart showing the AI code commenting process:
|
| 25 |
+
- HTML/CSS/JS parsing with BeautifulSoup4
|
| 26 |
+
- CodeT5 model integration for intelligent comment generation
|
| 27 |
+
- Decision points for comment levels (detailed/concise/minimal)
|
| 28 |
+
- Parallel processing of different code sections
|
| 29 |
+
- File reassembly with comments
|
| 30 |
+
|
| 31 |
+
---
|
| 32 |
+
|
| 33 |
+
## 📨 Upload & Resync Sequence Diagram
|
| 34 |
+
|
| 35 |
+

|
| 36 |
+
|
| 37 |
+
**Description**: UML sequence diagram illustrating:
|
| 38 |
+
- Interaction between WebCraft, API server, AI models, and GitHub
|
| 39 |
+
- Complete upload workflow with AI commenting and repository creation
|
| 40 |
+
- Resync workflow for updating existing repositories
|
| 41 |
+
- Message flow and timing between components
|
| 42 |
+
|
| 43 |
+
---
|
| 44 |
+
|
| 45 |
+
## 🎨 Diagram Generation Prompts
|
| 46 |
+
|
| 47 |
+
If you need to regenerate or modify these diagrams, here are the detailed prompts:
|
| 48 |
+
|
| 49 |
+
### 1. System Architecture Diagram Prompt
|
| 50 |
+
|
| 51 |
+
```
|
| 52 |
+
Create a professional system architecture diagram showing the WebCraft GitHub Integration workflow. The diagram should show:
|
| 53 |
+
|
| 54 |
+
1. Top section: "WebCraft Editor" box with user creating HTML/CSS/JS
|
| 55 |
+
2. Arrow down to "Export HTML File"
|
| 56 |
+
3. Three main API endpoints in the center as rounded rectangles:
|
| 57 |
+
- "/upload_website" (green)
|
| 58 |
+
- "/resync_repository" (blue)
|
| 59 |
+
- "/preview_comments" (orange)
|
| 60 |
+
|
| 61 |
+
4. For /upload_website flow, show these connected steps:
|
| 62 |
+
- "Parse HTML/CSS/JS" box
|
| 63 |
+
- "CodeT5 AI Model" cloud icon with "Generate Comments"
|
| 64 |
+
- "T5-small Model" cloud icon with "Generate Repo Name"
|
| 65 |
+
- "Create GitHub Repository" box
|
| 66 |
+
- "Upload Files" box
|
| 67 |
+
- "Enable GitHub Pages" box
|
| 68 |
+
- Final output: "Live Website URL + Repo URL"
|
| 69 |
+
|
| 70 |
+
5. For /resync_repository flow:
|
| 71 |
+
- "Get Existing Repo" box
|
| 72 |
+
- "Optional: Re-comment Code" box (dashed border)
|
| 73 |
+
- "Update Repository" box
|
| 74 |
+
- "Preserve Git History" box
|
| 75 |
+
- Output: "Updated Website"
|
| 76 |
+
|
| 77 |
+
6. For /preview_comments:
|
| 78 |
+
- "Parse File" box
|
| 79 |
+
- "Generate Comments" box
|
| 80 |
+
- Output: "Commented Code (JSON)"
|
| 81 |
+
|
| 82 |
+
7. Right side: "GitHub" logo/box showing:
|
| 83 |
+
- Repository storage
|
| 84 |
+
- GitHub Pages hosting
|
| 85 |
+
- Version control
|
| 86 |
+
|
| 87 |
+
Use professional colors: blues, greens, and oranges. Include icons for AI (brain/cloud), GitHub (octocat), and web (globe). Use arrows to show data flow. Modern, clean design with rounded corners and subtle shadows. White background.
|
| 88 |
+
```
|
| 89 |
+
|
| 90 |
+
### 2. AI Commenting Workflow Prompt
|
| 91 |
+
|
| 92 |
+
```
|
| 93 |
+
Create a detailed flowchart showing the AI code commenting process. Professional UML-style activity diagram:
|
| 94 |
+
|
| 95 |
+
START (green circle)
|
| 96 |
+
↓
|
| 97 |
+
"Receive WebCraft HTML File" (rounded rectangle)
|
| 98 |
+
↓
|
| 99 |
+
"Parse with BeautifulSoup4" (rectangle)
|
| 100 |
+
↓
|
| 101 |
+
Diamond decision: "File Valid?"
|
| 102 |
+
- NO → "Return Error" (red) → END
|
| 103 |
+
- YES → Continue
|
| 104 |
+
↓
|
| 105 |
+
"Extract Sections" (rectangle) with 3 parallel branches:
|
| 106 |
+
Branch 1: "Extract HTML Body"
|
| 107 |
+
Branch 2: "Extract <style> CSS"
|
| 108 |
+
Branch 3: "Extract <script> JS"
|
| 109 |
+
↓ (branches merge)
|
| 110 |
+
Diamond: "Add Comments Enabled?"
|
| 111 |
+
- NO → Skip to "Reassemble File"
|
| 112 |
+
- YES → Continue
|
| 113 |
+
↓
|
| 114 |
+
"Load CodeT5 Model" (cloud shape with AI icon)
|
| 115 |
+
↓
|
| 116 |
+
Three parallel processes (show as concurrent):
|
| 117 |
+
1. "Generate HTML Comments" → "Add semantic structure comments"
|
| 118 |
+
2. "Generate CSS Comments" → "Explain styling purposes"
|
| 119 |
+
3. "Generate JS Comments" → "Document event handlers & functions"
|
| 120 |
+
↓ (merge)
|
| 121 |
+
Diamond: "Comment Level?"
|
| 122 |
+
- "Detailed" → "Add comprehensive explanations"
|
| 123 |
+
- "Concise" → "Add major section comments"
|
| 124 |
+
- "Minimal" → "Skip commenting"
|
| 125 |
+
↓
|
| 126 |
+
"Reassemble HTML File" (rectangle)
|
| 127 |
+
↓
|
| 128 |
+
"Return Commented File" (rounded rectangle)
|
| 129 |
+
↓
|
| 130 |
+
END (green circle)
|
| 131 |
+
|
| 132 |
+
Use UML standard colors: blue for processes, yellow for decisions, green for start/end. Include swim lanes for different components. Professional business diagram style.
|
| 133 |
+
```
|
| 134 |
+
|
| 135 |
+
### 3. Sequence Diagram Prompt
|
| 136 |
+
|
| 137 |
+
```
|
| 138 |
+
Create a UML sequence diagram showing the interaction between WebCraft, API, AI Models, and GitHub. Professional style:
|
| 139 |
+
|
| 140 |
+
Actors/Systems (vertical lifelines from top):
|
| 141 |
+
1. "WebCraft User" (stick figure)
|
| 142 |
+
2. "FastAPI Server" (server icon)
|
| 143 |
+
3. "CodeT5 AI" (cloud with brain icon)
|
| 144 |
+
4. "T5-small AI" (cloud with brain icon)
|
| 145 |
+
5. "GitHub API" (GitHub logo)
|
| 146 |
+
|
| 147 |
+
Sequence for UPLOAD workflow:
|
| 148 |
+
1. User → API: "POST /upload_website (HTML file)"
|
| 149 |
+
2. API → API: "Save to temp directory"
|
| 150 |
+
3. API → CodeT5: "Request code comments"
|
| 151 |
+
4. CodeT5 → API: "Return commented code"
|
| 152 |
+
5. API → T5-small: "Request repo title"
|
| 153 |
+
6. T5-small → API: "Return generated title"
|
| 154 |
+
7. API → GitHub: "Create repository"
|
| 155 |
+
8. GitHub → API: "Repository created"
|
| 156 |
+
9. API → GitHub: "Upload HTML file"
|
| 157 |
+
10. API → GitHub: "Enable GitHub Pages"
|
| 158 |
+
11. GitHub → API: "Pages enabled"
|
| 159 |
+
12. API → User: "Return URLs (website + repo)"
|
| 160 |
+
|
| 161 |
+
Add a second sequence below for RESYNC:
|
| 162 |
+
1. User → API: "POST /resync_repository"
|
| 163 |
+
2. API → GitHub: "Get existing repo"
|
| 164 |
+
3. API → CodeT5: "Re-comment (optional)"
|
| 165 |
+
4. API → GitHub: "Update file"
|
| 166 |
+
5. GitHub → API: "File updated"
|
| 167 |
+
6. API → User: "Return success + URLs"
|
| 168 |
+
|
| 169 |
+
Use standard UML sequence diagram notation with activation boxes, dashed return lines, and clear message labels. Professional blue and gray color scheme.
|
| 170 |
+
```
|
| 171 |
+
|
| 172 |
+
---
|
| 173 |
+
|
| 174 |
+
## 📝 How to Use These Prompts
|
| 175 |
+
|
| 176 |
+
You can use these prompts with:
|
| 177 |
+
- **Gemini** (Google's AI) - Best for diagram generation
|
| 178 |
+
- **DALL-E** (OpenAI) - Good for creative diagrams
|
| 179 |
+
- **Midjourney** - Professional quality diagrams
|
| 180 |
+
- **Lucidchart** - Manual creation with AI assistance
|
| 181 |
+
- **Draw.io** - Free diagram tool with templates
|
| 182 |
+
|
| 183 |
+
Simply copy the prompt and paste it into your preferred AI image generation tool!
|
| 184 |
+
|
| 185 |
+
---
|
| 186 |
+
|
| 187 |
+
## 🎯 Diagram Purpose
|
| 188 |
+
|
| 189 |
+
These diagrams help:
|
| 190 |
+
- **Developers**: Understand the system architecture and data flow
|
| 191 |
+
- **Stakeholders**: Visualize how the AI integration works
|
| 192 |
+
- **Documentation**: Provide clear visual references
|
| 193 |
+
- **Presentations**: Explain the system to non-technical audiences
|
| 194 |
+
- **Onboarding**: Help new team members understand the workflow
|
| 195 |
+
|
| 196 |
+
---
|
| 197 |
+
|
| 198 |
+
*Generated for WebCraft GitHub Integration Project*
|
DOCKER_SIMPLE.md
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Simplified Docker Architecture Diagram
|
| 2 |
+
|
| 3 |
+
## ASCII Diagram (Quick Reference)
|
| 4 |
+
|
| 5 |
+
```
|
| 6 |
+
┌─────────────────────────────────────────┐
|
| 7 |
+
│ User Browser │
|
| 8 |
+
│ (HTTP/HTTPS) │
|
| 9 |
+
└──────────────┬──────────────────────────┘
|
| 10 |
+
│
|
| 11 |
+
▼
|
| 12 |
+
┌─────────────────────────────────────────┐
|
| 13 |
+
│ Nginx Container │
|
| 14 |
+
│ Reverse Proxy & SSL │
|
| 15 |
+
│ Port: 80, 443 │
|
| 16 |
+
└──────────────┬──────────────────────────┘
|
| 17 |
+
│
|
| 18 |
+
┌──────┴──────┐
|
| 19 |
+
│ │
|
| 20 |
+
▼ ▼
|
| 21 |
+
┌──────────┐ ┌──────────┐ ┌──────────┐
|
| 22 |
+
│ Frontend │ │ Backend │ │ AI │
|
| 23 |
+
│ Container│ │ API │ │ Services │
|
| 24 |
+
│ │ │ Container│ │ Container│
|
| 25 |
+
│ React/ │ │ │ │ │
|
| 26 |
+
│ Vue.js │ │ FastAPI │ │ CodeT5 │
|
| 27 |
+
│ │ │ │ │ T5-small │
|
| 28 |
+
│ Port: │ │ Port: │ │ Port: │
|
| 29 |
+
│ 3000 │ │ 8000 │ │ 5000 │
|
| 30 |
+
└────┬─────┘ └────┬─────┘ └────┬─────┘
|
| 31 |
+
│ │ │
|
| 32 |
+
└────────────┼──────────────┘
|
| 33 |
+
│
|
| 34 |
+
┌─────────┴─────────┐
|
| 35 |
+
│ │
|
| 36 |
+
▼ ▼
|
| 37 |
+
┌──────────────┐ ┌──────────────┐
|
| 38 |
+
│ PostgreSQL │ │ Redis │
|
| 39 |
+
│ Database │ │ Cache │
|
| 40 |
+
│ Container │ │ Container │
|
| 41 |
+
│ │ │ │
|
| 42 |
+
│ Port: 5432 │ │ Port: 6379 │
|
| 43 |
+
└──────────────┘ └──────────────┘
|
| 44 |
+
│ │
|
| 45 |
+
└─────────┬─────────┘
|
| 46 |
+
│
|
| 47 |
+
▼
|
| 48 |
+
┌─────────────────────────────────────────┐
|
| 49 |
+
│ Docker Compose │
|
| 50 |
+
│ Container Orchestration │
|
| 51 |
+
│ Network: webcraft-network │
|
| 52 |
+
└─────────────────────────────────────────┘
|
| 53 |
+
|
| 54 |
+
External Services:
|
| 55 |
+
┌──────────────┐
|
| 56 |
+
│ GitHub │ ◄──── API Calls
|
| 57 |
+
│ API │
|
| 58 |
+
└──────────────┘
|
| 59 |
+
```
|
| 60 |
+
|
| 61 |
+
## Simplified Diagram Prompt for Image Generation
|
| 62 |
+
|
| 63 |
+
**Use this prompt with Gemini, DALL-E, or any diagram tool:**
|
| 64 |
+
|
| 65 |
+
```
|
| 66 |
+
Create a simple, clean black and white diagram showing Docker deployment for WebCraft project.
|
| 67 |
+
|
| 68 |
+
Title: "Docker Deployment Architecture - Simplified"
|
| 69 |
+
|
| 70 |
+
Show a simple vertical stack:
|
| 71 |
+
|
| 72 |
+
TOP:
|
| 73 |
+
- Box: "User Browser"
|
| 74 |
+
- Arrow down labeled "HTTP/HTTPS"
|
| 75 |
+
|
| 76 |
+
LAYER 1 - Nginx:
|
| 77 |
+
- Rectangle: "Nginx Container"
|
| 78 |
+
- Label: "Reverse Proxy & SSL"
|
| 79 |
+
- Port: 80, 443
|
| 80 |
+
|
| 81 |
+
LAYER 2 - Application (3 boxes side by side):
|
| 82 |
+
- Box 1: "Frontend"
|
| 83 |
+
* React/Vue
|
| 84 |
+
* Port 3000
|
| 85 |
+
|
| 86 |
+
- Box 2: "Backend API"
|
| 87 |
+
* FastAPI
|
| 88 |
+
* Port 8000
|
| 89 |
+
|
| 90 |
+
- Box 3: "AI Services"
|
| 91 |
+
* CodeT5
|
| 92 |
+
* Port 5000
|
| 93 |
+
|
| 94 |
+
LAYER 3 - Data (2 boxes side by side):
|
| 95 |
+
- Box 1: "Database"
|
| 96 |
+
* PostgreSQL
|
| 97 |
+
* Port 5432
|
| 98 |
+
|
| 99 |
+
- Box 2: "Cache"
|
| 100 |
+
* Redis
|
| 101 |
+
* Port 6379
|
| 102 |
+
|
| 103 |
+
BOTTOM:
|
| 104 |
+
- Large box: "Docker Compose"
|
| 105 |
+
- Label: "Container Orchestration"
|
| 106 |
+
|
| 107 |
+
RIGHT SIDE (outside main stack):
|
| 108 |
+
- Cloud icon: "GitHub"
|
| 109 |
+
- Connected with arrow
|
| 110 |
+
|
| 111 |
+
Use:
|
| 112 |
+
- Simple rectangles only
|
| 113 |
+
- Black outlines, white fill
|
| 114 |
+
- Clear labels
|
| 115 |
+
- Minimal arrows showing data flow
|
| 116 |
+
- Clean, easy to read layout
|
| 117 |
+
- Professional but simple style
|
| 118 |
+
- No complex patterns or decorations
|
| 119 |
+
- Large, readable text
|
| 120 |
+
```
|
| 121 |
+
|
| 122 |
+
## Component Explanation
|
| 123 |
+
|
| 124 |
+
### 1. **Nginx Container** (Entry Point)
|
| 125 |
+
- Handles all incoming traffic
|
| 126 |
+
- SSL/TLS termination
|
| 127 |
+
- Routes requests to appropriate services
|
| 128 |
+
|
| 129 |
+
### 2. **Frontend Container**
|
| 130 |
+
- Serves the WebCraft UI
|
| 131 |
+
- Static files (HTML, CSS, JS)
|
| 132 |
+
- Communicates with Backend API
|
| 133 |
+
|
| 134 |
+
### 3. **Backend API Container**
|
| 135 |
+
- FastAPI application
|
| 136 |
+
- Business logic
|
| 137 |
+
- Handles file uploads and processing
|
| 138 |
+
|
| 139 |
+
### 4. **AI Services Container**
|
| 140 |
+
- CodeT5 model for commenting
|
| 141 |
+
- T5-small model for titles
|
| 142 |
+
- Isolated for resource management
|
| 143 |
+
|
| 144 |
+
### 5. **PostgreSQL Container**
|
| 145 |
+
- Stores user data
|
| 146 |
+
- Project metadata
|
| 147 |
+
- Persistent storage
|
| 148 |
+
|
| 149 |
+
### 6. **Redis Container**
|
| 150 |
+
- Session management
|
| 151 |
+
- Caching layer
|
| 152 |
+
- Fast data access
|
| 153 |
+
|
| 154 |
+
### 7. **Docker Compose**
|
| 155 |
+
- Orchestrates all containers
|
| 156 |
+
- Manages networking
|
| 157 |
+
- Handles volumes and dependencies
|
| 158 |
+
|
| 159 |
+
## Docker Compose Example
|
| 160 |
+
|
| 161 |
+
```yaml
|
| 162 |
+
version: '3.8'
|
| 163 |
+
|
| 164 |
+
services:
|
| 165 |
+
nginx:
|
| 166 |
+
image: nginx:alpine
|
| 167 |
+
ports:
|
| 168 |
+
- "80:80"
|
| 169 |
+
- "443:443"
|
| 170 |
+
depends_on:
|
| 171 |
+
- frontend
|
| 172 |
+
- backend
|
| 173 |
+
|
| 174 |
+
frontend:
|
| 175 |
+
build: ./frontend
|
| 176 |
+
ports:
|
| 177 |
+
- "3000:3000"
|
| 178 |
+
volumes:
|
| 179 |
+
- ./frontend:/app
|
| 180 |
+
|
| 181 |
+
backend:
|
| 182 |
+
build: ./backend
|
| 183 |
+
ports:
|
| 184 |
+
- "8000:8000"
|
| 185 |
+
environment:
|
| 186 |
+
- GITHUB_TOKEN=${GITHUB_TOKEN}
|
| 187 |
+
- GITHUB_USERNAME=${GITHUB_USERNAME}
|
| 188 |
+
depends_on:
|
| 189 |
+
- database
|
| 190 |
+
- redis
|
| 191 |
+
- ai-services
|
| 192 |
+
|
| 193 |
+
ai-services:
|
| 194 |
+
build: ./ai-services
|
| 195 |
+
ports:
|
| 196 |
+
- "5000:5000"
|
| 197 |
+
volumes:
|
| 198 |
+
- ./models:/models
|
| 199 |
+
|
| 200 |
+
database:
|
| 201 |
+
image: postgres:15
|
| 202 |
+
ports:
|
| 203 |
+
- "5432:5432"
|
| 204 |
+
environment:
|
| 205 |
+
- POSTGRES_PASSWORD=${DB_PASSWORD}
|
| 206 |
+
volumes:
|
| 207 |
+
- postgres-data:/var/lib/postgresql/data
|
| 208 |
+
|
| 209 |
+
redis:
|
| 210 |
+
image: redis:alpine
|
| 211 |
+
ports:
|
| 212 |
+
- "6379:6379"
|
| 213 |
+
volumes:
|
| 214 |
+
- redis-data:/data
|
| 215 |
+
|
| 216 |
+
volumes:
|
| 217 |
+
postgres-data:
|
| 218 |
+
redis-data:
|
| 219 |
+
|
| 220 |
+
networks:
|
| 221 |
+
default:
|
| 222 |
+
name: webcraft-network
|
| 223 |
+
```
|
| 224 |
+
|
| 225 |
+
## Benefits of This Architecture
|
| 226 |
+
|
| 227 |
+
✅ **Scalability**: Each service can scale independently
|
| 228 |
+
✅ **Isolation**: Services are isolated for security and stability
|
| 229 |
+
✅ **Maintainability**: Easy to update individual components
|
| 230 |
+
✅ **Portability**: Runs anywhere Docker is supported
|
| 231 |
+
✅ **Development**: Consistent environment across team
|
| 232 |
+
|
| 233 |
+
## How to Use
|
| 234 |
+
|
| 235 |
+
1. **Generate the image**: Use the prompt above with any AI image generator
|
| 236 |
+
2. **Or use online tools**:
|
| 237 |
+
- Draw.io (diagrams.net)
|
| 238 |
+
- Lucidchart
|
| 239 |
+
- Mermaid Live Editor
|
| 240 |
+
3. **Save as**: `docker_simple_architecture.png`
|
| 241 |
+
4. **Place in**: `diagrams/` folder
|
| 242 |
+
|
| 243 |
+
---
|
| 244 |
+
|
| 245 |
+
*Simplified Docker architecture for WebCraft GitHub Integration*
|
HOSTING.md
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hosting the WebCraft GitHub Integration API
|
| 2 |
+
|
| 3 |
+
## 🌐 Hosting Options
|
| 4 |
+
|
| 5 |
+
To connect this API with WebCraft, you need to host it on a publicly accessible server. Here are the best options:
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## Option 1: Render (Recommended - Free & Easy)
|
| 10 |
+
|
| 11 |
+
**Best for**: Quick deployment, free tier available
|
| 12 |
+
|
| 13 |
+
### Steps:
|
| 14 |
+
|
| 15 |
+
1. **Push your code to GitHub**:
|
| 16 |
+
```bash
|
| 17 |
+
git init
|
| 18 |
+
git add .
|
| 19 |
+
git commit -m "WebCraft GitHub Integration API"
|
| 20 |
+
git remote add origin https://github.com/YOUR_USERNAME/webcraft-api.git
|
| 21 |
+
git push -u origin main
|
| 22 |
+
```
|
| 23 |
+
|
| 24 |
+
2. **Create Render account**: Go to [render.com](https://render.com) and sign up
|
| 25 |
+
|
| 26 |
+
3. **Create New Web Service**:
|
| 27 |
+
- Click "New +" → "Web Service"
|
| 28 |
+
- Connect your GitHub repository
|
| 29 |
+
- Configure:
|
| 30 |
+
- **Name**: `webcraft-api`
|
| 31 |
+
- **Environment**: `Python 3`
|
| 32 |
+
- **Build Command**: `pip install -r requirements.txt`
|
| 33 |
+
- **Start Command**: `uvicorn main:app --host 0.0.0.0 --port $PORT`
|
| 34 |
+
|
| 35 |
+
4. **Add Environment Variables**:
|
| 36 |
+
- `GITHUB_TOKEN`: Your GitHub personal access token
|
| 37 |
+
- `GITHUB_USERNAME`: Your GitHub username
|
| 38 |
+
- `OPENAI_API_KEY`: (Optional) Your OpenAI API key
|
| 39 |
+
|
| 40 |
+
5. **Deploy**: Click "Create Web Service"
|
| 41 |
+
|
| 42 |
+
6. **Your API URL**: `https://webcraft-api.onrender.com`
|
| 43 |
+
|
| 44 |
+
**Pros**: Free tier, automatic HTTPS, easy deployment
|
| 45 |
+
**Cons**: Free tier sleeps after inactivity (30 sec cold start)
|
| 46 |
+
|
| 47 |
+
---
|
| 48 |
+
|
| 49 |
+
## Option 2: Railway
|
| 50 |
+
|
| 51 |
+
**Best for**: Better performance, generous free tier
|
| 52 |
+
|
| 53 |
+
### Steps:
|
| 54 |
+
|
| 55 |
+
1. **Push code to GitHub** (same as above)
|
| 56 |
+
|
| 57 |
+
2. **Create Railway account**: Go to [railway.app](https://railway.app)
|
| 58 |
+
|
| 59 |
+
3. **Deploy from GitHub**:
|
| 60 |
+
- Click "New Project" → "Deploy from GitHub repo"
|
| 61 |
+
- Select your repository
|
| 62 |
+
- Railway auto-detects Python and FastAPI
|
| 63 |
+
|
| 64 |
+
4. **Add Environment Variables**:
|
| 65 |
+
- Go to "Variables" tab
|
| 66 |
+
- Add `GITHUB_TOKEN`, `GITHUB_USERNAME`, `OPENAI_API_KEY`
|
| 67 |
+
|
| 68 |
+
5. **Configure Start Command**:
|
| 69 |
+
- In Settings → Deploy
|
| 70 |
+
- Start Command: `uvicorn main:app --host 0.0.0.0 --port $PORT`
|
| 71 |
+
|
| 72 |
+
6. **Generate Domain**:
|
| 73 |
+
- Go to Settings → Networking
|
| 74 |
+
- Click "Generate Domain"
|
| 75 |
+
|
| 76 |
+
7. **Your API URL**: `https://webcraft-api.up.railway.app`
|
| 77 |
+
|
| 78 |
+
**Pros**: Better free tier, faster cold starts, good performance
|
| 79 |
+
**Cons**: Free tier has monthly limits
|
| 80 |
+
|
| 81 |
+
---
|
| 82 |
+
|
| 83 |
+
## Option 3: PythonAnywhere
|
| 84 |
+
|
| 85 |
+
**Best for**: Always-on free tier (no cold starts)
|
| 86 |
+
|
| 87 |
+
### Steps:
|
| 88 |
+
|
| 89 |
+
1. **Create account**: Go to [pythonanywhere.com](https://www.pythonanywhere.com)
|
| 90 |
+
|
| 91 |
+
2. **Upload your code**:
|
| 92 |
+
- Use "Files" tab to upload or clone from GitHub
|
| 93 |
+
- Or use Bash console: `git clone https://github.com/YOUR_USERNAME/webcraft-api.git`
|
| 94 |
+
|
| 95 |
+
3. **Install dependencies**:
|
| 96 |
+
```bash
|
| 97 |
+
pip install --user -r requirements.txt
|
| 98 |
+
```
|
| 99 |
+
|
| 100 |
+
4. **Create Web App**:
|
| 101 |
+
- Go to "Web" tab → "Add a new web app"
|
| 102 |
+
- Choose "Manual configuration" → Python 3.10
|
| 103 |
+
- Set working directory to your project folder
|
| 104 |
+
|
| 105 |
+
5. **Configure WSGI**:
|
| 106 |
+
- Edit WSGI configuration file:
|
| 107 |
+
```python
|
| 108 |
+
import sys
|
| 109 |
+
path = '/home/YOUR_USERNAME/webcraft-api'
|
| 110 |
+
if path not in sys.path:
|
| 111 |
+
sys.path.append(path)
|
| 112 |
+
|
| 113 |
+
from main import app as application
|
| 114 |
+
```
|
| 115 |
+
|
| 116 |
+
6. **Set Environment Variables**:
|
| 117 |
+
- In "Web" tab, scroll to "Environment variables"
|
| 118 |
+
- Add your GitHub credentials
|
| 119 |
+
|
| 120 |
+
7. **Your API URL**: `https://YOUR_USERNAME.pythonanywhere.com`
|
| 121 |
+
|
| 122 |
+
**Pros**: Always-on (no cold starts), free tier
|
| 123 |
+
**Cons**: Limited CPU/bandwidth on free tier
|
| 124 |
+
|
| 125 |
+
---
|
| 126 |
+
|
| 127 |
+
## Option 4: Heroku
|
| 128 |
+
|
| 129 |
+
**Best for**: Professional deployment (paid)
|
| 130 |
+
|
| 131 |
+
### Steps:
|
| 132 |
+
|
| 133 |
+
1. **Install Heroku CLI**: Download from [heroku.com](https://devcenter.heroku.com/articles/heroku-cli)
|
| 134 |
+
|
| 135 |
+
2. **Create `Procfile`** in your project root:
|
| 136 |
+
```
|
| 137 |
+
web: uvicorn main:app --host 0.0.0.0 --port $PORT
|
| 138 |
+
```
|
| 139 |
+
|
| 140 |
+
3. **Deploy**:
|
| 141 |
+
```bash
|
| 142 |
+
heroku login
|
| 143 |
+
heroku create webcraft-api
|
| 144 |
+
git push heroku main
|
| 145 |
+
```
|
| 146 |
+
|
| 147 |
+
4. **Set environment variables**:
|
| 148 |
+
```bash
|
| 149 |
+
heroku config:set GITHUB_TOKEN=your_token
|
| 150 |
+
heroku config:set GITHUB_USERNAME=your_username
|
| 151 |
+
```
|
| 152 |
+
|
| 153 |
+
5. **Your API URL**: `https://webcraft-api.herokuapp.com`
|
| 154 |
+
|
| 155 |
+
**Pros**: Professional, reliable, great scaling
|
| 156 |
+
**Cons**: No free tier anymore (starts at $5/month)
|
| 157 |
+
|
| 158 |
+
---
|
| 159 |
+
|
| 160 |
+
## 🔗 Connecting to WebCraft
|
| 161 |
+
|
| 162 |
+
Once your API is hosted, use the URL in WebCraft:
|
| 163 |
+
|
| 164 |
+
### Example API Calls from WebCraft:
|
| 165 |
+
|
| 166 |
+
```javascript
|
| 167 |
+
// Upload WebCraft project
|
| 168 |
+
const formData = new FormData();
|
| 169 |
+
formData.append('file', htmlFile);
|
| 170 |
+
formData.append('add_comments', 'true');
|
| 171 |
+
formData.append('comment_level', 'concise');
|
| 172 |
+
|
| 173 |
+
fetch('https://YOUR-API-URL.com/upload_website', {
|
| 174 |
+
method: 'POST',
|
| 175 |
+
body: formData
|
| 176 |
+
})
|
| 177 |
+
.then(response => response.json())
|
| 178 |
+
.then(data => {
|
| 179 |
+
console.log('Deployed to:', data.website_url);
|
| 180 |
+
console.log('Repository:', data.repo_url);
|
| 181 |
+
});
|
| 182 |
+
```
|
| 183 |
+
|
| 184 |
+
```javascript
|
| 185 |
+
// Resync existing project
|
| 186 |
+
const formData = new FormData();
|
| 187 |
+
formData.append('file', updatedHtmlFile);
|
| 188 |
+
formData.append('repo_name', 'my-webcraft-project');
|
| 189 |
+
|
| 190 |
+
fetch('https://YOUR-API-URL.com/resync_repository', {
|
| 191 |
+
method: 'POST',
|
| 192 |
+
body: formData
|
| 193 |
+
})
|
| 194 |
+
.then(response => response.json())
|
| 195 |
+
.then(data => {
|
| 196 |
+
console.log('Synced:', data.message);
|
| 197 |
+
});
|
| 198 |
+
```
|
| 199 |
+
|
| 200 |
+
---
|
| 201 |
+
|
| 202 |
+
## 📋 Recommended Choice
|
| 203 |
+
|
| 204 |
+
**For WebCraft Integration**: Use **Render** or **Railway**
|
| 205 |
+
|
| 206 |
+
- ✅ Free tier available
|
| 207 |
+
- ✅ Automatic HTTPS
|
| 208 |
+
- ✅ Easy GitHub integration
|
| 209 |
+
- ✅ Good for API services
|
| 210 |
+
- ✅ Simple environment variable management
|
| 211 |
+
|
| 212 |
+
**Quick Start with Render**:
|
| 213 |
+
1. Push code to GitHub
|
| 214 |
+
2. Connect to Render
|
| 215 |
+
3. Add environment variables
|
| 216 |
+
4. Deploy (takes ~5 minutes)
|
| 217 |
+
5. Get your API URL
|
| 218 |
+
6. Use in WebCraft!
|
| 219 |
+
|
| 220 |
+
---
|
| 221 |
+
|
| 222 |
+
## 🔐 Security Notes
|
| 223 |
+
|
| 224 |
+
- Never expose your `.env` file
|
| 225 |
+
- Use environment variables on hosting platform
|
| 226 |
+
- Enable CORS only for your WebCraft domain in production
|
| 227 |
+
- Consider adding API authentication for production use
|
| 228 |
+
|
| 229 |
+
---
|
| 230 |
+
|
| 231 |
+
## 🚀 Next Steps
|
| 232 |
+
|
| 233 |
+
1. Choose a hosting platform
|
| 234 |
+
2. Deploy the API
|
| 235 |
+
3. Get your API URL
|
| 236 |
+
4. Update WebCraft to use the API URL
|
| 237 |
+
5. Test the integration!
|
Procfile
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
|
|
|
| 1 |
+
web: gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:$PORT
|
README.md
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# WebCraft GitHub Integration 🚀
|
| 2 |
+
|
| 3 |
+
An automated FastAPI-based tool designed for **WebCraft** - a block-based web editor. This tool automatically uploads WebCraft-generated HTML files to GitHub repositories, adds intelligent AI-powered comments to the code, enables GitHub Pages hosting, and allows seamless project resyncing.
|
| 4 |
+
|
| 5 |
+
## 📋 Overview
|
| 6 |
+
|
| 7 |
+
This project is specifically designed to integrate with **WebCraft**, a block-based web development editor. It processes the single HTML file generated by WebCraft (containing HTML, CSS, and JavaScript all in one file) and provides:
|
| 8 |
+
|
| 9 |
+
- **AI-Powered Code Commenting**: Automatically adds intelligent, contextual comments to explain HTML structure, CSS styling, and JavaScript functionality
|
| 10 |
+
- **GitHub Deployment**: Creates repositories and uploads code with GitHub Pages enabled
|
| 11 |
+
- **Repository Resync**: Updates existing repositories when WebCraft projects are modified
|
| 12 |
+
- **Comment Preview**: Preview commented code before deployment
|
| 13 |
+
|
| 14 |
+
## ✨ Features
|
| 15 |
+
|
| 16 |
+
### WebCraft Integration
|
| 17 |
+
- **Seamless WebCraft Export**: Processes combined HTML/CSS/JS files from WebCraft
|
| 18 |
+
- **AI Code Commenting**: Uses CodeT5 to add intelligent comments explaining:
|
| 19 |
+
- HTML semantic structure and purpose
|
| 20 |
+
- CSS styling decisions and design choices
|
| 21 |
+
- JavaScript functionality and event handlers
|
| 22 |
+
- **Comment Levels**: Choose between detailed, concise, or minimal commenting
|
| 23 |
+
- **Repository Resync**: Update GitHub repositories when you modify your WebCraft project
|
| 24 |
+
- **Comment Preview**: Preview AI-generated comments before deploying
|
| 25 |
+
|
| 26 |
+
### GitHub Integration
|
| 27 |
+
- **Automated Repository Creation**: Creates GitHub repositories with intelligent names
|
| 28 |
+
- **Smart Title Extraction**: Uses T5-small to generate meaningful repository names
|
| 29 |
+
- **Automatic GitHub Pages**: Enables hosting automatically
|
| 30 |
+
- **Unique Repository Names**: Handles duplicates by appending numerical suffixes
|
| 31 |
+
- **Version Control**: Preserves Git history when resyncing projects
|
| 32 |
+
|
| 33 |
+
### API Features
|
| 34 |
+
- **CORS-Enabled**: Ready for browser-based frontend integration
|
| 35 |
+
- **Flexible Authentication**: Supports both environment variables and API-provided credentials
|
| 36 |
+
- **Multiple Endpoints**: Upload, resync, and preview functionality
|
| 37 |
+
|
| 38 |
+
## 🛠️ Technologies Used
|
| 39 |
+
|
| 40 |
+
### Backend Framework
|
| 41 |
+
- **FastAPI**: Modern, fast web framework for building APIs
|
| 42 |
+
- **Uvicorn**: ASGI server for running the FastAPI application
|
| 43 |
+
|
| 44 |
+
### AI/ML
|
| 45 |
+
- **Transformers (Hugging Face)**:
|
| 46 |
+
- T5-small for repository title generation
|
| 47 |
+
- CodeT5-small for intelligent code commenting
|
| 48 |
+
- **PyTorch**: Deep learning framework for running transformer models
|
| 49 |
+
- **SentencePiece**: Tokenization library for NLP models
|
| 50 |
+
|
| 51 |
+
### Code Processing
|
| 52 |
+
- **BeautifulSoup4**: HTML/CSS/JS parsing and manipulation
|
| 53 |
+
- **HTML Parser**: Extract and analyze WebCraft-generated code structure
|
| 54 |
+
|
| 55 |
+
### GitHub Integration
|
| 56 |
+
- **PyGithub**: Python library for GitHub API v3
|
| 57 |
+
- **Requests**: HTTP library for GitHub Pages API calls
|
| 58 |
+
|
| 59 |
+
### Utilities
|
| 60 |
+
- **python-dotenv**: Environment variable management
|
| 61 |
+
- **python-multipart**: File upload handling
|
| 62 |
+
- **aiofiles**: Asynchronous file operations
|
| 63 |
+
|
| 64 |
+
## 📦 Installation
|
| 65 |
+
|
| 66 |
+
### Prerequisites
|
| 67 |
+
- Python 3.8 or higher
|
| 68 |
+
- GitHub account with a Personal Access Token
|
| 69 |
+
- Git installed on your system
|
| 70 |
+
|
| 71 |
+
### Setup Steps
|
| 72 |
+
|
| 73 |
+
1. **Clone the repository**
|
| 74 |
+
```bash
|
| 75 |
+
git clone <repository-url>
|
| 76 |
+
cd G_P_Model-main
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
2. **Install dependencies**
|
| 80 |
+
```bash
|
| 81 |
+
pip install -r requirements.txt
|
| 82 |
+
```
|
| 83 |
+
|
| 84 |
+
3. **Configure environment variables**
|
| 85 |
+
|
| 86 |
+
Create or edit the `.env` file with your credentials:
|
| 87 |
+
```env
|
| 88 |
+
GITHUB_TOKEN=your_github_personal_access_token
|
| 89 |
+
GITHUB_USERNAME=your_github_username
|
| 90 |
+
OPENAI_API_KEY=your_openai_api_key_optional
|
| 91 |
+
```
|
| 92 |
+
|
| 93 |
+
> **Note**: The OpenAI API key is optional. The project uses the local T5-small model for title generation by default.
|
| 94 |
+
|
| 95 |
+
4. **Generate a GitHub Personal Access Token**
|
| 96 |
+
- Go to GitHub Settings → Developer settings → Personal access tokens
|
| 97 |
+
- Generate a new token with `repo` and `admin:repo_hook` permissions
|
| 98 |
+
- Copy the token to your `.env` file
|
| 99 |
+
|
| 100 |
+
## 🚀 Usage
|
| 101 |
+
|
| 102 |
+
### Starting the Server
|
| 103 |
+
|
| 104 |
+
Run the FastAPI server:
|
| 105 |
+
```bash
|
| 106 |
+
uvicorn main:app --reload
|
| 107 |
+
```
|
| 108 |
+
|
| 109 |
+
The API will be available at `http://localhost:8000`
|
| 110 |
+
|
| 111 |
+
### API Endpoints
|
| 112 |
+
|
| 113 |
+
#### 1. POST `/upload_website` - Upload WebCraft Project
|
| 114 |
+
|
| 115 |
+
Upload a WebCraft-generated HTML file to GitHub with optional AI commenting.
|
| 116 |
+
|
| 117 |
+
**Parameters:**
|
| 118 |
+
- `file` (File, required): WebCraft HTML file
|
| 119 |
+
- `add_comments` (bool, default: true): Add AI comments to code
|
| 120 |
+
- `comment_level` (string, default: "concise"): "detailed", "concise", or "minimal"
|
| 121 |
+
- `github_token` (string, optional): GitHub token (uses .env if not provided)
|
| 122 |
+
- `github_username` (string, optional): GitHub username (uses .env if not provided)
|
| 123 |
+
|
| 124 |
+
**Example:**
|
| 125 |
+
```bash
|
| 126 |
+
curl -X POST "http://localhost:8000/upload_website" \
|
| 127 |
+
-F "file=@webcraft_project.html" \
|
| 128 |
+
-F "add_comments=true" \
|
| 129 |
+
-F "comment_level=concise" \
|
| 130 |
+
-F "github_token=your_token" \
|
| 131 |
+
-F "github_username=your_username"
|
| 132 |
+
```
|
| 133 |
+
|
| 134 |
+
**Success Response:**
|
| 135 |
+
```json
|
| 136 |
+
{
|
| 137 |
+
"status": "success",
|
| 138 |
+
"repo_name": "my-webcraft-project",
|
| 139 |
+
"website_url": "https://username.github.io/my-webcraft-project/"
|
| 140 |
+
}
|
| 141 |
+
```
|
| 142 |
+
|
| 143 |
+
---
|
| 144 |
+
|
| 145 |
+
#### 2. POST `/resync_repository` - Resync Existing Project
|
| 146 |
+
|
| 147 |
+
Update an existing GitHub repository with modified WebCraft project.
|
| 148 |
+
|
| 149 |
+
**Parameters:**
|
| 150 |
+
- `file` (File, required): Updated WebCraft HTML file
|
| 151 |
+
- `repo_name` (string, required): Existing repository name
|
| 152 |
+
- `add_comments` (bool, default: false): Re-add AI comments
|
| 153 |
+
- `comment_level` (string, default: "concise"): Comment detail level
|
| 154 |
+
- `github_token` (string, optional): GitHub token
|
| 155 |
+
- `github_username` (string, optional): GitHub username
|
| 156 |
+
|
| 157 |
+
**Example:**
|
| 158 |
+
```bash
|
| 159 |
+
curl -X POST "http://localhost:8000/resync_repository" \
|
| 160 |
+
-F "file=@updated_project.html" \
|
| 161 |
+
-F "repo_name=my-webcraft-project" \
|
| 162 |
+
-F "add_comments=true"
|
| 163 |
+
```
|
| 164 |
+
|
| 165 |
+
**Success Response:**
|
| 166 |
+
```json
|
| 167 |
+
{
|
| 168 |
+
"status": "success",
|
| 169 |
+
"message": "Repository synced successfully",
|
| 170 |
+
"website_url": "https://username.github.io/my-webcraft-project/",
|
| 171 |
+
"repo_url": "https://github.com/username/my-webcraft-project"
|
| 172 |
+
}
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
---
|
| 176 |
+
|
| 177 |
+
#### 3. POST `/preview_comments` - Preview AI Comments
|
| 178 |
+
|
| 179 |
+
Preview AI-generated comments without uploading to GitHub.
|
| 180 |
+
|
| 181 |
+
**Parameters:**
|
| 182 |
+
- `file` (File, required): WebCraft HTML file
|
| 183 |
+
- `comment_level` (string, default: "concise"): "detailed", "concise", or "minimal"
|
| 184 |
+
|
| 185 |
+
**Example:**
|
| 186 |
+
```bash
|
| 187 |
+
curl -X POST "http://localhost:8000/preview_comments" \
|
| 188 |
+
-F "file=@webcraft_project.html" \
|
| 189 |
+
-F "comment_level=detailed"
|
| 190 |
+
```
|
| 191 |
+
|
| 192 |
+
**Success Response:**
|
| 193 |
+
```json
|
| 194 |
+
{
|
| 195 |
+
"status": "success",
|
| 196 |
+
"commented_code": "<!DOCTYPE html>...",
|
| 197 |
+
"comment_level": "detailed"
|
| 198 |
+
}
|
| 199 |
+
```
|
| 200 |
+
|
| 201 |
+
**Error Response (all endpoints):**
|
| 202 |
+
```json
|
| 203 |
+
{
|
| 204 |
+
"status": "error",
|
| 205 |
+
"message": "Error description"
|
| 206 |
+
}
|
| 207 |
+
```
|
| 208 |
+
|
| 209 |
+
## 📁 Project Structure
|
| 210 |
+
|
| 211 |
+
```
|
| 212 |
+
G_P_Model-main/
|
| 213 |
+
├── main.py # FastAPI application with WebCraft endpoints
|
| 214 |
+
├── code_commenter.py # AI-powered code commenting for WebCraft files
|
| 215 |
+
├── title_generator.py # AI-powered repository title generation
|
| 216 |
+
├── github_utils.py # GitHub API integration and resync utilities
|
| 217 |
+
├── requirements.txt # Python dependencies
|
| 218 |
+
├── .env # Environment variables (not in git)
|
| 219 |
+
└── README.md # Project documentation
|
| 220 |
+
```
|
| 221 |
+
|
| 222 |
+
## 🧠 How It Works
|
| 223 |
+
|
| 224 |
+
### Initial Upload Workflow
|
| 225 |
+
1. **WebCraft Export**: User exports HTML file from WebCraft editor
|
| 226 |
+
2. **File Upload**: Upload to `/upload_website` endpoint
|
| 227 |
+
3. **AI Commenting**: CodeT5 adds intelligent comments to HTML/CSS/JS sections
|
| 228 |
+
4. **Title Generation**: T5-small generates repository name from content
|
| 229 |
+
5. **Repository Creation**: Creates GitHub repository with unique name
|
| 230 |
+
6. **File Upload**: Uploads commented HTML to repository
|
| 231 |
+
7. **GitHub Pages**: Automatically enables GitHub Pages hosting
|
| 232 |
+
8. **URL Return**: Returns live website URL
|
| 233 |
+
|
| 234 |
+
### Resync Workflow
|
| 235 |
+
1. **Project Modification**: User modifies project in WebCraft
|
| 236 |
+
2. **Export Updated File**: Export new HTML file
|
| 237 |
+
3. **Resync Request**: Call `/resync_repository` with repo name
|
| 238 |
+
4. **Optional Re-commenting**: Optionally update AI comments
|
| 239 |
+
5. **Repository Update**: Updates file in existing GitHub repository
|
| 240 |
+
6. **Git History**: Preserves version history with commit message
|
| 241 |
+
7. **Live Update**: GitHub Pages automatically reflects changes
|
| 242 |
+
|
| 243 |
+
## 🔧 Key Components
|
| 244 |
+
|
| 245 |
+
### `main.py`
|
| 246 |
+
- FastAPI application setup with CORS middleware
|
| 247 |
+
- Three WebCraft-specific endpoints:
|
| 248 |
+
- `/upload_website`: Upload with AI commenting
|
| 249 |
+
- `/resync_repository`: Update existing repos
|
| 250 |
+
- `/preview_comments`: Preview comments before upload
|
| 251 |
+
- Credential management and error handling
|
| 252 |
+
|
| 253 |
+
### `code_commenter.py`
|
| 254 |
+
- WebCraft HTML file parsing (HTML/CSS/JS extraction)
|
| 255 |
+
- CodeT5-powered intelligent comment generation
|
| 256 |
+
- Comment level support (detailed/concise/minimal)
|
| 257 |
+
- File reassembly with comments
|
| 258 |
+
- Semantic HTML comments
|
| 259 |
+
- CSS styling explanations
|
| 260 |
+
- JavaScript logic documentation
|
| 261 |
+
|
| 262 |
+
### `title_generator.py`
|
| 263 |
+
- HTML parsing and title extraction
|
| 264 |
+
- T5-small model integration for title generation
|
| 265 |
+
- Repository name sanitization
|
| 266 |
+
- Fallback title generation strategies
|
| 267 |
+
|
| 268 |
+
### `github_utils.py`
|
| 269 |
+
- GitHub repository creation with duplicate handling
|
| 270 |
+
- File upload and update operations
|
| 271 |
+
- Repository resync functionality
|
| 272 |
+
- GitHub Pages API integration
|
| 273 |
+
- Git history preservation
|
| 274 |
+
|
| 275 |
+
## 🔐 Security Notes
|
| 276 |
+
|
| 277 |
+
- Never commit your `.env` file to version control
|
| 278 |
+
- Keep your GitHub Personal Access Token secure
|
| 279 |
+
- Use environment variables for sensitive data
|
| 280 |
+
- The API currently allows all CORS origins (`*`) - restrict this in production
|
| 281 |
+
|
| 282 |
+
## 🤝 Contributing
|
| 283 |
+
|
| 284 |
+
Contributions are welcome! Feel free to submit issues or pull requests.
|
| 285 |
+
|
| 286 |
+
## 📄 License
|
| 287 |
+
|
| 288 |
+
This project is open-source and available for educational and commercial use.
|
| 289 |
+
|
| 290 |
+
## 🐛 Troubleshooting
|
| 291 |
+
|
| 292 |
+
### Common Issues
|
| 293 |
+
|
| 294 |
+
**Issue**: "Only .html files are accepted"
|
| 295 |
+
- **Solution**: Ensure you're uploading a file with `.html` extension from WebCraft
|
| 296 |
+
|
| 297 |
+
**Issue**: GitHub Pages activation failed
|
| 298 |
+
- **Solution**: Check that your GitHub token has `repo` and `admin:repo_hook` permissions
|
| 299 |
+
|
| 300 |
+
**Issue**: Model loading takes too long
|
| 301 |
+
- **Solution**: T5-small and CodeT5-small models download on first run. Subsequent runs will be faster. The models are cached locally.
|
| 302 |
+
|
| 303 |
+
**Issue**: Comments not appearing in code
|
| 304 |
+
- **Solution**: Ensure `add_comments=true` and `comment_level` is set to "detailed" or "concise" (not "minimal")
|
| 305 |
+
|
| 306 |
+
**Issue**: Repository not found during resync
|
| 307 |
+
- **Solution**: Verify the repository name matches exactly (case-sensitive) and that it exists in your GitHub account
|
| 308 |
+
|
| 309 |
+
**Issue**: Resync overwrites my manual changes
|
| 310 |
+
- **Solution**: Resync replaces the entire file. If you made manual changes in GitHub, they will be overwritten. Use Git history to recover if needed.
|
| 311 |
+
|
| 312 |
+
## 📞 Support
|
| 313 |
+
|
| 314 |
+
For issues or questions, please open an issue on the GitHub repository.
|
| 315 |
+
|
| 316 |
+
---
|
| 317 |
+
|
| 318 |
+
Made with ❤️ for WebCraft using FastAPI, Transformers, and CodeT5
|
RESEARCH_DIAGRAMS.md
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Research Paper Diagrams - WebCraft GitHub Integration
|
| 2 |
+
|
| 3 |
+
Professional black and white diagrams for academic research paper publication.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## 📊 Figure 1: AI-Powered Code Documentation Agent Architecture
|
| 8 |
+
|
| 9 |
+

|
| 10 |
+
|
| 11 |
+
**Caption for Research Paper:**
|
| 12 |
+
> Figure 1: Hierarchical architecture of the AI-powered code documentation agent. The system processes WebCraft-generated HTML/CSS/JS files through three parallel pipelines: (A) Code Analysis using BeautifulSoup4 parser, (B) AI Comment Generation using CodeT5 transformer model, and (C) Repository Management using T5-small model. The FastAPI REST service integrates these components and interfaces with GitHub API for automated deployment.
|
| 13 |
+
|
| 14 |
+
**Key Features:**
|
| 15 |
+
- Input Layer: WebCraft block-based editor export
|
| 16 |
+
- Processing Layer: Parallel HTML/CSS/JS parsing and AI-driven comment generation
|
| 17 |
+
- Integration Layer: RESTful API with three endpoints
|
| 18 |
+
- Output Layer: Automated GitHub repository creation and Pages hosting
|
| 19 |
+
|
| 20 |
+
**Use in Paper:** System Architecture section
|
| 21 |
+
|
| 22 |
+
---
|
| 23 |
+
|
| 24 |
+
## 🐳 Figure 2: Containerized Multi-Service Deployment Architecture
|
| 25 |
+
|
| 26 |
+

|
| 27 |
+
|
| 28 |
+
**Caption for Research Paper:**
|
| 29 |
+
> Figure 2: Centralized Docker-based deployment architecture for full-stack WebCraft applications. The system employs a microservices approach with containerized frontend (React/Vue.js), backend API (FastAPI), and AI services (CodeT5/T5-small), orchestrated through Docker Compose. Nginx reverse proxy handles load balancing and SSL termination, while PostgreSQL and Redis provide persistent storage and caching.
|
| 30 |
+
|
| 31 |
+
**Key Features:**
|
| 32 |
+
- User Layer: HTTPS client requests
|
| 33 |
+
- Reverse Proxy: Nginx with SSL/TLS termination
|
| 34 |
+
- Application Layer: Three isolated containers (Frontend, Backend, AI Services)
|
| 35 |
+
- Data Layer: PostgreSQL database and Redis cache
|
| 36 |
+
- Orchestration: Docker Compose with network bridge and volume management
|
| 37 |
+
- External Integration: GitHub API and Pages services
|
| 38 |
+
|
| 39 |
+
**Use in Paper:** Deployment Architecture or Implementation section
|
| 40 |
+
|
| 41 |
+
---
|
| 42 |
+
|
| 43 |
+
## 🔄 Figure 3: AI-Driven Code Documentation Workflow
|
| 44 |
+
|
| 45 |
+

|
| 46 |
+
|
| 47 |
+
**Caption for Research Paper:**
|
| 48 |
+
> Figure 3: Comprehensive UML activity diagram illustrating the AI-driven code documentation workflow. The process employs parallel processing for HTML, CSS, and JavaScript parsing, followed by CodeT5-based comment generation with configurable granularity levels (detailed, concise, minimal). The workflow concludes with automated GitHub repository creation and deployment via GitHub Pages.
|
| 49 |
+
|
| 50 |
+
**Key Features:**
|
| 51 |
+
- Parallel file parsing (HTML/CSS/JS)
|
| 52 |
+
- AI model integration (CodeT5 for comments, T5-small for titles)
|
| 53 |
+
- Configurable comment granularity
|
| 54 |
+
- Concurrent GitHub operations (repository creation, file upload, Pages configuration)
|
| 55 |
+
- Error handling and validation
|
| 56 |
+
- Swim lanes showing component responsibilities
|
| 57 |
+
|
| 58 |
+
**Use in Paper:** Methodology or Process Flow section
|
| 59 |
+
|
| 60 |
+
---
|
| 61 |
+
|
| 62 |
+
## 📐 Figure 4: System Components Diagram (Prompt for Generation)
|
| 63 |
+
|
| 64 |
+
**Note:** Image generation quota reached. Use this detailed prompt with Gemini, DALL-E, or diagram tools:
|
| 65 |
+
|
| 66 |
+
```
|
| 67 |
+
Create a professional black and white UML component diagram for research paper titled "WebCraft Integration System Components".
|
| 68 |
+
|
| 69 |
+
MAIN SYSTEM BOUNDARY: "WebCraft GitHub Integration Platform"
|
| 70 |
+
|
| 71 |
+
Components:
|
| 72 |
+
|
| 73 |
+
1. PRESENTATION LAYER:
|
| 74 |
+
- REST API Interface
|
| 75 |
+
- Interfaces: IUpload, IResync, IPreview
|
| 76 |
+
- Port: 8000
|
| 77 |
+
|
| 78 |
+
2. APPLICATION LAYER:
|
| 79 |
+
A. File Processing Service
|
| 80 |
+
- HTML Parser Module
|
| 81 |
+
- CSS Extractor Module
|
| 82 |
+
- JavaScript Analyzer Module
|
| 83 |
+
- Dependencies: BeautifulSoup4
|
| 84 |
+
|
| 85 |
+
B. AI Documentation Service
|
| 86 |
+
- CodeT5 Integration
|
| 87 |
+
- T5-small Integration
|
| 88 |
+
- Comment Generator
|
| 89 |
+
- Dependencies: transformers, torch
|
| 90 |
+
|
| 91 |
+
C. Repository Management Service
|
| 92 |
+
- GitHub API Client
|
| 93 |
+
- Version Control Module
|
| 94 |
+
- Pages Configuration
|
| 95 |
+
- Dependencies: PyGithub
|
| 96 |
+
|
| 97 |
+
3. DATA LAYER:
|
| 98 |
+
- Temporary File System
|
| 99 |
+
- Model Cache
|
| 100 |
+
- Configuration Store
|
| 101 |
+
|
| 102 |
+
4. EXTERNAL (outside boundary):
|
| 103 |
+
- GitHub REST API v3
|
| 104 |
+
- GitHub Pages Service
|
| 105 |
+
- WebCraft Editor
|
| 106 |
+
|
| 107 |
+
Show: Component dependencies, interfaces, data flow
|
| 108 |
+
Style: Black/white, UML 2.0 notation, professional grid
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
**Caption for Research Paper:**
|
| 112 |
+
> Figure 4: UML component diagram showing the modular architecture of the WebCraft GitHub Integration Platform. The system is organized into three layers: Presentation (REST API), Application (File Processing, AI Documentation, Repository Management), and Data (Storage Services). External dependencies include GitHub API and WebCraft Editor interface.
|
| 113 |
+
|
| 114 |
+
**Use in Paper:** System Design or Architecture section
|
| 115 |
+
|
| 116 |
+
---
|
| 117 |
+
|
| 118 |
+
## 📝 Usage Guidelines for Research Paper
|
| 119 |
+
|
| 120 |
+
### Figure Placement Recommendations:
|
| 121 |
+
|
| 122 |
+
1. **Figure 1 (AI Agent Architecture)**:
|
| 123 |
+
- Place in: Introduction or System Overview
|
| 124 |
+
- Purpose: Show high-level system design
|
| 125 |
+
- Reference: "As shown in Figure 1, the system employs a hierarchical architecture..."
|
| 126 |
+
|
| 127 |
+
2. **Figure 2 (Docker Architecture)**:
|
| 128 |
+
- Place in: Deployment/Implementation section
|
| 129 |
+
- Purpose: Demonstrate scalability and containerization
|
| 130 |
+
- Reference: "The deployment architecture (Figure 2) utilizes Docker containers..."
|
| 131 |
+
|
| 132 |
+
3. **Figure 3 (AI Workflow)**:
|
| 133 |
+
- Place in: Methodology or Algorithm section
|
| 134 |
+
- Purpose: Explain detailed process flow
|
| 135 |
+
- Reference: "Figure 3 illustrates the complete workflow from file upload to deployment..."
|
| 136 |
+
|
| 137 |
+
4. **Figure 4 (Components)**:
|
| 138 |
+
- Place in: System Design section
|
| 139 |
+
- Purpose: Show modular architecture and dependencies
|
| 140 |
+
- Reference: "The component diagram (Figure 4) demonstrates the separation of concerns..."
|
| 141 |
+
|
| 142 |
+
### Academic Writing Tips:
|
| 143 |
+
|
| 144 |
+
- **Always reference figures in text** before they appear
|
| 145 |
+
- **Use consistent numbering** (Figure 1, Figure 2, etc.)
|
| 146 |
+
- **Provide detailed captions** explaining what the figure shows
|
| 147 |
+
- **Mention key insights** from each diagram in the text
|
| 148 |
+
- **Cross-reference** related figures when discussing system integration
|
| 149 |
+
|
| 150 |
+
### LaTeX Integration:
|
| 151 |
+
|
| 152 |
+
```latex
|
| 153 |
+
\begin{figure}[htbp]
|
| 154 |
+
\centering
|
| 155 |
+
\includegraphics[width=0.8\textwidth]{diagrams/ai_agent_architecture_bw.png}
|
| 156 |
+
\caption{Hierarchical architecture of the AI-powered code documentation agent...}
|
| 157 |
+
\label{fig:ai_architecture}
|
| 158 |
+
\end{figure}
|
| 159 |
+
|
| 160 |
+
% Reference in text:
|
| 161 |
+
As shown in Figure~\ref{fig:ai_architecture}, the system employs...
|
| 162 |
+
```
|
| 163 |
+
|
| 164 |
+
### IEEE Format:
|
| 165 |
+
|
| 166 |
+
```
|
| 167 |
+
Fig. 1. AI-Powered Code Documentation Agent Architecture.
|
| 168 |
+
Fig. 2. Containerized Multi-Service Deployment Architecture.
|
| 169 |
+
Fig. 3. AI-Driven Code Documentation Workflow.
|
| 170 |
+
Fig. 4. WebCraft Integration System Components.
|
| 171 |
+
```
|
| 172 |
+
|
| 173 |
+
---
|
| 174 |
+
|
| 175 |
+
## 🎯 Diagram Quality Checklist
|
| 176 |
+
|
| 177 |
+
✅ **Professional Quality:**
|
| 178 |
+
- Black and white (publication-ready)
|
| 179 |
+
- High resolution (suitable for print)
|
| 180 |
+
- Clear labels and annotations
|
| 181 |
+
- Professional typography
|
| 182 |
+
- Consistent styling
|
| 183 |
+
|
| 184 |
+
✅ **Academic Standards:**
|
| 185 |
+
- UML-compliant notation where applicable
|
| 186 |
+
- Standard symbols and conventions
|
| 187 |
+
- Clear hierarchy and flow
|
| 188 |
+
- Proper component boundaries
|
| 189 |
+
- Legend/key included
|
| 190 |
+
|
| 191 |
+
✅ **Content Clarity:**
|
| 192 |
+
- All components labeled
|
| 193 |
+
- Data flow indicated with arrows
|
| 194 |
+
- Relationships clearly shown
|
| 195 |
+
- No ambiguous connections
|
| 196 |
+
- Technical accuracy verified
|
| 197 |
+
|
| 198 |
+
---
|
| 199 |
+
|
| 200 |
+
## 📊 Additional Diagrams You Can Generate
|
| 201 |
+
|
| 202 |
+
If needed for your research paper, you can also create:
|
| 203 |
+
|
| 204 |
+
1. **Sequence Diagram**: User-API-GitHub interaction timeline
|
| 205 |
+
2. **Class Diagram**: Object-oriented design structure
|
| 206 |
+
3. **Deployment Diagram**: Physical infrastructure layout
|
| 207 |
+
4. **State Diagram**: Application state transitions
|
| 208 |
+
5. **Data Flow Diagram**: Information flow through system
|
| 209 |
+
|
| 210 |
+
Use the prompts in `DIAGRAMS.md` as templates!
|
| 211 |
+
|
| 212 |
+
---
|
| 213 |
+
|
| 214 |
+
*Generated for WebCraft GitHub Integration Research Paper*
|
| 215 |
+
*All diagrams are publication-quality and suitable for academic journals*
|
WEBCRAFT_PROJECT_SUMMARY.md
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# WebCraft GitHub Integration - Project Summary
|
| 2 |
+
|
| 3 |
+
## 🎯 Project Overview
|
| 4 |
+
|
| 5 |
+
**WebCraft GitHub Integration** is an AI-powered FastAPI backend service that automatically deploys WebCraft-generated websites to GitHub with intelligent code commenting. It acts as a bridge between the WebCraft block-based web editor and GitHub, enabling one-click deployment with AI-enhanced documentation.
|
| 6 |
+
|
| 7 |
+
---
|
| 8 |
+
|
| 9 |
+
## 🔑 Core Purpose
|
| 10 |
+
|
| 11 |
+
This project solves a critical workflow gap for WebCraft users:
|
| 12 |
+
|
| 13 |
+
1. **Problem**: WebCraft generates single HTML files (with embedded CSS/JS), but users need to deploy them to GitHub Pages
|
| 14 |
+
2. **Solution**: Automated API that handles repository creation, AI commenting, file upload, and GitHub Pages activation
|
| 15 |
+
3. **Benefit**: Users can deploy and update their WebCraft projects with a single API call
|
| 16 |
+
|
| 17 |
+
---
|
| 18 |
+
|
| 19 |
+
## 🏗️ System Architecture
|
| 20 |
+
|
| 21 |
+
### High-Level Flow
|
| 22 |
+
|
| 23 |
+
```
|
| 24 |
+
WebCraft Editor → Export HTML → API Upload → AI Processing → GitHub Deployment → Live Website
|
| 25 |
+
```
|
| 26 |
+
|
| 27 |
+
### Core Components
|
| 28 |
+
|
| 29 |
+
#### 1. **FastAPI Application** (`main.py`)
|
| 30 |
+
- **3 REST Endpoints**:
|
| 31 |
+
- `POST /upload_website` - Initial deployment with AI commenting
|
| 32 |
+
- `POST /resync_repository` - Update existing repositories
|
| 33 |
+
- `POST /preview_comments` - Preview AI comments without deploying
|
| 34 |
+
- **CORS-enabled** for browser integration
|
| 35 |
+
- **Flexible authentication** (API params or environment variables)
|
| 36 |
+
|
| 37 |
+
#### 2. **AI Code Commenter** (`code_commenter.py`)
|
| 38 |
+
- **Purpose**: Add intelligent, contextual comments to WebCraft code
|
| 39 |
+
- **Technology**: CodeT5-small transformer model (Salesforce)
|
| 40 |
+
- **Features**:
|
| 41 |
+
- Parses HTML/CSS/JS sections using BeautifulSoup4
|
| 42 |
+
- Generates semantic comments for HTML structure
|
| 43 |
+
- Explains CSS styling decisions
|
| 44 |
+
- Documents JavaScript functionality
|
| 45 |
+
- Three comment levels: `detailed`, `concise`, `minimal`
|
| 46 |
+
- **Process**:
|
| 47 |
+
1. Parse WebCraft HTML file into sections
|
| 48 |
+
2. Generate comments for each section in parallel
|
| 49 |
+
3. Reassemble file with comments inserted
|
| 50 |
+
|
| 51 |
+
#### 3. **Repository Title Generator** (`title_generator.py`)
|
| 52 |
+
- **Purpose**: Generate meaningful repository names from HTML content
|
| 53 |
+
- **Technology**: T5-small transformer model
|
| 54 |
+
- **Fallback Strategy**:
|
| 55 |
+
1. Extract `<title>` tag from HTML
|
| 56 |
+
2. Use T5 to generate title from page content
|
| 57 |
+
3. Fallback to filename/folder name
|
| 58 |
+
- **Output**: Sanitized, GitHub-compatible repository names
|
| 59 |
+
|
| 60 |
+
#### 4. **GitHub Integration** (`github_utils.py`)
|
| 61 |
+
- **Purpose**: Handle all GitHub API operations
|
| 62 |
+
- **Technology**: PyGithub library
|
| 63 |
+
- **Features**:
|
| 64 |
+
- Repository creation with automatic name deduplication
|
| 65 |
+
- File upload and update operations
|
| 66 |
+
- GitHub Pages activation via REST API
|
| 67 |
+
- Repository resync with Git history preservation
|
| 68 |
+
- **Smart Naming**: Handles duplicates by appending `-1`, `-2`, etc.
|
| 69 |
+
|
| 70 |
+
---
|
| 71 |
+
|
| 72 |
+
## 🔄 Workflow Details
|
| 73 |
+
|
| 74 |
+
### Initial Upload Workflow
|
| 75 |
+
|
| 76 |
+
```
|
| 77 |
+
1. User exports HTML from WebCraft
|
| 78 |
+
2. POST to /upload_website with file
|
| 79 |
+
3. API validates file (.html extension)
|
| 80 |
+
4. [Optional] AI adds comments to code
|
| 81 |
+
5. T5 generates repository name from content
|
| 82 |
+
6. Create GitHub repository (auto-rename if exists)
|
| 83 |
+
7. Upload commented HTML file
|
| 84 |
+
8. Enable GitHub Pages (main branch, / path)
|
| 85 |
+
9. Return live website URL
|
| 86 |
+
```
|
| 87 |
+
|
| 88 |
+
### Resync Workflow
|
| 89 |
+
|
| 90 |
+
```
|
| 91 |
+
1. User modifies project in WebCraft
|
| 92 |
+
2. Export updated HTML
|
| 93 |
+
3. POST to /resync_repository with file + repo_name
|
| 94 |
+
4. [Optional] Re-apply AI comments
|
| 95 |
+
5. Update file in existing repository
|
| 96 |
+
6. Preserve Git commit history
|
| 97 |
+
7. GitHub Pages auto-updates
|
| 98 |
+
8. Return success confirmation
|
| 99 |
+
```
|
| 100 |
+
|
| 101 |
+
### Preview Workflow
|
| 102 |
+
|
| 103 |
+
```
|
| 104 |
+
1. User wants to see AI comments before deploying
|
| 105 |
+
2. POST to /preview_comments with file
|
| 106 |
+
3. AI processes and adds comments
|
| 107 |
+
4. Return commented code as JSON
|
| 108 |
+
5. No GitHub interaction
|
| 109 |
+
```
|
| 110 |
+
|
| 111 |
+
---
|
| 112 |
+
|
| 113 |
+
## 🤖 AI Models Used
|
| 114 |
+
|
| 115 |
+
### 1. CodeT5-small (Code Commenting)
|
| 116 |
+
- **Model**: `Salesforce/codet5-small`
|
| 117 |
+
- **Task**: Text-to-text generation (code understanding)
|
| 118 |
+
- **Purpose**: Generate intelligent comments for HTML/CSS/JS
|
| 119 |
+
- **Input**: Code snippets
|
| 120 |
+
- **Output**: Natural language explanations
|
| 121 |
+
- **Comment Types**:
|
| 122 |
+
- HTML: Semantic structure annotations
|
| 123 |
+
- CSS: Styling purpose explanations
|
| 124 |
+
- JavaScript: Function and event documentation
|
| 125 |
+
|
| 126 |
+
### 2. T5-small (Title Generation)
|
| 127 |
+
- **Model**: `t5-small`
|
| 128 |
+
- **Task**: Summarization
|
| 129 |
+
- **Purpose**: Generate repository names from page content
|
| 130 |
+
- **Input**: HTML text content (first 500 chars)
|
| 131 |
+
- **Output**: Short, descriptive title
|
| 132 |
+
- **Sanitization**: Converts to lowercase, replaces spaces with hyphens
|
| 133 |
+
|
| 134 |
+
---
|
| 135 |
+
|
| 136 |
+
## 📡 API Endpoints Reference
|
| 137 |
+
|
| 138 |
+
### 1. Upload Website
|
| 139 |
+
|
| 140 |
+
**Endpoint**: `POST /upload_website`
|
| 141 |
+
|
| 142 |
+
**Parameters**:
|
| 143 |
+
- `file` (File, required): WebCraft HTML file
|
| 144 |
+
- `add_comments` (bool, default: true): Enable AI commenting
|
| 145 |
+
- `comment_level` (string, default: "concise"): "detailed" | "concise" | "minimal"
|
| 146 |
+
- `github_token` (string, optional): GitHub PAT
|
| 147 |
+
- `github_username` (string, optional): GitHub username
|
| 148 |
+
|
| 149 |
+
**Response**:
|
| 150 |
+
```json
|
| 151 |
+
{
|
| 152 |
+
"status": "success",
|
| 153 |
+
"repo_name": "my-webcraft-project",
|
| 154 |
+
"repo_url": "https://github.com/username/my-webcraft-project",
|
| 155 |
+
"website_url": "https://username.github.io/my-webcraft-project/"
|
| 156 |
+
}
|
| 157 |
+
```
|
| 158 |
+
|
| 159 |
+
### 2. Resync Repository
|
| 160 |
+
|
| 161 |
+
**Endpoint**: `POST /resync_repository`
|
| 162 |
+
|
| 163 |
+
**Parameters**:
|
| 164 |
+
- `file` (File, required): Updated HTML file
|
| 165 |
+
- `repo_name` (string, required): Existing repository name
|
| 166 |
+
- `add_comments` (bool, default: false): Re-apply comments
|
| 167 |
+
- `comment_level` (string, default: "concise"): Comment detail level
|
| 168 |
+
- `github_token` (string, optional): GitHub PAT
|
| 169 |
+
- `github_username` (string, optional): GitHub username
|
| 170 |
+
|
| 171 |
+
**Response**:
|
| 172 |
+
```json
|
| 173 |
+
{
|
| 174 |
+
"status": "success",
|
| 175 |
+
"message": "Repository synced successfully",
|
| 176 |
+
"website_url": "https://username.github.io/my-webcraft-project/",
|
| 177 |
+
"repo_url": "https://github.com/username/my-webcraft-project"
|
| 178 |
+
}
|
| 179 |
+
```
|
| 180 |
+
|
| 181 |
+
### 3. Preview Comments
|
| 182 |
+
|
| 183 |
+
**Endpoint**: `POST /preview_comments`
|
| 184 |
+
|
| 185 |
+
**Parameters**:
|
| 186 |
+
- `file` (File, required): WebCraft HTML file
|
| 187 |
+
- `comment_level` (string, default: "concise"): Comment detail level
|
| 188 |
+
|
| 189 |
+
**Response**:
|
| 190 |
+
```json
|
| 191 |
+
{
|
| 192 |
+
"status": "success",
|
| 193 |
+
"commented_code": "<!DOCTYPE html>...",
|
| 194 |
+
"comment_level": "concise"
|
| 195 |
+
}
|
| 196 |
+
```
|
| 197 |
+
|
| 198 |
+
---
|
| 199 |
+
|
| 200 |
+
## 🛠️ Technology Stack
|
| 201 |
+
|
| 202 |
+
### Backend Framework
|
| 203 |
+
- **FastAPI**: Modern async Python web framework
|
| 204 |
+
- **Uvicorn**: ASGI server for production deployment
|
| 205 |
+
|
| 206 |
+
### AI/ML
|
| 207 |
+
- **Transformers (Hugging Face)**: Transformer model library
|
| 208 |
+
- CodeT5-small for code commenting
|
| 209 |
+
- T5-small for title generation
|
| 210 |
+
- **PyTorch**: Deep learning framework
|
| 211 |
+
- **SentencePiece**: Tokenization for NLP models
|
| 212 |
+
|
| 213 |
+
### Code Processing
|
| 214 |
+
- **BeautifulSoup4**: HTML/CSS/JS parsing and manipulation
|
| 215 |
+
- **HTML Parser**: Extract and analyze code structure
|
| 216 |
+
|
| 217 |
+
### GitHub Integration
|
| 218 |
+
- **PyGithub**: Python wrapper for GitHub API v3
|
| 219 |
+
- **Requests**: HTTP library for GitHub Pages API
|
| 220 |
+
|
| 221 |
+
### Utilities
|
| 222 |
+
- **python-dotenv**: Environment variable management
|
| 223 |
+
- **python-multipart**: File upload handling
|
| 224 |
+
- **aiofiles**: Async file operations
|
| 225 |
+
|
| 226 |
+
---
|
| 227 |
+
|
| 228 |
+
## 📦 Dependencies (requirements.txt)
|
| 229 |
+
|
| 230 |
+
```
|
| 231 |
+
fastapi
|
| 232 |
+
uvicorn
|
| 233 |
+
python-dotenv
|
| 234 |
+
PyGithub
|
| 235 |
+
aiofiles
|
| 236 |
+
openai
|
| 237 |
+
python-multipart
|
| 238 |
+
rarfile
|
| 239 |
+
requests
|
| 240 |
+
langchain
|
| 241 |
+
langchain-openai
|
| 242 |
+
transformers
|
| 243 |
+
sentencepiece
|
| 244 |
+
torch
|
| 245 |
+
beautifulsoup4
|
| 246 |
+
```
|
| 247 |
+
|
| 248 |
+
---
|
| 249 |
+
|
| 250 |
+
## 🔐 Configuration
|
| 251 |
+
|
| 252 |
+
### Environment Variables (.env)
|
| 253 |
+
|
| 254 |
+
```env
|
| 255 |
+
GITHUB_TOKEN=your_github_personal_access_token
|
| 256 |
+
GITHUB_USERNAME=your_github_username
|
| 257 |
+
OPENAI_API_KEY=your_openai_api_key_optional
|
| 258 |
+
```
|
| 259 |
+
|
| 260 |
+
### GitHub Token Permissions Required
|
| 261 |
+
- `repo` - Full repository access
|
| 262 |
+
- `admin:repo_hook` - Repository webhooks and services
|
| 263 |
+
|
| 264 |
+
---
|
| 265 |
+
|
| 266 |
+
## 🚀 Deployment Options
|
| 267 |
+
|
| 268 |
+
### Recommended: Render.com (Free Tier)
|
| 269 |
+
1. Push code to GitHub
|
| 270 |
+
2. Connect repository to Render
|
| 271 |
+
3. Configure:
|
| 272 |
+
- Build: `pip install -r requirements.txt`
|
| 273 |
+
- Start: `uvicorn main:app --host 0.0.0.0 --port $PORT`
|
| 274 |
+
4. Add environment variables
|
| 275 |
+
5. Deploy → Get public URL
|
| 276 |
+
|
| 277 |
+
### Alternative: Railway.app
|
| 278 |
+
- Better performance, generous free tier
|
| 279 |
+
- Auto-detects Python/FastAPI
|
| 280 |
+
- Simple environment variable management
|
| 281 |
+
|
| 282 |
+
### Alternative: PythonAnywhere
|
| 283 |
+
- Always-on free tier (no cold starts)
|
| 284 |
+
- Good for consistent availability
|
| 285 |
+
|
| 286 |
+
---
|
| 287 |
+
|
| 288 |
+
## 🔗 WebCraft Integration Example
|
| 289 |
+
|
| 290 |
+
### JavaScript Integration in WebCraft
|
| 291 |
+
|
| 292 |
+
```javascript
|
| 293 |
+
// Upload new WebCraft project
|
| 294 |
+
const formData = new FormData();
|
| 295 |
+
formData.append('file', htmlFile);
|
| 296 |
+
formData.append('add_comments', 'true');
|
| 297 |
+
formData.append('comment_level', 'concise');
|
| 298 |
+
|
| 299 |
+
fetch('https://YOUR-API-URL.com/upload_website', {
|
| 300 |
+
method: 'POST',
|
| 301 |
+
body: formData
|
| 302 |
+
})
|
| 303 |
+
.then(response => response.json())
|
| 304 |
+
.then(data => {
|
| 305 |
+
console.log('Deployed to:', data.website_url);
|
| 306 |
+
console.log('Repository:', data.repo_url);
|
| 307 |
+
});
|
| 308 |
+
```
|
| 309 |
+
|
| 310 |
+
```javascript
|
| 311 |
+
// Resync existing project
|
| 312 |
+
const formData = new FormData();
|
| 313 |
+
formData.append('file', updatedHtmlFile);
|
| 314 |
+
formData.append('repo_name', 'my-webcraft-project');
|
| 315 |
+
|
| 316 |
+
fetch('https://YOUR-API-URL.com/resync_repository', {
|
| 317 |
+
method: 'POST',
|
| 318 |
+
body: formData
|
| 319 |
+
})
|
| 320 |
+
.then(response => response.json())
|
| 321 |
+
.then(data => {
|
| 322 |
+
console.log('Synced:', data.message);
|
| 323 |
+
});
|
| 324 |
+
```
|
| 325 |
+
|
| 326 |
+
---
|
| 327 |
+
|
| 328 |
+
## 💡 Key Features Explained
|
| 329 |
+
|
| 330 |
+
### 1. AI-Powered Code Commenting
|
| 331 |
+
|
| 332 |
+
**What it does**: Automatically adds intelligent comments to explain code
|
| 333 |
+
|
| 334 |
+
**Example Input** (WebCraft HTML):
|
| 335 |
+
```html
|
| 336 |
+
<header>
|
| 337 |
+
<nav class="navbar">
|
| 338 |
+
<a href="#home">Home</a>
|
| 339 |
+
</nav>
|
| 340 |
+
</header>
|
| 341 |
+
```
|
| 342 |
+
|
| 343 |
+
**Example Output** (with comments):
|
| 344 |
+
```html
|
| 345 |
+
<!-- HEADER Section: Main navigation -->
|
| 346 |
+
<header>
|
| 347 |
+
<nav class="navbar">
|
| 348 |
+
<a href="#home">Home</a>
|
| 349 |
+
</nav>
|
| 350 |
+
</header>
|
| 351 |
+
```
|
| 352 |
+
|
| 353 |
+
### 2. Smart Repository Naming
|
| 354 |
+
|
| 355 |
+
**What it does**: Generates meaningful names from HTML content
|
| 356 |
+
|
| 357 |
+
**Example**:
|
| 358 |
+
- HTML title: "My Portfolio Website"
|
| 359 |
+
- Generated repo: `my-portfolio-website`
|
| 360 |
+
- If exists: `my-portfolio-website-1`, `my-portfolio-website-2`, etc.
|
| 361 |
+
|
| 362 |
+
### 3. Automatic GitHub Pages
|
| 363 |
+
|
| 364 |
+
**What it does**: Enables hosting automatically after upload
|
| 365 |
+
|
| 366 |
+
**Configuration**:
|
| 367 |
+
- Branch: `main`
|
| 368 |
+
- Path: `/` (root)
|
| 369 |
+
- Result: `https://username.github.io/repo-name/`
|
| 370 |
+
|
| 371 |
+
### 4. Repository Resync
|
| 372 |
+
|
| 373 |
+
**What it does**: Updates existing repos without losing Git history
|
| 374 |
+
|
| 375 |
+
**Benefits**:
|
| 376 |
+
- Preserves commit history
|
| 377 |
+
- Maintains repository settings
|
| 378 |
+
- Updates only the HTML file
|
| 379 |
+
- GitHub Pages auto-refreshes
|
| 380 |
+
|
| 381 |
+
---
|
| 382 |
+
|
| 383 |
+
## 🎓 Research Context
|
| 384 |
+
|
| 385 |
+
This project has academic research documentation including:
|
| 386 |
+
|
| 387 |
+
### Professional Diagrams (Black & White, Publication-Ready)
|
| 388 |
+
1. **AI Agent Architecture**: Hierarchical system design
|
| 389 |
+
2. **Docker Deployment**: Containerized full-stack architecture
|
| 390 |
+
3. **AI Workflow**: UML activity diagram of processing pipeline
|
| 391 |
+
4. **System Components**: Modular architecture diagram
|
| 392 |
+
|
| 393 |
+
### Use Cases
|
| 394 |
+
- Academic papers on AI-assisted web development
|
| 395 |
+
- Research on automated code documentation
|
| 396 |
+
- Studies on block-based programming tools
|
| 397 |
+
- DevOps automation research
|
| 398 |
+
|
| 399 |
+
---
|
| 400 |
+
|
| 401 |
+
## 🔍 Technical Highlights
|
| 402 |
+
|
| 403 |
+
### Parallel Processing
|
| 404 |
+
- HTML, CSS, and JS sections processed simultaneously
|
| 405 |
+
- Concurrent AI comment generation
|
| 406 |
+
- Optimized for performance
|
| 407 |
+
|
| 408 |
+
### Error Handling
|
| 409 |
+
- Multiple encoding attempts (UTF-8, Latin-1, CP1252, ISO-8859-1)
|
| 410 |
+
- Graceful fallbacks for AI failures
|
| 411 |
+
- Detailed error messages in API responses
|
| 412 |
+
|
| 413 |
+
### File Validation
|
| 414 |
+
- Only accepts `.html` files
|
| 415 |
+
- Validates file structure before processing
|
| 416 |
+
- Temporary directory cleanup
|
| 417 |
+
|
| 418 |
+
### Security
|
| 419 |
+
- CORS-enabled (configurable for production)
|
| 420 |
+
- Environment variable-based credentials
|
| 421 |
+
- Optional API-level authentication
|
| 422 |
+
- Token-based GitHub access
|
| 423 |
+
|
| 424 |
+
---
|
| 425 |
+
|
| 426 |
+
## 📊 Performance Considerations
|
| 427 |
+
|
| 428 |
+
### Model Loading
|
| 429 |
+
- **First Run**: Downloads CodeT5 and T5 models (~500MB total)
|
| 430 |
+
- **Subsequent Runs**: Uses cached models (fast startup)
|
| 431 |
+
- **Optimization**: Models loaded once at startup
|
| 432 |
+
|
| 433 |
+
### Cold Starts
|
| 434 |
+
- **Render Free Tier**: ~30 seconds after inactivity
|
| 435 |
+
- **Railway**: Faster cold starts
|
| 436 |
+
- **PythonAnywhere**: Always-on (no cold starts)
|
| 437 |
+
|
| 438 |
+
### Processing Time
|
| 439 |
+
- **Small HTML** (<100 lines): ~2-5 seconds
|
| 440 |
+
- **Medium HTML** (100-500 lines): ~5-15 seconds
|
| 441 |
+
- **Large HTML** (500+ lines): ~15-30 seconds
|
| 442 |
+
|
| 443 |
+
---
|
| 444 |
+
|
| 445 |
+
## 🎯 Use Cases for WebCraft
|
| 446 |
+
|
| 447 |
+
### 1. Student Projects
|
| 448 |
+
- Build website in WebCraft
|
| 449 |
+
- Deploy to GitHub with one click
|
| 450 |
+
- Get AI-commented code for learning
|
| 451 |
+
|
| 452 |
+
### 2. Portfolio Websites
|
| 453 |
+
- Create portfolio in WebCraft
|
| 454 |
+
- Auto-deploy to GitHub Pages
|
| 455 |
+
- Share live URL instantly
|
| 456 |
+
|
| 457 |
+
### 3. Prototyping
|
| 458 |
+
- Rapid prototyping in WebCraft
|
| 459 |
+
- Deploy for client review
|
| 460 |
+
- Resync after feedback
|
| 461 |
+
|
| 462 |
+
### 4. Educational Tools
|
| 463 |
+
- Teachers create examples in WebCraft
|
| 464 |
+
- Deploy with commented code
|
| 465 |
+
- Students learn from AI explanations
|
| 466 |
+
|
| 467 |
+
---
|
| 468 |
+
|
| 469 |
+
## 🚦 Status & Limitations
|
| 470 |
+
|
| 471 |
+
### Current Status
|
| 472 |
+
✅ Fully functional API
|
| 473 |
+
✅ AI commenting working
|
| 474 |
+
✅ GitHub integration complete
|
| 475 |
+
✅ Resync feature operational
|
| 476 |
+
✅ Documentation comprehensive
|
| 477 |
+
|
| 478 |
+
### Known Limitations
|
| 479 |
+
- Only processes single HTML files (WebCraft's output format)
|
| 480 |
+
- Free tier hosting has cold starts
|
| 481 |
+
- AI models require significant memory (~2GB RAM)
|
| 482 |
+
- GitHub Pages has 1GB soft limit per repository
|
| 483 |
+
|
| 484 |
+
### Future Enhancements
|
| 485 |
+
- Multi-file project support
|
| 486 |
+
- Custom domain configuration
|
| 487 |
+
- Webhook integration for auto-resync
|
| 488 |
+
- Advanced AI comment customization
|
| 489 |
+
- Analytics dashboard
|
| 490 |
+
|
| 491 |
+
---
|
| 492 |
+
|
| 493 |
+
## 📝 Summary for WebCraft Agent
|
| 494 |
+
|
| 495 |
+
**What this project is**:
|
| 496 |
+
An automated backend API that takes WebCraft's single-file HTML exports and deploys them to GitHub Pages with AI-generated code comments.
|
| 497 |
+
|
| 498 |
+
**Key capabilities**:
|
| 499 |
+
1. Upload WebCraft HTML → Get live GitHub Pages URL
|
| 500 |
+
2. AI adds intelligent comments explaining the code
|
| 501 |
+
3. Update existing projects without losing history
|
| 502 |
+
4. Preview comments before deployment
|
| 503 |
+
|
| 504 |
+
**Integration points**:
|
| 505 |
+
- WebCraft calls API endpoints with HTML file
|
| 506 |
+
- API returns GitHub repository URL and live website URL
|
| 507 |
+
- User can resync when they modify their WebCraft project
|
| 508 |
+
|
| 509 |
+
**Technical stack**:
|
| 510 |
+
FastAPI + CodeT5/T5 AI models + PyGithub + BeautifulSoup4
|
| 511 |
+
|
| 512 |
+
**Deployment**:
|
| 513 |
+
Host on Render/Railway/PythonAnywhere, expose public API URL for WebCraft to consume
|
| 514 |
+
|
| 515 |
+
---
|
| 516 |
+
|
| 517 |
+
## 📞 Quick Reference
|
| 518 |
+
|
| 519 |
+
**Start Server**: `uvicorn main:app --reload`
|
| 520 |
+
**API Base URL**: `http://localhost:8000` (local) or your hosted URL
|
| 521 |
+
**Docs**: `http://localhost:8000/docs` (FastAPI auto-generated)
|
| 522 |
+
**Main Files**: `main.py`, `code_commenter.py`, `title_generator.py`, `github_utils.py`
|
| 523 |
+
**Config**: `.env` file with GitHub credentials
|
| 524 |
+
|
| 525 |
+
---
|
| 526 |
+
|
| 527 |
+
*This summary provides complete context for AI agents to understand and work with the WebCraft GitHub Integration project.*
|
code_commenter.py
ADDED
|
@@ -0,0 +1,333 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
from bs4 import BeautifulSoup
|
| 3 |
+
from transformers import pipeline
|
| 4 |
+
import os
|
| 5 |
+
|
| 6 |
+
# Load CodeT5 model for code understanding and commenting
|
| 7 |
+
print("🚀 Loading CodeT5 model for code commenting...")
|
| 8 |
+
try:
|
| 9 |
+
# Using CodeT5-small for code-to-text generation (commenting)
|
| 10 |
+
code_commenter_model = pipeline("text2text-generation", model="Salesforce/codet5-small")
|
| 11 |
+
print("✓ CodeT5 model loaded successfully")
|
| 12 |
+
except Exception as e:
|
| 13 |
+
print(f"⚠ Warning: Could not load CodeT5 model: {e}")
|
| 14 |
+
code_commenter_model = None
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def parse_webcraft_html(file_path):
|
| 18 |
+
"""
|
| 19 |
+
Parse WebCraft-generated HTML file and extract HTML, CSS, and JS sections.
|
| 20 |
+
|
| 21 |
+
Args:
|
| 22 |
+
file_path: Path to the HTML file
|
| 23 |
+
|
| 24 |
+
Returns:
|
| 25 |
+
dict with keys: 'html', 'css', 'js', 'full_content'
|
| 26 |
+
"""
|
| 27 |
+
# Read the file with multiple encoding attempts
|
| 28 |
+
html_content = None
|
| 29 |
+
for enc in ['utf-8', 'latin-1', 'cp1252', 'iso-8859-1']:
|
| 30 |
+
try:
|
| 31 |
+
with open(file_path, 'r', encoding=enc) as f:
|
| 32 |
+
html_content = f.read()
|
| 33 |
+
break
|
| 34 |
+
except:
|
| 35 |
+
continue
|
| 36 |
+
|
| 37 |
+
if not html_content:
|
| 38 |
+
with open(file_path, 'rb') as f:
|
| 39 |
+
html_content = f.read().decode('utf-8', errors='ignore')
|
| 40 |
+
|
| 41 |
+
soup = BeautifulSoup(html_content, 'html.parser')
|
| 42 |
+
|
| 43 |
+
# Extract CSS from <style> tags
|
| 44 |
+
css_sections = []
|
| 45 |
+
for style_tag in soup.find_all('style'):
|
| 46 |
+
css_sections.append(str(style_tag))
|
| 47 |
+
|
| 48 |
+
# Extract JavaScript from <script> tags
|
| 49 |
+
js_sections = []
|
| 50 |
+
for script_tag in soup.find_all('script'):
|
| 51 |
+
# Skip external scripts
|
| 52 |
+
if not script_tag.get('src'):
|
| 53 |
+
js_sections.append(str(script_tag))
|
| 54 |
+
|
| 55 |
+
# Get the body HTML (excluding style and script tags)
|
| 56 |
+
body = soup.find('body')
|
| 57 |
+
if body:
|
| 58 |
+
# Remove style and script tags from body for clean HTML
|
| 59 |
+
for tag in body.find_all(['style', 'script']):
|
| 60 |
+
tag.decompose()
|
| 61 |
+
html_body = str(body)
|
| 62 |
+
else:
|
| 63 |
+
html_body = ""
|
| 64 |
+
|
| 65 |
+
return {
|
| 66 |
+
'full_content': html_content,
|
| 67 |
+
'html': html_body,
|
| 68 |
+
'css': '\n'.join(css_sections),
|
| 69 |
+
'js': '\n'.join(js_sections),
|
| 70 |
+
'soup': soup # Keep soup object for reassembly
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
|
| 74 |
+
def generate_html_comments(html_section, comment_level="concise"):
|
| 75 |
+
"""
|
| 76 |
+
Generate semantic comments for HTML structure.
|
| 77 |
+
|
| 78 |
+
Args:
|
| 79 |
+
html_section: HTML code string
|
| 80 |
+
comment_level: "detailed", "concise", or "minimal"
|
| 81 |
+
|
| 82 |
+
Returns:
|
| 83 |
+
HTML with added comments
|
| 84 |
+
"""
|
| 85 |
+
if not html_section or comment_level == "minimal":
|
| 86 |
+
return html_section
|
| 87 |
+
|
| 88 |
+
soup = BeautifulSoup(html_section, 'html.parser')
|
| 89 |
+
|
| 90 |
+
# Add comments to major sections
|
| 91 |
+
for tag in soup.find_all(['header', 'nav', 'main', 'section', 'article', 'aside', 'footer']):
|
| 92 |
+
# Get tag description
|
| 93 |
+
tag_name = tag.name
|
| 94 |
+
tag_class = ' '.join(tag.get('class', []))
|
| 95 |
+
tag_id = tag.get('id', '')
|
| 96 |
+
|
| 97 |
+
# Create descriptive comment
|
| 98 |
+
if tag_id:
|
| 99 |
+
comment_text = f" {tag_name.upper()} Section: {tag_id} "
|
| 100 |
+
elif tag_class:
|
| 101 |
+
comment_text = f" {tag_name.upper()} Section: {tag_class} "
|
| 102 |
+
else:
|
| 103 |
+
comment_text = f" {tag_name.upper()} Section "
|
| 104 |
+
|
| 105 |
+
# Insert comment before the tag
|
| 106 |
+
comment = soup.new_string(f"<!-- {comment_text}-->")
|
| 107 |
+
tag.insert_before(comment)
|
| 108 |
+
tag.insert_before(soup.new_string('\n'))
|
| 109 |
+
|
| 110 |
+
return str(soup)
|
| 111 |
+
|
| 112 |
+
|
| 113 |
+
def generate_css_comments(css_section, comment_level="concise"):
|
| 114 |
+
"""
|
| 115 |
+
Generate comments for CSS styles explaining design choices.
|
| 116 |
+
|
| 117 |
+
Args:
|
| 118 |
+
css_section: CSS code string (including <style> tags)
|
| 119 |
+
comment_level: "detailed", "concise", or "minimal"
|
| 120 |
+
|
| 121 |
+
Returns:
|
| 122 |
+
CSS with added comments
|
| 123 |
+
"""
|
| 124 |
+
if not css_section or comment_level == "minimal":
|
| 125 |
+
return css_section
|
| 126 |
+
|
| 127 |
+
# Extract CSS content from <style> tags
|
| 128 |
+
soup = BeautifulSoup(css_section, 'html.parser')
|
| 129 |
+
style_tags = soup.find_all('style')
|
| 130 |
+
|
| 131 |
+
commented_styles = []
|
| 132 |
+
|
| 133 |
+
for style_tag in style_tags:
|
| 134 |
+
css_content = style_tag.string if style_tag.string else ""
|
| 135 |
+
|
| 136 |
+
# Add header comment
|
| 137 |
+
header_comment = "/* ========================================\n"
|
| 138 |
+
header_comment += " WebCraft Generated Styles\n"
|
| 139 |
+
header_comment += " ======================================== */\n\n"
|
| 140 |
+
|
| 141 |
+
# Split CSS into rule blocks
|
| 142 |
+
rules = re.split(r'([\w\s\.,#:\-\[\]=\"\'\(\)]+\{[^}]*\})', css_content)
|
| 143 |
+
|
| 144 |
+
commented_css = header_comment
|
| 145 |
+
|
| 146 |
+
for rule in rules:
|
| 147 |
+
rule = rule.strip()
|
| 148 |
+
if not rule or rule == '':
|
| 149 |
+
continue
|
| 150 |
+
|
| 151 |
+
# Check if it's a CSS rule
|
| 152 |
+
if '{' in rule and '}' in rule:
|
| 153 |
+
# Extract selector
|
| 154 |
+
selector_match = re.match(r'([\w\s\.,#:\-\[\]=\"\'\(\)]+)\{', rule)
|
| 155 |
+
if selector_match:
|
| 156 |
+
selector = selector_match.group(1).strip()
|
| 157 |
+
|
| 158 |
+
# Add comment based on selector type
|
| 159 |
+
if comment_level == "detailed":
|
| 160 |
+
if selector.startswith('.'):
|
| 161 |
+
commented_css += f"/* Class: {selector} - Styling for component */\n"
|
| 162 |
+
elif selector.startswith('#'):
|
| 163 |
+
commented_css += f"/* ID: {selector} - Unique element styling */\n"
|
| 164 |
+
elif selector in ['body', 'html', '*']:
|
| 165 |
+
commented_css += f"/* Global: {selector} - Base styles */\n"
|
| 166 |
+
else:
|
| 167 |
+
commented_css += f"/* Element: {selector} */\n"
|
| 168 |
+
|
| 169 |
+
commented_css += rule + "\n\n"
|
| 170 |
+
else:
|
| 171 |
+
commented_css += rule
|
| 172 |
+
|
| 173 |
+
style_tag.string = commented_css
|
| 174 |
+
commented_styles.append(str(style_tag))
|
| 175 |
+
|
| 176 |
+
return '\n'.join(commented_styles)
|
| 177 |
+
|
| 178 |
+
|
| 179 |
+
def generate_js_comments(js_section, comment_level="concise"):
|
| 180 |
+
"""
|
| 181 |
+
Generate comments for JavaScript code explaining functionality.
|
| 182 |
+
|
| 183 |
+
Args:
|
| 184 |
+
js_section: JavaScript code string (including <script> tags)
|
| 185 |
+
comment_level: "detailed", "concise", or "minimal"
|
| 186 |
+
|
| 187 |
+
Returns:
|
| 188 |
+
JavaScript with added comments
|
| 189 |
+
"""
|
| 190 |
+
if not js_section or comment_level == "minimal":
|
| 191 |
+
return js_section
|
| 192 |
+
|
| 193 |
+
soup = BeautifulSoup(js_section, 'html.parser')
|
| 194 |
+
script_tags = soup.find_all('script')
|
| 195 |
+
|
| 196 |
+
commented_scripts = []
|
| 197 |
+
|
| 198 |
+
for script_tag in script_tags:
|
| 199 |
+
js_content = script_tag.string if script_tag.string else ""
|
| 200 |
+
|
| 201 |
+
if not js_content.strip():
|
| 202 |
+
commented_scripts.append(str(script_tag))
|
| 203 |
+
continue
|
| 204 |
+
|
| 205 |
+
# Add header comment
|
| 206 |
+
header_comment = "// ========================================\n"
|
| 207 |
+
header_comment += "// WebCraft Generated JavaScript\n"
|
| 208 |
+
header_comment += "// ========================================\n\n"
|
| 209 |
+
|
| 210 |
+
commented_js = header_comment
|
| 211 |
+
|
| 212 |
+
# Add comments for common patterns
|
| 213 |
+
lines = js_content.split('\n')
|
| 214 |
+
|
| 215 |
+
for i, line in enumerate(lines):
|
| 216 |
+
stripped = line.strip()
|
| 217 |
+
|
| 218 |
+
# Add comments for event listeners
|
| 219 |
+
if 'addEventListener' in stripped and comment_level in ["detailed", "concise"]:
|
| 220 |
+
event_match = re.search(r'addEventListener\([\'"](\w+)[\'"]', stripped)
|
| 221 |
+
if event_match:
|
| 222 |
+
event_name = event_match.group(1)
|
| 223 |
+
commented_js += f"// Event listener: Handles {event_name} event\n"
|
| 224 |
+
|
| 225 |
+
# Add comments for function declarations
|
| 226 |
+
elif stripped.startswith('function ') and comment_level in ["detailed", "concise"]:
|
| 227 |
+
func_match = re.search(r'function\s+(\w+)', stripped)
|
| 228 |
+
if func_match:
|
| 229 |
+
func_name = func_match.group(1)
|
| 230 |
+
commented_js += f"// Function: {func_name}\n"
|
| 231 |
+
|
| 232 |
+
# Add comments for DOM queries
|
| 233 |
+
elif any(x in stripped for x in ['querySelector', 'getElementById', 'getElementsBy']) and comment_level == "detailed":
|
| 234 |
+
commented_js += "// DOM element selection\n"
|
| 235 |
+
|
| 236 |
+
commented_js += line + '\n'
|
| 237 |
+
|
| 238 |
+
script_tag.string = commented_js
|
| 239 |
+
commented_scripts.append(str(script_tag))
|
| 240 |
+
|
| 241 |
+
return '\n'.join(commented_scripts)
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
def reassemble_commented_file(original_soup, commented_html, commented_css, commented_js):
|
| 245 |
+
"""
|
| 246 |
+
Reassemble the HTML file with commented sections.
|
| 247 |
+
|
| 248 |
+
Args:
|
| 249 |
+
original_soup: BeautifulSoup object of original file
|
| 250 |
+
commented_html: Commented HTML body
|
| 251 |
+
commented_css: Commented CSS sections
|
| 252 |
+
commented_js: Commented JavaScript sections
|
| 253 |
+
|
| 254 |
+
Returns:
|
| 255 |
+
Complete HTML file as string
|
| 256 |
+
"""
|
| 257 |
+
# Replace style tags
|
| 258 |
+
if commented_css:
|
| 259 |
+
for style_tag in original_soup.find_all('style'):
|
| 260 |
+
style_tag.decompose()
|
| 261 |
+
|
| 262 |
+
# Add commented CSS to head
|
| 263 |
+
head = original_soup.find('head')
|
| 264 |
+
if head:
|
| 265 |
+
css_soup = BeautifulSoup(commented_css, 'html.parser')
|
| 266 |
+
for style in css_soup.find_all('style'):
|
| 267 |
+
head.append(style)
|
| 268 |
+
|
| 269 |
+
# Replace script tags
|
| 270 |
+
if commented_js:
|
| 271 |
+
for script_tag in original_soup.find_all('script'):
|
| 272 |
+
if not script_tag.get('src'): # Only remove inline scripts
|
| 273 |
+
script_tag.decompose()
|
| 274 |
+
|
| 275 |
+
# Add commented JS to body
|
| 276 |
+
body = original_soup.find('body')
|
| 277 |
+
if body:
|
| 278 |
+
js_soup = BeautifulSoup(commented_js, 'html.parser')
|
| 279 |
+
for script in js_soup.find_all('script'):
|
| 280 |
+
body.append(script)
|
| 281 |
+
|
| 282 |
+
# Replace body content
|
| 283 |
+
if commented_html:
|
| 284 |
+
body = original_soup.find('body')
|
| 285 |
+
if body:
|
| 286 |
+
new_body = BeautifulSoup(commented_html, 'html.parser').find('body')
|
| 287 |
+
if new_body:
|
| 288 |
+
body.clear()
|
| 289 |
+
for child in new_body.children:
|
| 290 |
+
body.append(child)
|
| 291 |
+
|
| 292 |
+
return str(original_soup)
|
| 293 |
+
|
| 294 |
+
|
| 295 |
+
def add_comments_to_webcraft_file(file_path, comment_level="concise", output_path=None):
|
| 296 |
+
"""
|
| 297 |
+
Main function to add AI-powered comments to WebCraft HTML file.
|
| 298 |
+
|
| 299 |
+
Args:
|
| 300 |
+
file_path: Path to WebCraft HTML file
|
| 301 |
+
comment_level: "detailed", "concise", or "minimal"
|
| 302 |
+
output_path: Optional output path (if None, overwrites original)
|
| 303 |
+
|
| 304 |
+
Returns:
|
| 305 |
+
Path to commented file
|
| 306 |
+
"""
|
| 307 |
+
print(f"📝 Adding {comment_level} comments to WebCraft file...")
|
| 308 |
+
|
| 309 |
+
# Parse the file
|
| 310 |
+
sections = parse_webcraft_html(file_path)
|
| 311 |
+
|
| 312 |
+
# Generate comments for each section
|
| 313 |
+
commented_html = generate_html_comments(sections['html'], comment_level)
|
| 314 |
+
commented_css = generate_css_comments(sections['css'], comment_level)
|
| 315 |
+
commented_js = generate_js_comments(sections['js'], comment_level)
|
| 316 |
+
|
| 317 |
+
# Reassemble the file
|
| 318 |
+
final_html = reassemble_commented_file(
|
| 319 |
+
sections['soup'],
|
| 320 |
+
commented_html,
|
| 321 |
+
commented_css,
|
| 322 |
+
commented_js
|
| 323 |
+
)
|
| 324 |
+
|
| 325 |
+
# Write to output
|
| 326 |
+
if output_path is None:
|
| 327 |
+
output_path = file_path
|
| 328 |
+
|
| 329 |
+
with open(output_path, 'w', encoding='utf-8') as f:
|
| 330 |
+
f.write(final_html)
|
| 331 |
+
|
| 332 |
+
print(f"✓ Comments added successfully to {output_path}")
|
| 333 |
+
return output_path
|
github_utils.py
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
from github import Github
|
| 3 |
+
import requests
|
| 4 |
+
import random
|
| 5 |
+
import string
|
| 6 |
+
|
| 7 |
+
def create_github_repo(token, repo_name, private=False):
|
| 8 |
+
"""إنشاء ريبوزيتوري جديد على GitHub مع التحقق من الاسم الفريد"""
|
| 9 |
+
g = Github(token)
|
| 10 |
+
user = g.get_user()
|
| 11 |
+
|
| 12 |
+
# Try to create repo with original name
|
| 13 |
+
original_name = repo_name
|
| 14 |
+
counter = 1
|
| 15 |
+
max_attempts = 100 # Allow up to 100 attempts (my-website-1 through my-website-100)
|
| 16 |
+
|
| 17 |
+
for attempt in range(max_attempts):
|
| 18 |
+
try:
|
| 19 |
+
repo = user.create_repo(repo_name, private=private)
|
| 20 |
+
return repo
|
| 21 |
+
except Exception as e:
|
| 22 |
+
error_str = str(e)
|
| 23 |
+
# Check if error is due to name already existing
|
| 24 |
+
if "name already exists" in error_str or "422" in error_str:
|
| 25 |
+
# Add number suffix: (1), (2), (3), etc.
|
| 26 |
+
repo_name = f"{original_name}-{counter}"
|
| 27 |
+
counter += 1
|
| 28 |
+
else:
|
| 29 |
+
# Different error, re-raise
|
| 30 |
+
raise
|
| 31 |
+
|
| 32 |
+
# If all attempts failed, raise the last exception
|
| 33 |
+
raise Exception(f"Failed to create repository after {max_attempts} attempts")
|
| 34 |
+
|
| 35 |
+
def upload_files_to_repo(repo, local_dir, branch="main"):
|
| 36 |
+
"""رفع كل الملفات من مجلد محلي إلى الريبو"""
|
| 37 |
+
for root, _, files in os.walk(local_dir):
|
| 38 |
+
for file_name in files:
|
| 39 |
+
full_path = os.path.join(root, file_name)
|
| 40 |
+
with open(full_path, "rb") as f:
|
| 41 |
+
content = f.read()
|
| 42 |
+
relative_path = os.path.relpath(full_path, local_dir)
|
| 43 |
+
repo.create_file(
|
| 44 |
+
path=relative_path,
|
| 45 |
+
message=f"Add {relative_path}",
|
| 46 |
+
content=content,
|
| 47 |
+
branch=branch
|
| 48 |
+
)
|
| 49 |
+
|
| 50 |
+
def enable_github_pages(username, repo_name, token):
|
| 51 |
+
"""تفعيل GitHub Pages"""
|
| 52 |
+
pages_url = f"https://api.github.com/repos/{username}/{repo_name}/pages"
|
| 53 |
+
headers = {
|
| 54 |
+
"Authorization": f"token {token}",
|
| 55 |
+
"Accept": "application/vnd.github.v3+json"
|
| 56 |
+
}
|
| 57 |
+
payload = {"source": {"branch": "main", "path": "/"}}
|
| 58 |
+
response = requests.post(pages_url, headers=headers, json=payload)
|
| 59 |
+
return response.status_code in [201, 204]
|
| 60 |
+
|
| 61 |
+
def get_repository(username, repo_name, token):
|
| 62 |
+
"""
|
| 63 |
+
Retrieve an existing GitHub repository.
|
| 64 |
+
|
| 65 |
+
Args:
|
| 66 |
+
username: GitHub username
|
| 67 |
+
repo_name: Repository name
|
| 68 |
+
token: GitHub personal access token
|
| 69 |
+
|
| 70 |
+
Returns:
|
| 71 |
+
Repository object or None if not found
|
| 72 |
+
"""
|
| 73 |
+
try:
|
| 74 |
+
g = Github(token)
|
| 75 |
+
repo = g.get_repo(f"{username}/{repo_name}")
|
| 76 |
+
return repo
|
| 77 |
+
except Exception as e:
|
| 78 |
+
print(f"⚠ Repository not found: {e}")
|
| 79 |
+
return None
|
| 80 |
+
|
| 81 |
+
def update_file_in_repo(repo, file_path, content, commit_message="Update file"):
|
| 82 |
+
"""
|
| 83 |
+
Update an existing file in the repository.
|
| 84 |
+
|
| 85 |
+
Args:
|
| 86 |
+
repo: Repository object
|
| 87 |
+
file_path: Path to file in repository (e.g., "index.html")
|
| 88 |
+
content: New file content (string or bytes)
|
| 89 |
+
commit_message: Commit message
|
| 90 |
+
|
| 91 |
+
Returns:
|
| 92 |
+
True if successful, False otherwise
|
| 93 |
+
"""
|
| 94 |
+
try:
|
| 95 |
+
# Get the file from the repository
|
| 96 |
+
file = repo.get_contents(file_path)
|
| 97 |
+
|
| 98 |
+
# Update the file
|
| 99 |
+
repo.update_file(
|
| 100 |
+
path=file_path,
|
| 101 |
+
message=commit_message,
|
| 102 |
+
content=content,
|
| 103 |
+
sha=file.sha,
|
| 104 |
+
branch="main"
|
| 105 |
+
)
|
| 106 |
+
print(f"✓ Updated {file_path} in repository")
|
| 107 |
+
return True
|
| 108 |
+
except Exception as e:
|
| 109 |
+
print(f"⚠ Error updating file: {e}")
|
| 110 |
+
return False
|
| 111 |
+
|
| 112 |
+
def resync_webcraft_file(username, repo_name, token, html_file_path, commit_message="Resync from WebCraft"):
|
| 113 |
+
"""
|
| 114 |
+
Resync WebCraft HTML file with existing GitHub repository.
|
| 115 |
+
|
| 116 |
+
Args:
|
| 117 |
+
username: GitHub username
|
| 118 |
+
repo_name: Repository name
|
| 119 |
+
token: GitHub personal access token
|
| 120 |
+
html_file_path: Path to local HTML file
|
| 121 |
+
commit_message: Commit message for the update
|
| 122 |
+
|
| 123 |
+
Returns:
|
| 124 |
+
dict with status and URL, or error message
|
| 125 |
+
"""
|
| 126 |
+
try:
|
| 127 |
+
# Get the repository
|
| 128 |
+
repo = get_repository(username, repo_name, token)
|
| 129 |
+
if not repo:
|
| 130 |
+
return {
|
| 131 |
+
"status": "error",
|
| 132 |
+
"message": f"Repository '{repo_name}' not found"
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
# Read the HTML file
|
| 136 |
+
with open(html_file_path, 'rb') as f:
|
| 137 |
+
content = f.read()
|
| 138 |
+
|
| 139 |
+
# Find the HTML file in the repository (usually index.html)
|
| 140 |
+
filename = os.path.basename(html_file_path)
|
| 141 |
+
|
| 142 |
+
# Update the file
|
| 143 |
+
if update_file_in_repo(repo, filename, content, commit_message):
|
| 144 |
+
site_url = f"https://{username}.github.io/{repo_name}/"
|
| 145 |
+
return {
|
| 146 |
+
"status": "success",
|
| 147 |
+
"message": "Repository synced successfully",
|
| 148 |
+
"website_url": site_url,
|
| 149 |
+
"repo_url": repo.html_url
|
| 150 |
+
}
|
| 151 |
+
else:
|
| 152 |
+
return {
|
| 153 |
+
"status": "error",
|
| 154 |
+
"message": "Failed to update file in repository"
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
except Exception as e:
|
| 158 |
+
return {
|
| 159 |
+
"status": "error",
|
| 160 |
+
"message": str(e)
|
| 161 |
+
}
|
main.py
ADDED
|
@@ -0,0 +1,215 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import zipfile
|
| 3 |
+
import tempfile
|
| 4 |
+
import rarfile
|
| 5 |
+
import datetime
|
| 6 |
+
from fastapi import FastAPI, File, UploadFile, Form
|
| 7 |
+
from fastapi.middleware.cors import CORSMiddleware
|
| 8 |
+
from dotenv import load_dotenv
|
| 9 |
+
from github_utils import create_github_repo, upload_files_to_repo, enable_github_pages, resync_webcraft_file
|
| 10 |
+
from title_generator import get_repo_title, sanitize_for_repo_name
|
| 11 |
+
from code_commenter import add_comments_to_webcraft_file
|
| 12 |
+
|
| 13 |
+
# تحميل الإعدادات من ملف .env
|
| 14 |
+
load_dotenv()
|
| 15 |
+
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
|
| 16 |
+
GITHUB_USERNAME = os.getenv("GITHUB_USERNAME")
|
| 17 |
+
|
| 18 |
+
app = FastAPI()
|
| 19 |
+
|
| 20 |
+
# Add CORS middleware to allow browser requests
|
| 21 |
+
app.add_middleware(
|
| 22 |
+
CORSMiddleware,
|
| 23 |
+
allow_origins=["*"], # Allows all origins
|
| 24 |
+
allow_credentials=True,
|
| 25 |
+
allow_methods=["*"], # Allows all methods
|
| 26 |
+
allow_headers=["*"], # Allows all headers
|
| 27 |
+
)
|
| 28 |
+
|
| 29 |
+
@app.post("/upload_website")
|
| 30 |
+
async def upload_website(
|
| 31 |
+
file: UploadFile = File(...),
|
| 32 |
+
github_token: str = Form(None),
|
| 33 |
+
github_username: str = Form(None),
|
| 34 |
+
add_comments: bool = Form(True),
|
| 35 |
+
comment_level: str = Form("concise")
|
| 36 |
+
):
|
| 37 |
+
try:
|
| 38 |
+
# ----------------------------------------
|
| 39 |
+
# 1. read uploaded HTML directly
|
| 40 |
+
# ----------------------------------------
|
| 41 |
+
if not file.filename.endswith(".html"):
|
| 42 |
+
return {"status": "error", "message": "Only .html files are accepted now."}
|
| 43 |
+
|
| 44 |
+
# Create temporary directory
|
| 45 |
+
temp_dir = tempfile.mkdtemp()
|
| 46 |
+
file_path = os.path.join(temp_dir, file.filename)
|
| 47 |
+
|
| 48 |
+
# Save file
|
| 49 |
+
with open(file_path, "wb") as f:
|
| 50 |
+
f.write(await file.read())
|
| 51 |
+
|
| 52 |
+
# ----------------------------------------
|
| 53 |
+
# 2. Add AI comments to WebCraft code (if enabled)
|
| 54 |
+
# ----------------------------------------
|
| 55 |
+
if add_comments and comment_level in ["detailed", "concise", "minimal"]:
|
| 56 |
+
try:
|
| 57 |
+
file_path = add_comments_to_webcraft_file(file_path, comment_level)
|
| 58 |
+
print(f"✓ Added {comment_level} comments to code")
|
| 59 |
+
except Exception as e:
|
| 60 |
+
print(f"⚠ Could not add comments: {e}")
|
| 61 |
+
# Continue without comments
|
| 62 |
+
|
| 63 |
+
# ----------------------------------------
|
| 64 |
+
# 3. Generate repo name
|
| 65 |
+
# ----------------------------------------
|
| 66 |
+
user_openai_key = os.getenv("OPENAI_API_KEY")
|
| 67 |
+
|
| 68 |
+
title = get_repo_title(file_path, openai_api_key=user_openai_key)
|
| 69 |
+
repo_name = sanitize_for_repo_name(title)
|
| 70 |
+
|
| 71 |
+
# ----------------------------------------
|
| 72 |
+
# 4. Use provided credentials or fallback to .env
|
| 73 |
+
# ----------------------------------------
|
| 74 |
+
user_token = github_token if github_token else GITHUB_TOKEN
|
| 75 |
+
user_name = github_username if github_username else GITHUB_USERNAME
|
| 76 |
+
|
| 77 |
+
# ----------------------------------------
|
| 78 |
+
# 5. Create repo (auto rename if exists)
|
| 79 |
+
# ----------------------------------------
|
| 80 |
+
repo = create_github_repo(user_token, repo_name)
|
| 81 |
+
actual_repo_name = repo.name # final name after uniqueness
|
| 82 |
+
|
| 83 |
+
# ----------------------------------------
|
| 84 |
+
# 6. Upload the HTML file ONLY
|
| 85 |
+
# ----------------------------------------
|
| 86 |
+
upload_files_to_repo(repo, temp_dir)
|
| 87 |
+
|
| 88 |
+
# ----------------------------------------
|
| 89 |
+
# 7. Enable GitHub Pages
|
| 90 |
+
# ----------------------------------------
|
| 91 |
+
if enable_github_pages(user_name, actual_repo_name, user_token):
|
| 92 |
+
site_url = f"https://{user_name}.github.io/{actual_repo_name}/"
|
| 93 |
+
return {
|
| 94 |
+
"status": "success",
|
| 95 |
+
"repo_name": actual_repo_name,
|
| 96 |
+
"repo_url": repo.html_url,
|
| 97 |
+
"website_url": site_url
|
| 98 |
+
}
|
| 99 |
+
else:
|
| 100 |
+
return {
|
| 101 |
+
"status": "error",
|
| 102 |
+
"message": "GitHub Pages activation failed"
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
except Exception as e:
|
| 106 |
+
return {"status": "error", "message": str(e)}
|
| 107 |
+
|
| 108 |
+
@app.post("/resync_repository")
|
| 109 |
+
async def resync_repository(
|
| 110 |
+
file: UploadFile = File(...),
|
| 111 |
+
repo_name: str = Form(...),
|
| 112 |
+
github_token: str = Form(None),
|
| 113 |
+
github_username: str = Form(None),
|
| 114 |
+
add_comments: bool = Form(False),
|
| 115 |
+
comment_level: str = Form("concise")
|
| 116 |
+
):
|
| 117 |
+
"""
|
| 118 |
+
Resync WebCraft HTML file with existing GitHub repository.
|
| 119 |
+
|
| 120 |
+
Args:
|
| 121 |
+
file: Updated WebCraft HTML file
|
| 122 |
+
repo_name: Existing repository name
|
| 123 |
+
github_token: GitHub token (optional, uses .env)
|
| 124 |
+
github_username: GitHub username (optional, uses .env)
|
| 125 |
+
add_comments: Whether to add/update comments
|
| 126 |
+
comment_level: Comment detail level (detailed/concise/minimal)
|
| 127 |
+
"""
|
| 128 |
+
try:
|
| 129 |
+
# Validate file type
|
| 130 |
+
if not file.filename.endswith(".html"):
|
| 131 |
+
return {"status": "error", "message": "Only .html files are accepted."}
|
| 132 |
+
|
| 133 |
+
# Create temporary directory and save file
|
| 134 |
+
temp_dir = tempfile.mkdtemp()
|
| 135 |
+
file_path = os.path.join(temp_dir, file.filename)
|
| 136 |
+
|
| 137 |
+
with open(file_path, "wb") as f:
|
| 138 |
+
f.write(await file.read())
|
| 139 |
+
|
| 140 |
+
# Add comments if requested
|
| 141 |
+
if add_comments and comment_level in ["detailed", "concise", "minimal"]:
|
| 142 |
+
try:
|
| 143 |
+
file_path = add_comments_to_webcraft_file(file_path, comment_level)
|
| 144 |
+
print(f"✓ Added {comment_level} comments to code")
|
| 145 |
+
except Exception as e:
|
| 146 |
+
print(f"⚠ Could not add comments: {e}")
|
| 147 |
+
|
| 148 |
+
# Use provided credentials or fallback to .env
|
| 149 |
+
user_token = github_token if github_token else GITHUB_TOKEN
|
| 150 |
+
user_name = github_username if github_username else GITHUB_USERNAME
|
| 151 |
+
|
| 152 |
+
# Resync with GitHub repository
|
| 153 |
+
result = resync_webcraft_file(
|
| 154 |
+
username=user_name,
|
| 155 |
+
repo_name=repo_name,
|
| 156 |
+
token=user_token,
|
| 157 |
+
html_file_path=file_path,
|
| 158 |
+
commit_message="Resync from WebCraft"
|
| 159 |
+
)
|
| 160 |
+
|
| 161 |
+
return result
|
| 162 |
+
|
| 163 |
+
except Exception as e:
|
| 164 |
+
return {"status": "error", "message": str(e)}
|
| 165 |
+
|
| 166 |
+
@app.post("/preview_comments")
|
| 167 |
+
async def preview_comments(
|
| 168 |
+
file: UploadFile = File(...),
|
| 169 |
+
comment_level: str = Form("concise")
|
| 170 |
+
):
|
| 171 |
+
"""
|
| 172 |
+
Preview WebCraft HTML file with AI-generated comments.
|
| 173 |
+
Does not upload to GitHub - just returns the commented code.
|
| 174 |
+
|
| 175 |
+
Args:
|
| 176 |
+
file: WebCraft HTML file
|
| 177 |
+
comment_level: Comment detail level (detailed/concise/minimal)
|
| 178 |
+
"""
|
| 179 |
+
try:
|
| 180 |
+
# Validate file type
|
| 181 |
+
if not file.filename.endswith(".html"):
|
| 182 |
+
return {"status": "error", "message": "Only .html files are accepted."}
|
| 183 |
+
|
| 184 |
+
# Create temporary directory and save file
|
| 185 |
+
temp_dir = tempfile.mkdtemp()
|
| 186 |
+
file_path = os.path.join(temp_dir, file.filename)
|
| 187 |
+
output_path = os.path.join(temp_dir, f"commented_{file.filename}")
|
| 188 |
+
|
| 189 |
+
with open(file_path, "wb") as f:
|
| 190 |
+
f.write(await file.read())
|
| 191 |
+
|
| 192 |
+
# Add comments
|
| 193 |
+
if comment_level not in ["detailed", "concise", "minimal"]:
|
| 194 |
+
comment_level = "concise"
|
| 195 |
+
|
| 196 |
+
commented_file = add_comments_to_webcraft_file(file_path, comment_level, output_path)
|
| 197 |
+
|
| 198 |
+
# Read commented file
|
| 199 |
+
with open(commented_file, "r", encoding="utf-8") as f:
|
| 200 |
+
commented_content = f.read()
|
| 201 |
+
|
| 202 |
+
return {
|
| 203 |
+
"status": "success",
|
| 204 |
+
"commented_code": commented_content,
|
| 205 |
+
"comment_level": comment_level
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
except Exception as e:
|
| 209 |
+
return {"status": "error", "message": str(e)}
|
| 210 |
+
|
| 211 |
+
if __name__ == "__main__":
|
| 212 |
+
import uvicorn
|
| 213 |
+
# Get port from environment variable for Heroku
|
| 214 |
+
port = int(os.environ.get("PORT", 8000))
|
| 215 |
+
uvicorn.run(app, host="0.0.0.0", port=port)
|
requirements.txt
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
fastapi
|
| 2 |
+
uvicorn
|
| 3 |
+
python-dotenv
|
| 4 |
+
PyGithub
|
| 5 |
+
aiofiles
|
| 6 |
+
openai
|
| 7 |
+
python-multipart
|
| 8 |
+
rarfile
|
| 9 |
+
requests
|
| 10 |
+
langchain
|
| 11 |
+
langchain-openai
|
| 12 |
+
transformers
|
| 13 |
+
sentencepiece
|
| 14 |
+
torch --index-url https://download.pytorch.org/whl/cpu
|
| 15 |
+
beautifulsoup4
|
| 16 |
+
gunicorn
|
title_generator.py
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
from html.parser import HTMLParser
|
| 3 |
+
import os
|
| 4 |
+
from transformers import pipeline
|
| 5 |
+
|
| 6 |
+
# Create summarization/title-generation model (T5-small)
|
| 7 |
+
print("🚀 Loading T5-small model...")
|
| 8 |
+
t5_model = pipeline("summarization", model="t5-small")
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
class HTMLTitleExtractor(HTMLParser):
|
| 12 |
+
"""Extract <title> and body text from HTML"""
|
| 13 |
+
|
| 14 |
+
def __init__(self):
|
| 15 |
+
super().__init__()
|
| 16 |
+
self.title = ""
|
| 17 |
+
self.text_content = []
|
| 18 |
+
self.in_title = False
|
| 19 |
+
self.in_body = False
|
| 20 |
+
self.skip_tags = {'script', 'style', 'meta', 'link', 'noscript'}
|
| 21 |
+
self.skip = False
|
| 22 |
+
|
| 23 |
+
def handle_starttag(self, tag, attrs):
|
| 24 |
+
if tag == 'title':
|
| 25 |
+
self.in_title = True
|
| 26 |
+
if tag == 'body':
|
| 27 |
+
self.in_body = True
|
| 28 |
+
if tag in self.skip_tags:
|
| 29 |
+
self.skip = True
|
| 30 |
+
|
| 31 |
+
def handle_endtag(self, tag):
|
| 32 |
+
if tag == 'title':
|
| 33 |
+
self.in_title = False
|
| 34 |
+
if tag == 'body':
|
| 35 |
+
self.in_body = False
|
| 36 |
+
if tag in self.skip_tags:
|
| 37 |
+
self.skip = False
|
| 38 |
+
|
| 39 |
+
def handle_data(self, data):
|
| 40 |
+
if self.in_title:
|
| 41 |
+
self.title = data.strip()
|
| 42 |
+
elif self.in_body and not self.skip:
|
| 43 |
+
text = data.strip()
|
| 44 |
+
if text:
|
| 45 |
+
self.text_content.append(text)
|
| 46 |
+
|
| 47 |
+
|
| 48 |
+
def extract_title_and_text(html_content):
|
| 49 |
+
parser = HTMLTitleExtractor()
|
| 50 |
+
parser.feed(html_content)
|
| 51 |
+
return parser.title, " ".join(parser.text_content)
|
| 52 |
+
|
| 53 |
+
|
| 54 |
+
def generate_title_with_t5(text):
|
| 55 |
+
"""Generate repo title using T5-small (local, no API needed)"""
|
| 56 |
+
try:
|
| 57 |
+
if len(text) < 10:
|
| 58 |
+
return None
|
| 59 |
+
|
| 60 |
+
text = text[:500] # Reduce input for speed
|
| 61 |
+
|
| 62 |
+
result = t5_model(
|
| 63 |
+
text,
|
| 64 |
+
max_length=20,
|
| 65 |
+
min_length=5,
|
| 66 |
+
do_sample=False
|
| 67 |
+
)
|
| 68 |
+
|
| 69 |
+
title = result[0]['summary_text']
|
| 70 |
+
title = title.lower().replace(" ", "-")
|
| 71 |
+
return title[:50]
|
| 72 |
+
|
| 73 |
+
except Exception:
|
| 74 |
+
return None
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
def get_repo_title(file_path, openai_api_key=None):
|
| 78 |
+
|
| 79 |
+
# Read HTML file with multiple encodings
|
| 80 |
+
html_content = None
|
| 81 |
+
for enc in ['utf-8', 'latin-1', 'cp1252', 'iso-8859-1']:
|
| 82 |
+
try:
|
| 83 |
+
with open(file_path, 'r', encoding=enc) as f:
|
| 84 |
+
html_content = f.read()
|
| 85 |
+
break
|
| 86 |
+
except:
|
| 87 |
+
continue
|
| 88 |
+
|
| 89 |
+
if not html_content:
|
| 90 |
+
with open(file_path, 'rb') as f:
|
| 91 |
+
html_content = f.read().decode('utf-8', errors='ignore')
|
| 92 |
+
|
| 93 |
+
title, text_content = extract_title_and_text(html_content)
|
| 94 |
+
|
| 95 |
+
# 1️⃣ Use <title> tag directly
|
| 96 |
+
if title and title.strip():
|
| 97 |
+
print(f"✓ Using <title>: {title.strip()}")
|
| 98 |
+
return title.strip()
|
| 99 |
+
|
| 100 |
+
# 2️⃣ Use T5 model to generate title
|
| 101 |
+
if text_content and len(text_content) > 10:
|
| 102 |
+
print("⚠ No <title> found — generating title with T5…")
|
| 103 |
+
ai_title = generate_title_with_t5(text_content)
|
| 104 |
+
if ai_title:
|
| 105 |
+
print(f"✓ T5 generated title: {ai_title}")
|
| 106 |
+
return ai_title
|
| 107 |
+
|
| 108 |
+
# 3️⃣ Fallback: use filename (NOT 'website')
|
| 109 |
+
fallback = os.path.splitext(os.path.basename(file_path))[0]
|
| 110 |
+
|
| 111 |
+
if fallback.lower() in ['index', '', 'home']:
|
| 112 |
+
# Use folder name instead
|
| 113 |
+
folder_name = os.path.basename(os.path.dirname(file_path))
|
| 114 |
+
fallback = folder_name if folder_name.strip() else "untitled-project"
|
| 115 |
+
|
| 116 |
+
print(f"⚠ Using fallback filename: {fallback}")
|
| 117 |
+
return fallback
|
| 118 |
+
|
| 119 |
+
|
| 120 |
+
def sanitize_for_repo_name(title):
|
| 121 |
+
name = title.lower()
|
| 122 |
+
name = re.sub(r'[^a-z0-9\-]', '-', name)
|
| 123 |
+
name = re.sub(r'-+', '-', name)
|
| 124 |
+
name = name.strip('-')
|
| 125 |
+
if not name:
|
| 126 |
+
name = "untitled-project"
|
| 127 |
+
return name[:50]
|