Repository Analysis

Pythagora-io/gpt-pilot

The first real AI developer

11.1 Low AI signal View on GitHub
11.1
Adjusted Score
11.1
Raw Score
100%
Time Factor
2026-04-17
Last Push
33,753
Stars
Python
Language
39,155
Lines of Code
384
Files
358
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 6MEDIUM 30LOW 322

Pattern Findings

358 matches across 15 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers155 hits · 161 pts
SeverityFileLineSnippet
LOWcore/ui/api_server.py511 async def _handle_current_task_status(self, message: Message, writer: asyncio.StreamWriter):
LOWcore/ui/api_server.py600 async def _handle_start_another_task(self, message: Message, writer: asyncio.StreamWriter):
LOWcore/config/__init__.py177 def from_provider_and_agent_configs(cls, provider: ProviderConfig, agent: AgentLLMConfig):
LOWcore/agents/mixins.py130 async def get_relevant_files_parallel(
LOWcore/agents/convo.py41 def _get_default_template_vars(self) -> dict:
LOWcore/agents/convo.py55 def _serialize_prompt_context(context: dict) -> dict:
LOWcore/agents/tech_lead.py92 def create_initial_project_epic(self):
LOWcore/agents/bug_hunter.py82 async def get_bug_reproduction_instructions(self):
LOWcore/agents/bug_hunter.py363 def generate_iteration_convo_so_far(self, omit_last_cycle=False):
LOWcore/agents/bug_hunter.py400 def set_data_for_next_hunting_cycle(self, human_readable_instructions, new_status):
LOWcore/agents/problem_solver.py49 async def generate_alternative_solutions(self):
LOWcore/agents/problem_solver.py76 async def try_alternative_solutions(self) -> AgentResponse:
LOWcore/agents/problem_solver.py107 async def ask_for_preferred_solution(self) -> Optional[tuple[int, str]]:
LOWcore/agents/frontend.py33def has_correct_num_of_backticks(response: str) -> bool:
LOWcore/agents/architect.py237 async def check_system_dependencies(self, spec: Specification):
LOWcore/agents/orchestrator.py345 def handle_parallel_responses(self, agent: BaseAgent, responses: List[AgentResponse]) -> AgentResponse:
LOWcore/agents/troubleshooter.py348 def try_next_alternative_solution(self, user_feedback: str, user_feedback_qa: list[str]) -> AgentResponse:
LOWcore/agents/developer.py121 async def breakdown_current_iteration(self) -> AgentResponse:
LOWcore/agents/spec_writer.py63 async def initialize_spec_and_project(self) -> AgentResponse:
LOWcore/cli/helpers.py412def find_first_todo_task_index(tasks):
LOWcore/cli/helpers.py849async def list_projects_branches_states(db: SessionManager):
LOWcore/state/state_manager.py106 async def list_projects_with_branches_states(self) -> list[Project]:
LOWcore/state/state_manager.py116 async def get_branches_for_project_id(self, project_id: UUID) -> list[Branch]:
LOWcore/state/state_manager.py119 async def get_project_state_for_redo_task(self, project_state: ProjectState) -> Optional[ProjectState]:
LOWcore/state/state_manager.py137 async def get_project_state_for_convo_id(self, convo_id) -> Optional["ProjectState"]:
LOWcore/state/state_manager.py140 async def get_task_conversation_project_states(
LOWcore/state/state_manager.py151 async def get_project_states_in_between(
LOWcore/state/state_manager.py679 def get_full_parent_project_root(self) -> str:
LOWcore/state/state_manager.py786 async def get_modified_files_with_content(self) -> list[dict]:
LOWcore/state/state_manager.py850 async def update_implemented_pages_and_apis(self):
LOWcore/state/state_manager.py950 async def find_backend_implementation(self, endpoint_line: str) -> dict:
LOWcore/db/models/project_state.py370 def flag_iterations_as_modified(self):
LOWcore/db/models/project_state.py400 def flag_knowledge_base_as_modified(self):
LOWcore/db/models/project_state.py711 async def get_project_states_in_between(
LOWcore/db/models/project_state.py758 async def get_task_conversation_project_states(
LOWcore/db/models/chat_convo.py38 async def get_project_state_for_convo_id(session: AsyncSession, convo_id) -> Optional["ProjectState"]:
LOWcore/db/models/project.py103 async def get_branches_for_project_id(session: AsyncSession, project_id: UUID) -> list["Branch"]:
LOWcore/db/models/project.py117 async def get_all_projects_with_branches_states(session: "AsyncSession") -> list["Project"]:
LOWcore/db/models/project.py153 def get_folder_from_project_name(name: str):
LOW…tes/tree/vite_react/client/src/components/ui/chart.tsx321function getPayloadConfigFromPayload(
LOW…/vite_react_swagger/client/src/components/ui/chart.tsx321function getPayloadConfigFromPayload(
LOWtests/proc/test_process_manager.py14async def test_local_process_start_terminate(tmp_path):
LOWtests/proc/test_process_manager.py58async def test_process_manager_run_command_capture_stdout(tmp_path):
LOWtests/proc/test_process_manager.py75async def test_process_manager_run_command_capture_stderr(tmp_path):
LOWtests/proc/test_process_manager.py92async def test_process_manager_start_list_terminate(tmp_path):
LOWtests/ui/test_console.py57async def test_ask_question_with_buttons(mock_PromptSession):
LOWtests/ui/test_console.py78async def test_ask_question_interrupted(mock_PromptSession):
LOWtests/ui/test_ipc_client.py193async def test_server_closes_connection():
LOWtests/ui/test_ipc_client.py227async def test_ask_question_buttons():
LOWtests/ui/test_ipc_client.py256async def test_ask_question_buttons_only_with_default():
LOWtests/ui/test_ipc_client.py286async def test_handle_garbage_response():
LOWtests/llm/test_parser.py25def test_multi_code_block_parser(input, expected):
LOWtests/llm/test_parser.py123def test_parse_json_with_spec(input, expected):
LOWtests/llm/test_parser.py204def test_optional_block_parser(input, expected):
LOWtests/llm/test_openai.py68async def test_openai_stream_handler(mock_AsyncOpenAI, mock_state_manager):
LOWtests/llm/test_openai.py98async def test_openai_parser_with_retries(mock_AsyncOpenAI, mock_state_manager):
LOWtests/llm/test_openai.py179async def test_openai_error_handler_success(mock_AsyncOpenAI, mock_state_manager):
LOWtests/llm/test_openai.py226async def test_openai_error_handler_failure(mock_AsyncOpenAI, mock_state_manager):
LOWtests/llm/test_openai.py271def test_openai_rate_limit_parser(
LOWtests/llm/test_prompt.py19def test_jinja_string_template():
95 more matches not shown…
Excessive Try-Catch Wrapping68 hits · 80 pts
SeverityFileLineSnippet
LOWcore/ui/ipc_client.py213 except Exception as err:
LOWcore/ui/ipc_client.py541 except Exception:
LOWcore/ui/api_server.py243 except Exception as e:
LOWcore/ui/api_server.py353 except Exception as err:
LOWcore/ui/api_server.py430 except Exception as err:
LOWcore/ui/api_server.py445 except Exception as err:
LOWcore/ui/api_server.py480 except Exception as err:
LOWcore/ui/api_server.py507 except Exception as err:
LOWcore/ui/api_server.py536 except Exception as err:
LOWcore/ui/api_server.py596 except Exception as err:
LOWcore/ui/api_server.py635 except Exception as e:
LOWcore/ui/api_server.py657 except Exception as err:
LOWcore/ui/api_server.py698 except Exception as err:
LOWcore/ui/api_server.py731 except Exception as err:
LOWcore/ui/api_server.py773 except Exception as err:
LOWcore/llm/parser.py183 except Exception as err:
LOWcore/llm/base.py318 except Exception:
LOWcore/llm/base.py344 except Exception:
LOWcore/llm/base.py357 except Exception as e:
LOWcore/llm/relace_client.py56 except Exception as e:
LOWcore/agents/mixins.py185 except Exception as e:
LOWcore/agents/git.py64 except Exception as e:
LOWcore/agents/frontend.py263 except Exception as e:
LOWcore/agents/frontend.py270 except Exception as e:
LOWcore/agents/frontend.py504 except Exception as e:
LOWcore/agents/frontend.py510 except Exception as e:
LOWcore/agents/frontend.py597 except Exception as e:
LOWcore/agents/wizard.py55 except Exception as e:
LOWcore/agents/wizard.py162 except Exception as e:
LOWcore/agents/wizard.py167 except Exception as e:
LOWcore/agents/orchestrator.py219 except Exception as e:
LOWcore/agents/orchestrator.py249 except Exception as e:
LOWcore/agents/orchestrator.py280 except Exception as e:
LOWcore/agents/orchestrator.py303 except Exception as e:
LOWcore/agents/orchestrator.py342 except Exception as e:
LOWcore/agents/code_monkey.py131 except Exception:
LOWcore/utils/text.py40 except Exception:
LOWcore/cli/main.py98 except Exception as err:
LOWcore/cli/main.py417 except Exception as err:
MEDIUMcore/cli/helpers.py300 print(f"Error parsing config file {args.config}: {err}", file=sys.stderr)
MEDIUMcore/state/state_manager.py418def commit_with_retry(self):
LOWcore/state/state_manager.py237 except Exception as e:
LOWcore/state/state_manager.py242 except Exception as e:
LOWcore/state/state_manager.py368 except Exception as e:
LOWcore/state/state_manager.py429 except Exception as e:
LOWcore/state/state_manager.py475 except Exception as e:
LOWcore/state/state_manager.py509 except Exception as e:
LOWcore/state/state_manager.py520 except Exception as e:
LOWcore/state/state_manager.py984 except Exception as e:
MEDIUMcore/db/fix_migrations.py29 print(f"Error updating database: {e}")
MEDIUMcore/db/fix_migrations.py42 print(f"Error: Could not find alembic.ini at {alembic_ini}")
MEDIUMcore/db/fix_migrations.py50 print("Error: This script only works with SQLite databases")
MEDIUMcore/db/fix_migrations.py69 print("Error: No migration versions found")
LOWcore/db/fix_migrations.py84 except Exception as e:
MEDIUMcore/db/fix_migrations.py85 print(f"Error: {e}")
LOWcore/db/v0importer.py43 except Exception as err: # noqa
MEDIUMcore/db/v0importer.py40def import_database(self):
LOWcore/db/models/project_state.py704 except Exception as e:
LOWcore/templates/base.py126 except Exception as err:
MEDIUMcore/templates/base.py123def install_hook_template(self) -> Any:
8 more matches not shown…
Unused Imports43 hits · 42 pts
SeverityFileLineSnippet
LOWcore/config/__init__.py256
LOWcore/agents/convo.py15
LOWcore/agents/response.py7
LOWcore/agents/response.py8
LOWcore/agents/base.py8
LOWcore/state/state_manager.py17
LOWcore/state/state_manager.py42
LOWcore/db/models/user_input.py14
LOWcore/db/models/user_input.py14
LOWcore/db/models/project_state.py17
LOWcore/db/models/project_state.py17
LOWcore/db/models/project_state.py17
LOWcore/db/models/chat_message.py9
LOWcore/db/models/__init__.py6
LOWcore/db/models/__init__.py7
LOWcore/db/models/__init__.py8
LOWcore/db/models/__init__.py9
LOWcore/db/models/__init__.py10
LOWcore/db/models/__init__.py11
LOWcore/db/models/__init__.py12
LOWcore/db/models/__init__.py13
LOWcore/db/models/__init__.py14
LOWcore/db/models/__init__.py15
LOWcore/db/models/__init__.py16
LOWcore/db/models/__init__.py17
LOWcore/db/models/__init__.py17
LOWcore/db/models/__init__.py18
LOWcore/db/models/branch.py12
LOWcore/db/models/branch.py14
LOWcore/db/models/branch.py14
LOWcore/db/models/branch.py14
LOWcore/db/models/branch.py14
LOWcore/db/models/file.py6
LOWcore/db/models/file.py12
LOWcore/db/models/file.py12
LOWcore/db/models/exec_log.py13
LOWcore/db/models/exec_log.py13
LOWcore/db/models/llm_request.py14
LOWcore/db/models/llm_request.py15
LOWcore/db/models/llm_request.py15
LOWcore/templates/render.py1
LOWcore/templates/base.py13
LOWcore/templates/base.py14
Deep Nesting32 hits · 31 pts
SeverityFileLineSnippet
LOWcore/proc/process_manager.py171
LOWcore/ui/api_server.py540
LOWcore/llm/base.py124
LOWcore/llm/base.py416
LOWcore/config/env_importer.py44
LOWcore/agents/tech_lead.py146
LOWcore/agents/tech_lead.py371
LOWcore/agents/bug_hunter.py61
LOWcore/agents/bug_hunter.py241
LOWcore/agents/frontend.py44
LOWcore/agents/frontend.py151
LOWcore/agents/frontend.py356
LOWcore/agents/frontend.py451
LOWcore/agents/wizard.py30
LOWcore/agents/wizard.py133
LOWcore/agents/orchestrator.py370
LOWcore/agents/orchestrator.py463
LOWcore/agents/orchestrator.py554
LOWcore/agents/troubleshooter.py244
LOWcore/agents/developer.py121
LOWcore/cli/helpers.py437
LOWcore/cli/helpers.py481
LOWcore/cli/helpers.py583
LOWcore/state/state_manager.py172
LOWcore/state/state_manager.py272
LOWcore/db/models/project_state.py592
LOWcore/db/models/project_state.py631
LOWcore/db/models/project_state.py758
LOWcore/db/models/project_state.py976
LOWcore/db/models/file.py46
LOWcore/templates/render.py71
LOWcore/log/__init__.py30
Redundant / Tautological Comments14 hits · 22 pts
SeverityFileLineSnippet
LOWcore/ui/api_server.py202 # Check if convo exists for this convo id
LOWcore/ui/api_server.py213 # Check if any ChatMessages exists with the convo id
LOWcore/agents/git.py99 # Check if there are any changes to commit
LOWcore/agents/orchestrator.py187 # Check if file exists
LOWcore/agents/orchestrator.py196 # Check if script already exists
LOWcore/agents/orchestrator.py269 # Check if favicon link already exists
LOWcore/agents/orchestrator.py318 # Check if required configs already exist
LOWcore/agents/spec_writer.py70 # Check if initial_prompt is provided in command line arguments
LOWcore/cli/main.py131 # Check if initial_prompt is provided, if so, automatically select "node"
LOWcore/state/state_manager.py859 # Check if pages or apis have changed
LOWcore/templates/tree/add_raw_tags.py8 # Open the file and read the contents
LOWcore/templates/tree/add_raw_tags.py12 # Check if the tags are already present
LOWcore/templates/tree/add_raw_tags.py42 # Check if the directory path argument is provided
LOWcore/templates/tree/add_raw_tags.py50 # Check if the provided directory exists
Dead Code10 hits · 20 pts
SeverityFileLineSnippet
MEDIUMcore/agents/external_docs.py50
MEDIUMcore/agents/external_docs.py56
MEDIUMcore/agents/external_docs.py57
MEDIUMcore/agents/external_docs.py59
MEDIUMcore/agents/external_docs.py64
MEDIUMcore/agents/external_docs.py65
MEDIUMcore/agents/external_docs.py66
MEDIUMcore/agents/external_docs.py67
MEDIUMcore/agents/external_docs.py69
MEDIUMcore/agents/external_docs.py70
Self-Referential Comments6 hits · 18 pts
SeverityFileLineSnippet
MEDIUMcore/llm/parser.py186 # Create a new model that includes the original model fields and the original text
MEDIUMcore/agents/wizard.py113 # Create a new knowledge base instance for the project state
MEDIUMcore/db/models/project_state.py411 # Create a new knowledge base instance with the current data
MEDIUMtests/cli/test_cli.py308 # Create a mock with a string value for the button attribute
MEDIUMtests/cli/test_cli.py341 # Create a mock response with a string value for the button attribute
MEDIUMtests/state/test_state_manager.py143 # Create an instance of StateManager with mocked UI
Cross-File Repetition3 hits · 15 pts
SeverityFileLineSnippet
HIGHcore/state/state_manager.py0get a file from the current project state, by the file path. :param path: the file path. :return: the file object, or no
HIGHcore/db/models/project_state.py0get a file from the current project state, by the file path. :param path: the file path. :return: the file object, or no
HIGHcore/db/models/project_state.py0get a file from the current project state, by the file path. :param path: the file path. :return: the file object, or no
Magic Placeholder Names2 hits · 10 pts
SeverityFileLineSnippet
HIGHexample-config.json16 "api_key": "your-api-key",
HIGHexample-config.json23 "api_key": "your-api-key",
Over-Commented Block10 hits · 10 pts
SeverityFileLineSnippet
LOWcore/llm/base.py301 # Token limit exceeded (in original gpt-pilot handled as
LOWcore/agents/tech_lead.py61 if len(self.current_state.epics) == 1:
LOWcore/agents/architect.py141 "select_templates",
LOWcore/db/alembic.ini1# A generic, single database configuration.
LOWcore/db/alembic.ini21# string value is passed to ZoneInfo()
LOWcore/db/alembic.ini41# The path separator used here should be the separator specified by "version_path_separator" below.
LOWcore/db/alembic.ini61# are written from script.py.mako
LOWcore/telemetry/__init__.py141 # End result of development:
LOWtests/db/test_db.py61 # this assertion would fail with an ORM exception, *unless* we add
LOWcloud/entrypoint.sh1#!/bin/bash
Fake / Example Data9 hits · 10 pts
SeverityFileLineSnippet
LOWtests/llm/test_convo.py88 convo.user("Hello, World!", "John Doe")
LOWtests/llm/test_convo.py92 "name": "John Doe",
LOWtests/integration/llm/test_anthropic.py113 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 60000)
LOWtests/integration/llm/test_anthropic.py113 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 60000)
LOWtests/integration/llm/test_openai.py116 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 30000)
LOWtests/integration/llm/test_openai.py116 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 30000)
LOWtests/integration/llm/test_groq.py118 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 30000)
LOWtests/integration/llm/test_groq.py118 large_convo = " ".join(["lorem ipsum dolor sit amet"] * 30000)
LOWtests/telemetry/test_telemetry.py36 "user_contact": "user@example.com",
Decorative Section Separators2 hits · 6 pts
SeverityFileLineSnippet
MEDIUMcore/agents/code_monkey.py209 # ------------------------------
MEDIUMcore/agents/code_monkey.py211 # ------------------------------
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippet
HIGHcore/agents/git.py129 "git diff --cached || git diff",
Slop Phrases2 hits · 4 pts
SeverityFileLineSnippet
MEDIUMcore/llm/base.py366 "Here's how you can get Pythagora to ignore those extra files: ",
LOWcore/agents/troubleshooter.py241 # Sometimes LLM can return a non-existent file, let's make sure to filter those out
AI Slop Vocabulary1 hit · 2 pts
SeverityFileLineSnippet
LOWcore/ui/api_server.py541 # if the extension sent "add", just add a new task in the tasks array before the first todo task