Skip to content
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
65377a6
auto-claude: subtask-1-1 - Add PHP framework detection (Laravel, Symf…
OBenner Feb 24, 2026
1457690
auto-claude: subtask-1-2 - Add framework detection to project/framewo…
OBenner Feb 24, 2026
54f14db
auto-claude: subtask-2-1 - Create Go patterns module with idiomatic p…
OBenner Feb 24, 2026
faf65a3
auto-claude: subtask-2-2 - Create Rust patterns module with idiomatic…
OBenner Feb 24, 2026
a0cd3a2
auto-claude: subtask-2-3 - Create PHP patterns module with idiomatic …
OBenner Feb 24, 2026
7549297
auto-claude: subtask-2-4 - Create Ruby patterns module with idiomatic…
OBenner Feb 24, 2026
1cb40aa
auto-claude: subtask-3-1 - Create language security rules module
OBenner Feb 24, 2026
6eb36b2
auto-claude: subtask-3-2 - Integrate security scanners (gosec, cargo-…
OBenner Feb 24, 2026
00eef65
auto-claude: subtask-4-1 - Add test framework mappings for Go/Rust/PH…
OBenner Feb 24, 2026
c0a3f5e
docs(languages): create Go support documentation
OBenner Feb 24, 2026
8cb6911
docs(languages): add Rust support documentation
OBenner Feb 24, 2026
7ac9eb3
docs(languages): add PHP support documentation
OBenner Feb 25, 2026
4e0518c
docs(languages): add Ruby support documentation
OBenner Feb 25, 2026
57db430
Merge remote-tracking branch 'origin/develop' into auto-claude/189-ex…
OBenner Feb 25, 2026
5317375
fix: address all CodeRabbit and reviewer comments for extended langua…
OBenner Feb 25, 2026
4d55f2a
Merge remote-tracking branch 'origin/develop' into auto-claude/189-ex…
OBenner Feb 25, 2026
6872e97
fix: address second round of CodeRabbit review comments
OBenner Feb 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 45 additions & 1 deletion apps/backend/analysis/analyzers/framework_analyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
=========================

Detects programming languages, frameworks, and related technologies across different ecosystems.
Supports Python, Node.js/TypeScript, Go, Rust, and Ruby frameworks.
Supports Python, Node.js/TypeScript, Go, Rust, Ruby, and PHP frameworks.
"""

from __future__ import annotations
Expand Down Expand Up @@ -91,6 +91,13 @@ def detect_language_and_framework(self) -> None:
content = self._read_file("Gemfile")
self._detect_ruby_framework(content)

# PHP detection
elif self._exists("composer.json"):
self.analysis["language"] = "PHP"
self.analysis["package_manager"] = "composer"
content = self._read_file("composer.json")
self._detect_php_framework(content)

def _detect_python_framework(self, content: str) -> None:
"""Detect Python framework."""
from .port_detector import PortDetector
Expand Down Expand Up @@ -299,6 +306,43 @@ def _detect_ruby_framework(self, content: str) -> None:
if "sidekiq" in content.lower():
self.analysis["task_queue"] = "Sidekiq"

def _detect_php_framework(self, content: str) -> None:
"""Detect PHP framework."""
# Parse composer.json
import json

from .port_detector import PortDetector

try:
composer_data = json.loads(content)
except json.JSONDecodeError:
return

# Get all dependencies
require = composer_data.get("require", {})
require_dev = composer_data.get("require-dev", {})
all_deps = {**require, **require_dev}
deps_lower = {k.lower(): k for k in all_deps.keys()}

# Framework detection
frameworks = {
"laravel/framework": {"name": "Laravel", "port": 8000},
"symfony/symfony": {"name": "Symfony", "port": 8000},
"symfony/framework-bundle": {"name": "Symfony", "port": 8000},
"codeigniter4/framework": {"name": "CodeIgniter", "port": 8080},
"codeigniter/framework": {"name": "CodeIgniter", "port": 8080},
}

port_detector = PortDetector(self.path, self.analysis)

for key, info in frameworks.items():
if key in deps_lower:
self.analysis["framework"] = info["name"]
self.analysis["type"] = "backend"
detected_port = port_detector.detect_port_from_sources(info["port"])
self.analysis["default_port"] = detected_port
break

def _detect_swift_framework(self) -> None:
"""Detect Swift/iOS framework and dependencies."""
try:
Expand Down
8 changes: 8 additions & 0 deletions apps/backend/patterns/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"""
Language Patterns Module
========================

Idiomatic code patterns for different programming languages.
"""

__all__ = []
Loading
Loading