Files
2025-11-29 18:47:30 +08:00

225 lines
7.2 KiB
Python

#!/usr/bin/env python3
"""
Main TUI designer orchestrator.
Combines all analyses into comprehensive design report.
"""
import sys
import argparse
from pathlib import Path
from typing import Dict, Optional, List
sys.path.insert(0, str(Path(__file__).parent))
from analyze_requirements import extract_requirements
from map_components import map_to_components
from select_patterns import select_relevant_patterns
from design_architecture import design_architecture
from generate_workflow import generate_implementation_workflow
from utils.helpers import get_timestamp
from utils.template_generator import generate_main_go
from utils.validators import DesignValidator
def comprehensive_tui_design_report(
description: str,
inventory_path: Optional[str] = None,
include_sections: Optional[List[str]] = None,
detail_level: str = "complete"
) -> Dict:
"""
Generate comprehensive TUI design report.
This is the all-in-one function that combines all design analyses.
Args:
description: Natural language TUI description
inventory_path: Path to charm-examples-inventory
include_sections: Which sections to include (None = all)
detail_level: "summary" | "detailed" | "complete"
Returns:
Complete design report dictionary with all sections
Example:
>>> report = comprehensive_tui_design_report(
... "Build a log viewer with search"
... )
>>> print(report['summary'])
"TUI Design: Log Viewer..."
"""
if include_sections is None:
include_sections = ['requirements', 'components', 'patterns', 'architecture', 'workflow']
report = {
'description': description,
'generated_at': get_timestamp(),
'sections': {}
}
# Phase 1: Requirements Analysis
if 'requirements' in include_sections:
requirements = extract_requirements(description)
report['sections']['requirements'] = requirements
report['tui_type'] = requirements['archetype']
else:
requirements = extract_requirements(description)
report['tui_type'] = requirements.get('archetype', 'general')
# Phase 2: Component Mapping
if 'components' in include_sections:
components = map_to_components(requirements)
report['sections']['components'] = components
else:
components = map_to_components(requirements)
# Phase 3: Pattern Selection
if 'patterns' in include_sections:
patterns = select_relevant_patterns(components, inventory_path)
report['sections']['patterns'] = patterns
else:
patterns = {'examples': []}
# Phase 4: Architecture Design
if 'architecture' in include_sections:
architecture = design_architecture(components, patterns, requirements)
report['sections']['architecture'] = architecture
else:
architecture = design_architecture(components, patterns, requirements)
# Phase 5: Workflow Generation
if 'workflow' in include_sections:
workflow = generate_implementation_workflow(architecture, patterns)
report['sections']['workflow'] = workflow
# Generate summary
report['summary'] = _generate_summary(report, requirements, components)
# Generate code scaffolding
if detail_level == "complete":
primary_comps = [
c['component'].replace('.Model', '')
for c in components.get('primary_components', [])[:3]
]
report['scaffolding'] = {
'main_go': generate_main_go(primary_comps, requirements.get('archetype', 'general'))
}
# File structure recommendation
report['file_structure'] = {
'recommended': ['main.go', 'go.mod', 'README.md']
}
# Next steps
report['next_steps'] = _generate_next_steps(patterns, workflow if 'workflow' in report['sections'] else None)
# Resources
report['resources'] = {
'documentation': [
'https://github.com/charmbracelet/bubbletea',
'https://github.com/charmbracelet/lipgloss'
],
'tutorials': [
'Bubble Tea tutorial: https://github.com/charmbracelet/bubbletea/tree/master/tutorials'
],
'community': [
'Charm Discord: https://charm.sh/chat'
]
}
# Overall validation
validator = DesignValidator()
validation = validator.validate_design_report(report)
report['validation'] = validation.to_dict()
return report
def _generate_summary(report: Dict, requirements: Dict, components: Dict) -> str:
"""Generate executive summary."""
tui_type = requirements.get('archetype', 'general')
features = requirements.get('features', [])
primary = components.get('primary_components', [])
summary_parts = [
f"TUI Design: {tui_type.replace('-', ' ').title()}",
f"\nPurpose: {report.get('description', 'N/A')}",
f"\nKey Features: {', '.join(features)}",
f"\nPrimary Components: {', '.join([c['component'] for c in primary[:3]])}",
]
if 'workflow' in report.get('sections', {}):
summary_parts.append(
f"\nEstimated Implementation Time: {report['sections']['workflow'].get('total_estimated_time', 'N/A')}"
)
return '\n'.join(summary_parts)
def _generate_next_steps(patterns: Dict, workflow: Optional[Dict]) -> List[str]:
"""Generate next steps list."""
steps = ['1. Review the architecture diagram and component selection']
examples = patterns.get('examples', [])
if examples:
steps.append(f'2. Study example files: {examples[0]["file"]}')
if workflow:
steps.append('3. Follow the implementation workflow starting with Phase 1')
steps.append('4. Test at each checkpoint')
steps.append('5. Refer to Bubble Tea documentation for component details')
return steps
def main():
"""CLI for TUI designer."""
parser = argparse.ArgumentParser(description='Bubble Tea TUI Designer')
parser.add_argument('description', help='TUI description')
parser.add_argument('--inventory', help='Path to charm-examples-inventory')
parser.add_argument('--detail', choices=['summary', 'detailed', 'complete'], default='complete')
args = parser.parse_args()
print("=" * 60)
print("Bubble Tea TUI Designer")
print("=" * 60)
report = comprehensive_tui_design_report(
args.description,
inventory_path=args.inventory,
detail_level=args.detail
)
print(f"\n{report['summary']}")
if 'architecture' in report['sections']:
print("\n" + "=" * 60)
print("ARCHITECTURE")
print("=" * 60)
print(report['sections']['architecture']['diagrams']['component_hierarchy'])
if 'workflow' in report['sections']:
print("\n" + "=" * 60)
print("IMPLEMENTATION WORKFLOW")
print("=" * 60)
for phase in report['sections']['workflow']['phases']:
print(f"\n{phase['name']} ({phase['total_time']})")
for task in phase['tasks']:
print(f" - {task['task']}")
print("\n" + "=" * 60)
print("NEXT STEPS")
print("=" * 60)
for step in report['next_steps']:
print(step)
print("\n" + "=" * 60)
print(f"Validation: {report['validation']['summary']}")
print("=" * 60)
if __name__ == "__main__":
main()