#FallnAI Autonomous Software Developer #app.py import os import json import subprocess import tempfile import time import re from flask import Flask, request, jsonify from crewai import Crew, Process from crewai.agent import Agent from crewai.task import Task from crewai.tools import Tool from textwrap import dedent from crewai_tools import SerperDevTool # Import agent and task classes from agents import planner_agent, coder_agent, tester_agent, ui_designer_agent, docs_agent, devops_agent from tasks import SoftwareDevelopmentTasks # Import the GitHub Manager from github_manager import GitHubManager app = Flask(__name__) # --- Configuration --- # GitHub Token from environment variable # IMPORTANT: Never hardcode this token. GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN") if not GITHUB_TOKEN: print("Warning: GITHUB_TOKEN environment variable not set. GitHub push will fail.") # Initialize the GitHub tool github_tool = Tool( name="GitHub_Manager", func=GitHubManager(GITHUB_TOKEN).create_and_push_repo, description="A tool to create and push files to a new GitHub repository." ) @app.route('/develop', methods=['POST']) def develop_software(): data = request.json user_prompt = data.get('prompt') if not user_prompt: return jsonify({"error": "No prompt provided"}), 400 # Sanitize and create a unique repository name sanitized_prompt = re.sub(r'[^a-zA-Z0-9-]', '', user_prompt[:30]).lower() timestamp = int(time.time()) repo_name = f"auto-dev-{sanitized_prompt}-{timestamp}" try: # Create a new crew for this request tasks = SoftwareDevelopmentTasks(user_prompt) # Add the GitHub tool to the DevOps agent devops_agent.tools.append(github_tool) crew = Crew( agents=[planner_agent, coder_agent, tester_agent, ui_designer_agent, docs_agent, devops_agent], tasks=[ tasks.plan_software(planner_agent), tasks.write_code(coder_agent), tasks.write_ui(ui_designer_agent), tasks.review_and_test(tester_agent), tasks.write_documentation(docs_agent), # New documentation task tasks.push_to_github(devops_agent, repo_name=repo_name) # Pass repo_name ], process=Process.sequential, verbose=2 ) # Kick off the development process result = crew.kickoff() # Extract the final outputs to be pushed final_code = "" final_ui = "" final_docs = "" for task_result in crew.tasks_outputs: if "code" in task_result.description.lower(): final_code = task_result.output if "ui" in task_result.description.lower(): final_ui = task_result.output if "documentation" in task_result.description.lower(): final_docs = task_result.output # Final step is to get the push result and include it in the response final_result = crew.kickoff() return jsonify({ "status": "success", "log": final_result, "final_code": final_code, "final_ui": final_ui, "final_docs": final_docs }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)