Your agent in your terminal, equipped with local tools: writes code, uses the terminal, browses the web. Make your own persistent autonomous agent on top!
This report summarizes scanner evidence for gptme/gptme, a Python project with 4,447 GitHub stars. SynthScan examined 575,344 lines of code across 1567 source files, recording 16362 pattern matches distributed across 28 syntactic categories. The legacy adjusted pattern signal is 36.2 (High pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 12512 finding(s).
Are imports declared and package/API names verified? 979 finding(s).
Are wrappers, guards, and repeated structures necessary? 14124 finding(s).
Which changes need focused human review? 16362 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 16362 distinct pattern matches across 28 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_path_traversal.py | 50 | def test_events_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 55 | def test_step_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 63 | def test_tool_confirm_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 71 | def test_rerun_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 76 | def test_elicit_respond_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 84 | def test_interrupt_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 96 | def test_browse_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 101 | def test_upload_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 106 | def test_file_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 112 | def test_preview_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 120 | def test_download_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 285 | def test_user_avatar_rejects_non_image_extension( | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 303 | def test_user_avatar_accepts_image_extension( | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 335 | def test_agent_avatar_by_path_rejects_non_image_extension( | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 385 | def test_conversation_agent_avatar_rejects_non_image_extension( | CODE |
| LOW | tests/test_server_path_traversal.py | 38 | def _assert_traversal_rejected(response): | CODE |
| LOW | tests/test_server_path_traversal.py | 132 | def test_post_message_rejects_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW | tests/test_server_path_traversal.py | 170 | def test_rejects_traversal_in_files( | CODE |
| LOW | tests/test_server_path_traversal.py | 183 | def test_safe_relative_path_not_rejected_as_traversal( | CODE |
| LOW | tests/test_server_path_traversal.py | 220 | def test_name_with_dots_no_traversal(self, client: FlaskClient): | CODE |
| LOW | tests/test_server_path_traversal.py | 254 | def test_generate_rejects_branch_traversal(self, client: FlaskClient, payload: str): | CODE |
| LOW | tests/test_server_path_traversal.py | 266 | def test_valid_branch_accepted(self, client: FlaskClient): | CODE |
| LOW | tests/test_server_path_traversal.py | 319 | def test_user_avatar_rejects_dotfile_without_image_ext( | CODE |
| LOW | tests/test_server_path_traversal.py | 361 | def test_agent_avatar_by_path_accepts_image_extension( | CODE |
| LOW | tests/test_server_path_traversal.py | 427 | def test_user_avatar_rejects_disguised_non_image( | CODE |
| LOW | tests/test_server_path_traversal.py | 470 | def test_rejects_absolute_path_outside_cwd( | CODE |
| LOW | tests/test_server_path_traversal.py | 484 | def test_rejects_home_directory_path( | CODE |
| LOW | tests/test_server_path_traversal.py | 498 | def test_rejects_traversal_in_path( | CODE |
| LOW | tests/test_server_path_traversal.py | 525 | def test_rejects_non_object_json_body(self, client: FlaskClient, body: object): | CODE |
| LOW | tests/test_server_path_traversal.py | 537 | def test_rejects_name_that_slugifies_to_empty( | CODE |
| LOW | tests/test_server_path_traversal.py | 611 | def test_whitespace_only_id_rejected_unit(self): | CODE |
| LOW | tests/test_server_path_traversal.py | 626 | def test_control_or_edge_whitespace_id_rejected_unit(self, bad_id: str): | CODE |
| LOW | tests/test_server_path_traversal.py | 638 | def test_multibyte_over_limit_rejected(self): | CODE |
| LOW | tests/test_server_path_traversal.py | 661 | def test_too_long_branch_unit(self): | CODE |
| LOW | tests/test_server_path_traversal.py | 696 | def test_multibyte_branch_over_limit_rejected(self): | CODE |
| LOW | tests/test_server_path_traversal.py | 716 | def test_too_long_branch_via_endpoint(self, client: FlaskClient): | CODE |
| LOW | tests/test_server_path_traversal.py | 738 | def test_rejects_traversal_payloads(self): | CODE |
| LOW | tests/test_server_path_traversal.py | 772 | def test_rejects_non_string_branch(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 41 | def test_matches_simple_at_ref(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 44 | def test_matches_hyphenated_name(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 47 | def test_matches_multiple_refs(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 53 | def test_no_false_positive_on_email_address(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 64 | def test_no_messages_yields_nothing(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 68 | def test_no_at_ref_yields_nothing(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 73 | def test_at_ref_matches_server_yields_hint(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 85 | def test_at_ref_no_matching_server_yields_nothing(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 90 | def test_no_loaded_servers_yields_nothing(self): | CODE |
| LOW⚡ | tests/test_hooks_mcp_namespace_hint.py | 96 | def test_multiple_servers_in_one_message(self): | CODE |
| LOW | tests/test_hooks_mcp_namespace_hint.py | 109 | def test_only_last_user_message_checked(self): | CODE |
| LOW | tests/test_hooks_mcp_namespace_hint.py | 120 | def test_tool_without_description(self): | CODE |
| LOW | tests/test_hooks_mcp_namespace_hint.py | 136 | def test_hint_format_contains_full_tool_name(self): | CODE |
| LOW | tests/test_commands_llm.py | 24 | def test_cmd_model_appends_replacement_prompt_and_persists_generation(tmp_path: Path): | CODE |
| LOW | tests/test_commands_llm.py | 54 | def test_cmd_tools_load_appends_replacement_prompt(tmp_path: Path): | CODE |
| LOW | tests/test_commands_llm.py | 80 | def test_cmd_context_reports_context_savings(tmp_path: Path): | CODE |
| LOW | tests/test_commands_llm.py | 105 | def test_commands_refresh_runtime_fragments_from_live_config( | CODE |
| LOW | tests/test_shell_issue729.py | 26 | def test_stderr_redirect_with_pipe(shell): | CODE |
| LOW | tests/test_shell_issue729.py | 49 | def test_jq_complex_syntax_nested_pipe(shell): | CODE |
| LOW | tests/test_shell_issue729.py | 87 | def test_jq_function_in_filter(shell): | CODE |
| LOW | tests/test_shell_issue729.py | 118 | def test_stdout_and_stderr_redirect(shell): | CODE |
| LOW | tests/test_session_allowlist_isolation.py | 30 | def test_reset_fixture_is_autouse(request: pytest.FixtureRequest) -> None: | CODE |
| 11162 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tauri/src-tauri/src/lan_access.rs | 84 | // ── platform-specific helpers ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tauri/src-tauri/src/lan_access.rs | 113 | // ── Sidecar rebinding (desktop) ──────────────────────────────────────────── | COMMENT |
| MEDIUM | tauri/src-tauri/src/lan_access.rs | 358 | // ── Tauri commands ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tauri/src-tauri/src/lan_access.rs | 487 | // ── tests ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_hooks_mcp_namespace_hint.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hooks_mcp_namespace_hint.py | 37 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hooks_mcp_namespace_hint.py | 58 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_hooks_mcp_namespace_hint.py | 60 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 32 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 34 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 70 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 72 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 114 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 116 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 160 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 162 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_config_trust.py | 184 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 23 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 25 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 74 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 76 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 113 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_shell_max_output_bytes.py | 115 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_computer_api.py | 348 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_computer_api.py | 350 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 119 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 121 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 181 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 213 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 215 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 297 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 299 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_mcp_adapter.py | 801 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_mcp_adapter.py | 803 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_codeblock.py | 900 | # ── Exec lang (shell) ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_codeblock.py | 933 | # ── Non-exec lang (text) ─────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 42 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 44 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 67 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 69 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 93 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 95 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 651 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_lessons.py | 653 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 137 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 139 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 161 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 163 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 202 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 204 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 404 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 406 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 491 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 493 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 777 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 779 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 814 | # ────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_lessons.py | 816 | # ────────────────────────────────────────────── | COMMENT |
| 1546 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_mcp_adapter.py | 816 | except ImportError: | CODE |
| HIGH | tests/test_eval_behavioral_solutions.py | 1374 | except OSError: | CODE |
| HIGH | tests/conftest.py | 644 | except (ImportError, AttributeError): | CODE |
| HIGH | tests/conftest.py | 314 | except Exception: | CODE |
| HIGH | tests/conftest.py | 528 | except ImportError: | CODE |
| HIGH | tests/conftest.py | 537 | except ImportError: | CODE |
| HIGH | tests/conftest.py | 711 | except (subprocess.TimeoutExpired, FileNotFoundError): | CODE |
| HIGH | tests/test_pdf_to_images.py | 44 | except FileNotFoundError: | CODE |
| HIGH | tests/test_circuit_breaker.py | 414 | except Exception: | CODE |
| HIGH | tests/test_llm_anthropic.py | 525 | except Exception: | CODE |
| HIGH | tests/test_shell_background.py | 268 | except ProcessLookupError: | CODE |
| HIGH | tests/test_shell_background.py | 288 | except ProcessLookupError: | CODE |
| HIGH | tests/test_shell_background.py | 416 | except OSError: | CODE |
| HIGH | tests/test_tools_watch.py | 410 | except OSError: | CODE |
| HIGH | tests/test_tools_watch.py | 795 | except OSError: | CODE |
| HIGH | tests/test_tools_watch.py | 840 | except OSError: | CODE |
| HIGH | tests/test_computer_use_integration.py | 184 | except Exception: | CODE |
| HIGH | tests/test_computer_milestone_integration.py | 81 | except Exception: | CODE |
| HIGH | tests/test_sandbox.py | 734 | except RuntimeError: | CODE |
| HIGH | tests/test_computer_docker_config.py | 156 | except ImportError: | CODE |
| HIGH | tests/test_shell_high_fd.py | 75 | except OSError: | CODE |
| HIGH | tests/test_mcp.py | 338 | except RuntimeError: | CODE |
| HIGH | tests/test_shell_sigterm.py | 155 | except ProcessLookupError: | CODE |
| HIGH | tests/test_eval.py | 721 | except OSError: | CODE |
| HIGH | scripts/check_model_freshness.py | 166 | except ValueError: | CODE |
| HIGH | scripts/treeofthoughts.py | 92 | except ValueError: | CODE |
| HIGH | scripts/generate_sounds.py | 406 | except OSError: | CODE |
| HIGH | scripts/demo_capture.py | 380 | except Exception: | CODE |
| HIGH | scripts/demo_capture.py | 423 | except Exception: | CODE |
| HIGH | gptme/dirs.py | 165 | except (subprocess.TimeoutExpired, FileNotFoundError): | CODE |
| HIGH | gptme/dirs.py | 162 | except (subprocess.TimeoutExpired, FileNotFoundError): | CODE |
| HIGH | gptme/checkpoint.py | 294 | except (json.JSONDecodeError, OSError): | CODE |
| HIGH | gptme/constants.py | 49 | except (ColorParseError, ValueError, KeyError): | CODE |
| HIGH | gptme/telemetry.py | 104 | except ImportError: | CODE |
| HIGH | gptme/__version__.py | 47 | except ( | CODE |
| HIGH | gptme/__version__.py | 81 | except (KeyError, AttributeError, TypeError, ValueError, FileNotFoundError): | CODE |
| HIGH | gptme/__version__.py | 98 | except Exception: | CODE |
| HIGH | gptme/init.py | 566 | except ImportError: | CODE |
| HIGH | gptme/info.py | 172 | except Exception: | CODE |
| HIGH | gptme/info.py | 278 | except (FileNotFoundError, OSError, json.JSONDecodeError, KeyError): | CODE |
| HIGH | gptme/knowledge.py | 157 | except json.JSONDecodeError: | CODE |
| HIGH | gptme/knowledge.py | 407 | except OSError: | CODE |
| HIGH | gptme/workspace_snapshot.py | 203 | except ValueError: | CODE |
| HIGH | gptme/workspace_snapshot.py | 270 | except ValueError: | CODE |
| HIGH | gptme/tools/save.py | 229 | except Exception: | CODE |
| HIGH | gptme/tools/shell_validation.py | 957 | except OSError: | CODE |
| HIGH | gptme/tools/computer_transport.py | 102 | except (NotImplementedError, AttributeError): | CODE |
| HIGH | gptme/tools/computer_transport.py | 460 | except Exception: | CODE |
| HIGH | gptme/tools/vision.py | 24 | except OSError: | CODE |
| HIGH | gptme/tools/mcp_adapter.py | 1195 | except (json.JSONDecodeError, TypeError): | CODE |
| HIGH | gptme/tools/convert.py | 760 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 843 | except PlaywrightTimeoutError: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 933 | except PlaywrightTimeoutError: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 64 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 308 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 340 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 589 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 595 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 69 | except Exception: | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 764 | except Exception: | CODE |
| 167 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_shell_issue729.py | 4 | 1. File descriptor redirects (2>/dev/null, 2>&1, etc.) | STRING |
| HIGH | tests/test_config_trust.py | 210 | """EOF on input (e.g. piped /dev/null) defaults to deny.""" | STRING |
| HIGH⚡ | tests/test_codeblock.py | 775 | pwd && ls -la | CODE |
| HIGH⚡ | tests/test_codeblock.py | 781 | assert codeblocks[0] == Codeblock("shell", "pwd && ls -la") | CODE |
| HIGH | tests/test_shell_output_mixing_issue408.py | 106 | ret1, out1, err1 = shell.run("sleep 0.1 && echo 'delayed output'") | CODE |
| HIGH | tests/test_server_client.py | 74 | b'data: {"type": "connected", "session_id": null}' | CODE |
| HIGH | tests/test_shell_foreground_promotion.py | 385 | "touch ran && output 1", | CODE |
| HIGH | tests/test_shell_foreground_promotion.py | 479 | ("timeout 10m a && b", None), | CODE |
| HIGH | tests/test_shell_issue772.py | 5 | 2. Combinations of || with pipe operators (|) | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 27 | Issue: cat .env.local 2>/dev/null || cat .env.example | head -20 | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 31 | The shell tool was treating the first | in || as a pipe operator, | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 40 | code = f"cat /nonexistent 2>/dev/null || cat {temp_file} | head -3" | CODE |
| HIGH⚡ | tests/test_shell_issue772.py | 62 | Verify that || operator works correctly in basic cases. | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 64 | code = "false || echo 'fallback'" | CODE |
| HIGH | tests/test_shell_issue772.py | 85 | code = f"cat /nonexistent 2>/dev/null || cat {temp_file}" | CODE |
| HIGH⚡ | tests/test_shell_issue772.py | 102 | """Test multiple || operators in sequence. | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 104 | Verify that chains of || operators are handled correctly. | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 106 | code = "false || false || echo 'third try'" | CODE |
| HIGH⚡ | tests/test_shell_issue772.py | 115 | """Test combination of || and && operators. | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 115 | """Test combination of || and && operators. | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 119 | code = "true && echo 'success' || echo 'failure'" | CODE |
| HIGH⚡ | tests/test_shell_issue772.py | 133 | cat file1 2>/dev/null || cat file2 | head -20 | STRING |
| HIGH⚡ | tests/test_shell_issue772.py | 136 | - stderr redirect (2>/dev/null) | STRING |
| HIGH | tests/test_shell_issue772.py | 147 | code = f"cat /nonexistent 2>/dev/null || cat {temp_file} | head -5" | CODE |
| HIGH | tests/test_message.py | 394 | command = 'pwd && echo "done"' | CODE |
| HIGH | tests/test_execenv.py | 411 | env.run("cat input.txt > output.txt && echo ' modified' >> output.txt") | CODE |
| HIGH | tests/test_tools_watch.py | 572 | ("sleep 1m && make test", "make test"), | CODE |
| HIGH | tests/test_chats_external_search.py | 509 | ("b-null-messages", '{"messages": null}'), | CODE |
| HIGH | tests/test_chats_external_search.py | 452 | """Valid JSON that is not an object (list, string, null) is skipped per line.""" | STRING |
| HIGH | tests/test_logmanager_corrupt_lines.py | 28 | b'{"role": "assistant", "content": null}\n', | CODE |
| HIGH⚡ | tests/test_tools_shell_multiline.py | 13 | gh pr checks "$pr" --json name,conclusion,workflowName --jq '.[] | select(.conclusion != null) | "\\(.workflowName): \ | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 209 | assert _find_first_unquoted_pipe("cmd1 || cmd2") is None | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 212 | result = _find_first_unquoted_pipe("cmd1 || cmd2 | cmd3") | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 215 | cmd = "cmd1 || cmd2 | cmd3" | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 1440 | assert is_allowlisted("ls -la && pwd") | CODE |
| HIGH | tests/test_sandbox.py | 1020 | # (suppressed with 2>/dev/null) so pre-existing lower hard limits are | COMMENT |
| HIGH | tests/test_sandbox.py | 1031 | # Hard limit is best-effort (2>/dev/null) so a pre-existing lower | COMMENT |
| HIGH | tests/test_cli_hooks_settings_shape.py | 19 | b'{"hooks": {"PreToolUse": [{"hooks": [{"command": null}]}]}}', | CODE |
| HIGH⚡ | tests/test_shell_parser.py | 124 | ("echo a && echo b", "echo a && echo b"), | CODE |
| HIGH⚡ | tests/test_util_review.py | 1523 | self._review_jsonl('```json\n{"findings": null}\n```') | CODE |
| HIGH⚡ | tests/test_util_review.py | 1518 | """When findings key is not a list (null, int, dict), the block is skipped.""" | STRING |
| HIGH | tests/test_util_review.py | 363 | """Non-list findings value (null, int, dict) must not crash from_dict.""" | STRING |
| HIGH⚡ | tests/test_tools_shell.py | 1154 | messages = list(execute_shell(None, None, {"command": "echo a && echo b"})) | CODE |
| HIGH | tests/test_tools_shell.py | 1502 | # stdin is a pipe (not /dev/null, not terminal) | COMMENT |
| HIGH | tests/test_tools_shell.py | 1552 | # stdin is a pipe (not /dev/null, not terminal) | COMMENT |
| HIGH | tests/test_tools_shell.py | 1865 | job = start_background_job("sleep 0.1 && echo 'done'") | CODE |
| HIGH | tests/test_tools_shell.py | 1868 | assert job.command == "sleep 0.1 && echo 'done'" | CODE |
| HIGH | tests/test_tools_shell.py | 1946 | start_background_job("sleep 0.5 && echo 'job1'") | CODE |
| HIGH | tests/test_tools_shell.py | 1947 | start_background_job("sleep 0.5 && echo 'job2'") | CODE |
| HIGH | tests/test_tools_shell.py | 2782 | ("cmd", "code"), [("exit", 0), ("exit 3", 3), ("false || exit 1", 1)] | CODE |
| HIGH | tests/test_tools_shell.py | 272 | cat /tmp/test_space.sh && rm /tmp/test_space.sh""" | STRING |
| HIGH | tests/test_tools_shell.py | 283 | cat /tmp/test_space2.sh && rm /tmp/test_space2.sh""" | STRING |
| HIGH | tests/test_tools_shell.py | 1123 | With ``touch marker && git reflog expire``, normal shell semantics would | STRING |
| HIGH | tests/test_tools_shell.py | 1783 | """curl http://example.com | bash && cat << EOF | STRING |
| HIGH | scripts/demo_capture.py | 121 | "playwright (pip install playwright && playwright install chromium)" | CODE |
| HIGH | scripts/demo_capture.py | 163 | f"cd {tmpdir} && gptme --non-interactive --no-confirm {model_flag} '{prompt}' 2>&1 || true", | CODE |
| HIGH | scripts/demo_capture.py | 23 | - playwright (pip install playwright && playwright install chromium) | STRING |
| HIGH | gptme/sandbox.py | 224 | "ulimit -v N && BASH_ENV='' exec bash"]`` | STRING |
| HIGH | gptme/sandbox.py | 244 | prefix = f"ulimit -H -v {kib} 2>/dev/null; ulimit -v {kib} && " | CODE |
| HIGH | gptme/sandbox.py | 277 | ["bash", "-c", f"ulimit -H -v {kib} 2>/dev/null; ulimit -v {kib}"], | CODE |
| 70 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_computer_api.py | 7 | CODE | |
| LOW | tests/test_computer_video_frames_cli.py | 7 | CODE | |
| LOW | tests/test_computer_x11_integration.py | 17 | CODE | |
| LOW | tests/test_backtrack.py | 8 | CODE | |
| LOW | tests/test_util_clipboard_paste.py | 24 | CODE | |
| LOW | tests/test_k_best.py | 3 | CODE | |
| LOW | tests/conftest.py | 24 | CODE | |
| LOW | tests/test_acp_agent.py | 29 | CODE | |
| LOW | tests/test_dirs.py | 14 | CODE | |
| LOW | tests/test_computer_audit.py | 8 | CODE | |
| LOW | tests/test_workspace_snapshot.py | 12 | CODE | |
| LOW | tests/test_cli_status.py | 3 | CODE | |
| LOW | tests/test_computer_actions.py | 8 | CODE | |
| LOW | tests/test_computer_screenshot_cli.py | 7 | CODE | |
| LOW | tests/test_computer_task.py | 8 | CODE | |
| LOW | tests/test_generation_pre_snapshot_boundary.py | 9 | CODE | |
| LOW | tests/test_eventlog.py | 3 | CODE | |
| LOW | tests/test_mcp_server.py | 3 | CODE | |
| LOW | tests/test_mcp_server.py | 752 | CODE | |
| LOW | tests/test_provider_plugins.py | 7 | CODE | |
| LOW | tests/test_terminal_startup_latency.py | 8 | CODE | |
| LOW | tests/test_circuit_breaker.py | 11 | CODE | |
| LOW | tests/test_anti_slop.py | 3 | CODE | |
| LOW | tests/test_timings.py | 22 | CODE | |
| LOW | tests/test_acp_client.py | 12 | CODE | |
| LOW | tests/test_acp_client.py | 32 | CODE | |
| LOW | tests/test_model_selection_trace_export.py | 3 | CODE | |
| LOW | tests/test_cli_from_turn.py | 3 | CODE | |
| LOW | tests/test_tools_hashline_edit.py | 3 | CODE | |
| LOW | tests/test_computer_record.py | 8 | CODE | |
| LOW | tests/test_local_discovery.py | 7 | CODE | |
| LOW | tests/test_tasks_api.py | 18 | CODE | |
| LOW | tests/test_context_providers.py | 10 | CODE | |
| LOW | tests/test_execute_msg_hook_call_id.py | 17 | CODE | |
| LOW | tests/test_computer_doctor_cmd.py | 7 | CODE | |
| LOW | tests/test_acp_session_runtime.py | 3 | CODE | |
| LOW | tests/test_cmd_service.py | 7 | CODE | |
| LOW | tests/test_util_hooks.py | 3 | CODE | |
| LOW | tests/test_tools_request_tool_change.py | 3 | CODE | |
| LOW | tests/test_computer_demo_cmd.py | 8 | CODE | |
| LOW | tests/test_gptme_provider.py | 8 | CODE | |
| LOW | tests/test_acp_protocol_logging.py | 7 | CODE | |
| LOW | tests/test_github_ci_self_heal.py | 1 | CODE | |
| LOW | tests/test_browser_state.py | 3 | CODE | |
| LOW | tests/test_computer_run_task_cli.py | 8 | CODE | |
| LOW | tests/test_browser_blockage.py | 18 | CODE | |
| LOW | tests/test_snapshot_command.py | 3 | CODE | |
| LOW | tests/test_snapshot_command.py | 14 | CODE | |
| LOW | tests/test_treeofthoughts.py | 8 | CODE | |
| LOW | tests/test_tools_convert.py | 3 | CODE | |
| LOW | tests/test_agent_fork_command.py | 8 | CODE | |
| LOW | tests/test_computer_gate.py | 11 | CODE | |
| LOW | tests/test_computer_use_integration.py | 18 | CODE | |
| LOW | tests/test_chat.py | 2097 | CODE | |
| LOW | tests/test_computer_milestone_integration.py | 23 | CODE | |
| LOW | tests/test_util_cli_review_watch.py | 3 | CODE | |
| LOW | tests/test_computer_docker_config.py | 15 | CODE | |
| LOW | tests/test_skill_commands.py | 184 | CODE | |
| LOW | tests/test_acp_e2e_smoke.py | 13 | CODE | |
| LOW | tests/test_memory_store.py | 1136 | CODE | |
| 737 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_eval_behavioral_solutions.py | 925 | except Exception: | STRING |
| LOW | tests/test_eval_behavioral_solutions.py | 1435 | except Exception as e: | STRING |
| LOW | tests/conftest.py | 143 | except Exception: | CODE |
| LOW | tests/conftest.py | 314 | except Exception: | CODE |
| LOW | tests/conftest.py | 477 | except Exception as e: | CODE |
| LOW | tests/conftest.py | 539 | except Exception as e: | CODE |
| LOW | tests/conftest.py | 587 | except Exception: | CODE |
| LOW | tests/conftest.py | 885 | except Exception as e: | CODE |
| LOW | tests/test_acp_agent.py | 416 | except Exception as e: | CODE |
| LOW | tests/test_chat_history.py | 69 | except Exception as e: | CODE |
| MEDIUM | tests/test_chat_history.py | 70 | print(f"Error generating chat history: {e}") | CODE |
| MEDIUM | tests/test_circuit_breaker.py | 345 | def do_fail(): | CODE |
| MEDIUM | tests/test_circuit_breaker.py | 371 | def do_fail(): | CODE |
| LOW⚡ | tests/test_circuit_breaker.py | 348 | except Exception as e: | CODE |
| LOW | tests/test_circuit_breaker.py | 414 | except Exception: | CODE |
| LOW | tests/test_hooks_server_confirm.py | 211 | except Exception as e: | CODE |
| LOW | tests/test_hooks_server_confirm.py | 219 | except Exception as e: | CODE |
| MEDIUM | tests/test_hooks_server_confirm.py | 204 | def register_and_wait(tool_id): | CODE |
| LOW | tests/test_llm_anthropic.py | 525 | except Exception: | CODE |
| MEDIUM | tests/test_subagent_unit.py | 6273 | def thread_target(): | CODE |
| LOW | tests/test_subagent_unit.py | 6285 | except Exception as e: | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 1022 | print(f"Error: negative value {value}") | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 1028 | print(f"Error: {e}") | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 984 | def process_record(record): | CODE |
| LOW⚡ | tests/test_eval_behavioral.py | 1680 | except Exception: | CODE |
| LOW | tests/test_eval_behavioral.py | 2949 | except Exception as err: | STRING |
| LOW⚡ | tests/test_mcp_discovery.py | 167 | except Exception as e: | CODE |
| MEDIUM | tests/test_computer_use_integration.py | 37 | def _playwright_available() -> bool: | CODE |
| LOW⚡ | tests/test_computer_use_integration.py | 184 | except Exception: | CODE |
| LOW | tests/test_computer_use_integration.py | 61 | except Exception: | CODE |
| MEDIUM | tests/test_computer_milestone_integration.py | 34 | def _playwright_available() -> bool: | CODE |
| LOW⚡ | tests/test_computer_milestone_integration.py | 81 | except Exception: | CODE |
| LOW | tests/test_computer_milestone_integration.py | 54 | except Exception: | CODE |
| LOW | tests/test_memory_store.py | 63 | except Exception as exc: | CODE |
| LOW | tests/test_memory_store.py | 77 | except Exception as exc: | CODE |
| LOW⚡ | tests/test_server_bad_input.py | 357 | except Exception: | CODE |
| LOW | tests/test_llm_openai.py | 697 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1317 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1366 | except Exception: | CODE |
| LOW | tests/test_server_session_models.py | 849 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 858 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 891 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 899 | except Exception as e: | CODE |
| LOW | tests/test_oauth_openrouter.py | 88 | except Exception as e: | CODE |
| MEDIUM | tests/test_oauth_openrouter.py | 81 | def target() -> None: | CODE |
| MEDIUM | tests/test_hooks_registry.py | 945 | def registerer(): | CODE |
| MEDIUM | tests/test_hooks_registry.py | 954 | def unregisterer(): | CODE |
| LOW | tests/test_hooks_registry.py | 951 | except Exception as e: | CODE |
| LOW | tests/test_hooks_registry.py | 958 | except Exception as e: | CODE |
| LOW | tests/test_url_safety.py | 156 | except Exception as e: | CODE |
| LOW | tests/test_tui.py | 590 | except Exception as e: | CODE |
| MEDIUM | scripts/auto_rename_logs.py | 44 | print(f"Error: Logs directory not found: {logs_dir}") | CODE |
| LOW | scripts/auto_rename_logs.py | 142 | except Exception as e: | CODE |
| MEDIUM | scripts/auto_rename_logs.py | 143 | print(f"Error processing {conv_dir}: {e}") | CODE |
| LOW | scripts/treeofthoughts.py | 285 | except Exception: | CODE |
| MEDIUM | scripts/treeofthoughts.py | 454 | print(f"Error: workspace {workspace} is not a directory", file=sys.stderr) | CODE |
| LOW⚡ | scripts/eval_phase0_pruning.py | 266 | except Exception as exc: | CODE |
| LOW | scripts/eval_phase0_pruning.py | 291 | except Exception as exc: | CODE |
| LOW | scripts/eval_phase0_pruning.py | 347 | except Exception as exc: | CODE |
| MEDIUM | scripts/github_bot.py | 72 | print(f"Error: {name} environment variable is required", file=sys.stderr) | CODE |
| 621 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_server_path_traversal.py | 400 | # Create the logdir and a valid conversation log so the | COMMENT |
| MEDIUM | tests/test_shell_issue729.py | 58 | # Create a test JSON file | COMMENT |
| MEDIUM | tests/test_cost_awareness_delayed_warning.py | 72 | # Create a messages list with a user message | COMMENT |
| MEDIUM | tests/test_cost_awareness_delayed_warning.py | 97 | # Create a messages list with an assistant message | COMMENT |
| MEDIUM | tests/test_eval_behavioral_solutions.py | 205 | # Create the shared validation module | STRING |
| MEDIUM | tests/test_replay.py | 293 | # Create a working context that's nearly full (simulated) | COMMENT |
| MEDIUM | tests/test_utils.py | 16 | # Create a test image file that is 0.8MB raw (within 1MB limit) | COMMENT |
| MEDIUM | tests/test_utils.py | 53 | # Create a file that is 1.2MB (exceeds 1MB limit) | COMMENT |
| MEDIUM | tests/conftest.py | 620 | # Create a temporary file with the given content | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 1070 | # Create a fake log directory with a conversation.jsonl | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 2000 | # Create a minimal log dir so new_session can resume from disk | COMMENT |
| MEDIUM | tests/test_tools_chats.py | 13 | # Create a test conversation containing "python" | COMMENT |
| MEDIUM | tests/test_server_v2.py | 2351 | # Create a conversation with a non-test prefix so it isn't filtered out | COMMENT |
| MEDIUM | tests/test_server_v2.py | 2384 | # Create a real conversation with a non-test prefix so it isn't filtered | COMMENT |
| MEDIUM | tests/test_util_cli_skills.py | 174 | # Create a skill so the index isn't empty (tests the "not found" path, not "empty index") | COMMENT |
| MEDIUM | tests/test_util_cli_skills.py | 363 | # Create a skill where metadata.name differs from the H1 title | COMMENT |
| MEDIUM⚡ | tests/test_demo_capture.py | 48 | # Create a fake file | COMMENT |
| MEDIUM | tests/test_agent.py | 451 | # Create a plist file | COMMENT |
| MEDIUM | tests/test_agent.py | 771 | # Create a fake workspace | COMMENT |
| MEDIUM | tests/test_agent.py | 991 | # Create a repo with multiple commits | COMMENT |
| MEDIUM⚡ | tests/test_tools_save.py | 137 | # Create a directory outside the cwd | COMMENT |
| MEDIUM⚡ | tests/test_tools_save.py | 146 | # Create a symlink in work_dir pointing to outside_dir | COMMENT |
| MEDIUM | tests/test_tools_save.py | 115 | # Create a subdirectory to work from | COMMENT |
| MEDIUM | tests/test_tools_save.py | 193 | # Create a symlink in work_dir pointing to outside_dir | COMMENT |
| MEDIUM⚡ | tests/test_misc_subprocess_timeouts.py | 198 | # Create a file so glob has something to find | COMMENT |
| MEDIUM | tests/test_llm_utils.py | 366 | # Create a file with a tilde path won't work in CI, but we can test | COMMENT |
| MEDIUM | tests/test_tool_use.py | 239 | "import numpy as np\nimport pandas as pd\n\n# Create a simple dataset\n" | CODE |
| MEDIUM⚡ | tests/test_chat_history.py | 30 | # Create a few mock conversations | COMMENT |
| MEDIUM | tests/test_plugins.py | 463 | # Create a hook module with register() function | COMMENT |
| MEDIUM | tests/test_agent_service_timeouts.py | 100 | # Create a temp file to simulate a log file | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 587 | # Create a body that exceeds 1000 tokens (4000 chars) | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 616 | # Create a body with identifiable start and end | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 665 | # Create a mock response with a very long review comment | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 720 | # Create a long comment with a suggestion in the middle (where truncation would remove it) | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 842 | # Create a diff larger than default budget (4000 tokens = 16000 chars) | COMMENT |
| MEDIUM | tests/test_custom_providers.py | 260 | # Create a minimal tool spec | COMMENT |
| MEDIUM | tests/test_prompt.py | 123 | # Create a symlink | COMMENT |
| MEDIUM | tests/test_prompt.py | 148 | # Create a new file in tmp_path | COMMENT |
| MEDIUM⚡ | tests/test_util_safety.py | 202 | # Create a report with artificially high-risk segments | COMMENT |
| MEDIUM⚡ | tests/test_message.py | 461 | # Create a test file in tmp_path | COMMENT |
| MEDIUM⚡ | tests/test_message.py | 749 | # Create a message - role with special chars is unusual but should be safe | COMMENT |
| MEDIUM | tests/test_llm_anthropic.py | 484 | # Create a mock that looks like an Anthropic API 500 error | COMMENT |
| MEDIUM⚡ | tests/test_prompt_skills_summary.py | 17 | # Create a mock skill file | COMMENT |
| MEDIUM | tests/test_prompt_skills_summary.py | 56 | # Create a mock skill file with long description | COMMENT |
| MEDIUM⚡ | tests/test_prompts.py | 214 | # Create a temp workspace with a file | COMMENT |
| MEDIUM⚡ | tests/test_prompts.py | 219 | # Create a file outside workspace | COMMENT |
| MEDIUM⚡ | tests/test_prompts.py | 224 | # Create a gptme.toml with path traversal attempt | COMMENT |
| MEDIUM | tests/test_prompts.py | 760 | # Create a test profile | COMMENT |
| MEDIUM | tests/test_prompts.py | 825 | # Create a test profile | COMMENT |
| MEDIUM | tests/test_execenv.py | 237 | # Create a mock log file | COMMENT |
| MEDIUM⚡ | tests/test_tasks_api.py | 1023 | # Create a temp task file | COMMENT |
| MEDIUM | tests/test_tasks_api.py | 219 | # Create a fake repo subdir with .git | COMMENT |
| MEDIUM⚡ | tests/test_context_providers.py | 289 | # Create a provider class with a specific name for testing | COMMENT |
| MEDIUM | tests/test_tools_browser.py | 456 | # Create a minimal mock for pypdf | COMMENT |
| MEDIUM | tests/test_computer_doctor_cmd.py | 736 | # Create a tmp_path home with no .Xdefaults | COMMENT |
| MEDIUM | tests/test_acp_session_runtime.py | 197 | # Create a conversation via the API so LogManager can find it | COMMENT |
| MEDIUM | tests/test_acp_session_runtime.py | 208 | # Create a session backed by the dummy ACP runtime | COMMENT |
| MEDIUM | tests/test_acp_session_runtime.py | 980 | # Create a session with a dead ACP runtime | COMMENT |
| MEDIUM⚡ | tests/test_lessons_matcher.py | 374 | # Create a lesson file | COMMENT |
| MEDIUM | tests/test_lessons_matcher.py | 422 | # Create a lesson file | COMMENT |
| 119 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_eval_behavioral_solutions.py | 55 | CODE | |
| LOW | tests/conftest.py | 256 | CODE | |
| LOW | tests/conftest.py | 544 | CODE | |
| LOW | tests/conftest.py | 675 | CODE | |
| LOW | tests/conftest.py | 852 | CODE | |
| LOW | tests/conftest.py | 683 | CODE | |
| LOW | tests/conftest.py | 861 | CODE | |
| LOW | tests/test_tree.py | 12 | CODE | |
| LOW | tests/test_onboard.py | 27 | CODE | |
| LOW | tests/test_plugins.py | 369 | CODE | |
| LOW | tests/test_server_parent_death_watcher.py | 45 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 194 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 228 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 712 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 201 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 745 | CODE | |
| LOW | tests/test_hooks_server_confirm.py | 301 | CODE | |
| LOW | tests/test_hooks_server_confirm.py | 329 | CODE | |
| LOW | tests/test_shell_background.py | 291 | CODE | |
| LOW | tests/test_shell_background.py | 391 | CODE | |
| LOW | tests/test_workspace_memory_policy.py | 80 | CODE | |
| LOW | tests/test_computer_docker_config.py | 32 | CODE | |
| LOW | tests/test_tools_subagent.py | 1268 | CODE | |
| LOW | tests/test_tools_subagent.py | 1322 | CODE | |
| LOW | tests/test_computer_semantic_fixtures.py | 183 | CODE | |
| LOW | tests/test_shell_high_fd.py | 57 | CODE | |
| LOW | tests/test_cli.py | 2197 | CODE | |
| LOW | tests/test_shell_sigterm.py | 31 | CODE | |
| LOW | docs/conf.py | 25 | CODE | |
| LOW | scripts/check_model_freshness.py | 95 | CODE | |
| LOW | scripts/auto_rename_logs.py | 32 | CODE | |
| LOW | scripts/github_ci_self_heal.py | 294 | CODE | |
| LOW | scripts/github_ci_self_heal.py | 305 | CODE | |
| LOW | scripts/smoke_frozen_server.py | 47 | CODE | |
| LOW | scripts/treeofthoughts.py | 183 | CODE | |
| LOW | scripts/generate_sounds.py | 371 | CODE | |
| LOW | scripts/eval_phase0_pruning.py | 260 | CODE | |
| LOW | scripts/check_docs_repo_links.py | 31 | CODE | |
| LOW | scripts/check_docs_repo_links.py | 78 | CODE | |
| LOW | scripts/build_changelog.py | 239 | CODE | |
| LOW | scripts/build_changelog.py | 371 | CODE | |
| LOW | scripts/build_changelog.py | 504 | CODE | |
| LOW | scripts/check_rst_formatting.py | 62 | CODE | |
| LOW | scripts/check_rst_formatting.py | 382 | CODE | |
| LOW | scripts/check_rst_formatting.py | 504 | CODE | |
| LOW | scripts/analyze_compression.py | 33 | CODE | |
| LOW | scripts/analyze_compression.py | 132 | CODE | |
| LOW | scripts/analyze_compression.py | 236 | CODE | |
| LOW | scripts/analyze_compression.py | 329 | CODE | |
| LOW | scripts/analyze_compression.py | 502 | CODE | |
| LOW | scripts/demo_capture.py | 133 | CODE | |
| LOW | scripts/demo_capture.py | 200 | CODE | |
| LOW | scripts/demo_capture.py | 286 | CODE | |
| LOW | scripts/demo_capture.py | 485 | CODE | |
| LOW | gptme/dirs.py | 126 | CODE | |
| LOW | gptme/checkpoint.py | 240 | CODE | |
| LOW | gptme/prompt_queue.py | 141 | CODE | |
| LOW | gptme/model_attestation.py | 136 | CODE | |
| LOW | gptme/telemetry.py | 166 | CODE | |
| LOW | gptme/message.py | 641 | CODE | |
| 472 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_eval_behavioral_solutions.py | 586 | def update_metadata(self, key: str, info: dict[str, Any]) -> None: | STRING |
| LOW | tests/conftest.py | 48 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/test_workspace_snapshot.py | 344 | def set_git_dates(timestamp: int) -> None: | CODE |
| LOW | tests/test_server_tts_api.py | 12 | def _set_openrouter_key(monkeypatch: pytest.MonkeyPatch, value: str | None) -> None: | CODE |
| LOW | tests/test_server_v2_auto_stepping.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/test_acp_session_runtime.py | 64 | async def set_session_model(self, session_id: str, model_id: str) -> None: | CODE |
| LOW | tests/thread_leak.py | 30 | __all__ = [ | CODE |
| LOW⚡ | tests/test_subagent_unit.py | 7042 | def _set_agent_id(self, agent_id: str) -> None: | CODE |
| LOW | tests/test_eval_behavioral.py | 1055 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/test_server_v2_tool_confirmation.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/auto_rename_logs.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/github_bot.py | 77 | def set_github_env(name: str, value: str) -> None: | CODE |
| LOW | scripts/build_changelog.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/analyze_compression.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | scripts/train/collect.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/dirs.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/prompt_queue.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/model_attestation.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/model_attestation.py | 288 | def set_selection_trace(trace: ModelSelectionTrace | None) -> None: | CODE |
| LOW | gptme/session.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/__init__.py | 13 | __all__ = [ | CODE |
| LOW | gptme/telemetry.py | 35 | __all__ = [ | CODE |
| LOW | gptme/telemetry.py | 53 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/message.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/message.py | 45 | def set_output_format(fmt: str) -> None: | CODE |
| LOW | gptme/status_provider.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/sandbox.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/chat.py | 62 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/circuit_breaker.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/circuit_breaker.py | 286 | __all__ = [ | CODE |
| LOW | gptme/k_best.py | 38 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/init.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/init.py | 494 | def _set_console_compact(enabled: bool) -> None: | CODE |
| LOW | gptme/profiles.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/executor.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/workspace_snapshot.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_lynx.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell_validation.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell_flags.py | 34 | __all__ = ["FlagSpec", "PERMITTED_FLAGS", "flags_permitted"] | CODE |
| LOW | gptme/tools/_browser_perplexity.py | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/clarify.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/lessons.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/memory.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/gh.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/convert.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_url_safety.py | 19 | def set_session_allow_hosts(allow_hosts: list[str] | None) -> None: | CODE |
| LOW | gptme/tools/_browser_playwright.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 197 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 677 | def _set_cwd(self, cwd: str) -> None: | CODE |
| LOW | gptme/tools/shell.py | 2355 | def set_workspace_cwd(cwd: str) -> None: | CODE |
| LOW | gptme/tools/shell.py | 2391 | def set_shell(shell: ShellSession) -> None: | CODE |
| LOW | gptme/tools/tmux.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | gptme/tools/__init__.py | 96 | def _set_available_tools_cache(tools: list[ToolSpec] | None) -> None: | CODE |
| LOW | gptme/tools/__init__.py | 43 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/__init__.py | 46 | __all__ = [ | CODE |
| LOW | gptme/tools/__init__.py | 953 | def set_tools(tools: list[ToolSpec]) -> None: | CODE |
| LOW | gptme/tools/__init__.py | 968 | def set_session_allowlist(allowlist: list[str] | None) -> None: | CODE |
| LOW | gptme/tools/computer.py | 122 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | gptme/tools/_browser_thread.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_thread.py | 48 | def set_storage_state_override(path: Path | None) -> None: | CODE |
| 274 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_dspy_basic.py | 13 | # Check if DSPy is available and handle import errors gracefully | COMMENT |
| LOW | tests/conftest.py | 289 | # Check if Anthropic quota is exhausted to skip API tests gracefully. | COMMENT |
| LOW⚡ | tests/test_chat_history.py | 23 | # Check if feature is enabled | COMMENT |
| LOW | tests/test_hybrid_lessons.py | 12 | # Check if hybrid matching is available | COMMENT |
| LOW⚡ | tests/test_context_providers.py | 540 | # Check if compression is needed | COMMENT |
| LOW | tests/test_server_v2_hooks.py | 76 | # Check if test SESSION_START hook message is in the log | COMMENT |
| LOW | tests/test_server_v2_hooks.py | 125 | # Check if test STEP_PRE hook message is in the log | COMMENT |
| LOW | tests/test_server_v2_hooks.py | 228 | # Check if test TURN_POST hook message is in the log | COMMENT |
| LOW | tests/test_tools_computer.py | 38 | # Check if xrandr is available and can run successfully | COMMENT |
| LOW | tests/test_auto_compact.py | 368 | # Check if original had <think>, if so, compacted should too | COMMENT |
| LOW⚡ | tests/test_tools_morph.py | 260 | # Set cwd to a subdirectory so the file path escapes it | COMMENT |
| LOW | tests/test_cli.py | 1388 | # Set timeout to 5 minutes to avoid Anthropic's streaming recommendation | COMMENT |
| LOW | tests/test_dspy_hybrid.py | 5 | # Check if DSPy is available and handle import errors gracefully | COMMENT |
| LOW | tests/test_tools_shell.py | 1492 | # Check if stdin is /dev/null | COMMENT |
| LOW | tests/test_tools_shell.py | 1542 | # Check if stdin is /dev/null | COMMENT |
| LOW | scripts/github_bot.py | 454 | # Check if there are changes | COMMENT |
| LOW | scripts/check_rst_formatting.py | 100 | # Check if we're exiting a code block (line with same or less indentation that has content) | COMMENT |
| LOW | scripts/check_rst_formatting.py | 136 | # Check if there's a blank line between this and the parent list item | COMMENT |
| LOW | scripts/check_rst_formatting.py | 149 | # Check if a new list needs a blank line before it. An item that follows | COMMENT |
| LOW | scripts/check_rst_formatting.py | 160 | # Check if there's no blank line before this list | COMMENT |
| LOW | scripts/check_poetry_lock_sync.sh | 13 | # Check if poetry.lock is in sync with pyproject.toml | COMMENT |
| LOW | scripts/demo_capture.py | 109 | # Check if playwright is importable | COMMENT |
| LOW | scripts/demo_capture.py | 375 | # Check if server is already running | COMMENT |
| LOW | scripts/demo_capture.py | 418 | # Check if already running | COMMENT |
| LOW | scripts/demo_capture.py | 616 | # Print results | COMMENT |
| LOW | scripts/build_server_executable.sh | 6 | # Check if we're in the project root | COMMENT |
| LOW | scripts/build_server_executable.sh | 24 | # Check if build was successful | COMMENT |
| LOW | webui/server.py | 36 | # Check if this looks like an asset request | COMMENT |
| LOW | gptme/chat.py | 688 | # Check if user declined execution - return to prompt without generating response | COMMENT |
| LOW | gptme/chat.py | 738 | # Check if there are any runnable tools left. After a mid-turn | COMMENT |
| LOW | gptme/chat.py | 908 | # Check if we should prompt for input or generate response directly | COMMENT |
| LOW | gptme/codeblock.py | 604 | # Check if this line starts with backticks (potential opening or closing) | COMMENT |
| LOW | gptme/codeblock.py | 608 | # Check if this is a bare fence (only backticks on the line) | COMMENT |
| LOW | gptme/codeblock.py | 696 | # Check if this line is a bare fence (only backticks) | COMMENT |
| LOW | gptme/codeblock.py | 702 | # Check if there's content after it (allowing blank lines) | COMMENT |
| LOW | gptme/init.py | 212 | # Check if model has provider/model format | COMMENT |
| LOW | gptme/init.py | 215 | # Check if it's a built-in provider or custom provider | COMMENT |
| LOW | gptme/info.py | 268 | # Check if editable via direct_url.json | COMMENT |
| LOW | gptme/info.py | 287 | # Check if installed via pipx (lives in ~/.local/pipx/) | COMMENT |
| LOW | gptme/info.py | 305 | # Check if any of the indicator packages are installed | COMMENT |
| LOW | gptme/tools/save.py | 171 | # Check if file exists and store original content for comparison | COMMENT |
| LOW | gptme/tools/save.py | 176 | # Check if folder exists | COMMENT |
| LOW | gptme/tools/save.py | 209 | # Check if this was an inefficient overwrite (minimal changes) | COMMENT |
| LOW | gptme/tools/save.py | 268 | # Check if folder exists first | COMMENT |
| LOW | gptme/tools/shell_validation.py | 339 | # Check if this pipe is inside quotes | COMMENT |
| LOW | gptme/tools/shell_validation.py | 341 | # Check if this is part of || (logical OR) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 694 | # Check if all commands in the pipeline are allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 839 | # Check if command is allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 866 | # Check if disabled via environment variable | COMMENT |
| LOW | gptme/tools/shell_validation.py | 870 | # Check if shellcheck is available | COMMENT |
| LOW | gptme/tools/shell_validation.py | 939 | # Check if any triggered codes are error codes (should block) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 300 | # Check if remaining text is the delimiter. Include the | STRING |
| LOW | gptme/tools/shell_validation.py | 307 | # Check if the line from pos to newline_idx is just the delimiter. | STRING |
| LOW | gptme/tools/gh.py | 244 | # Check if all checks are done | COMMENT |
| LOW | gptme/tools/mcp_adapter.py | 585 | # Check if server already loaded | COMMENT |
| LOW | gptme/tools/mcp_adapter.py | 589 | # Check if server is in config | COMMENT |
| LOW | gptme/tools/shell.py | 888 | # Check if -S or -n flags are present (they disable TTY need) | COMMENT |
| LOW | gptme/tools/shell.py | 1169 | # Check if there's already stdin redirection | COMMENT |
| LOW | gptme/tools/tmux.py | 380 | # Check if output changed (comparing stripped content) | COMMENT |
| LOW | gptme/tools/tmux.py | 385 | # Check if output has been stable long enough | COMMENT |
| 119 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_eval_behavioral_solutions.py | 714 | \ import re def parse_args(input_str): \"\"\"Parse a string of arguments respe | STRING |
| HIGH | tests/test_eval_behavioral_solutions.py | 1041 | \ \"\"\"API client for external service.\"\"\" import urllib.request import json | STRING |
| HIGH | tests/test_eval_behavioral.py | 2732 | \ import re def parse_args(input_str): """Parse a shell-like argument string into a list of tokens. Handles q | STRING |
| HIGH | gptme/dirs.py | 172 | Get the persistent memory directory for an agent profile. Each profile gets its own memory directory where the suba | STRING |
| HIGH | gptme/model_attestation.py | 239 | Convenience constructor for creating a selection trace. Args: requested_model: The model string as requeste | STRING |
| HIGH | gptme/session.py | 81 | Create a new session. Args: session_id: Unique session identifier log: Optional LogMana | STRING |
| HIGH | gptme/message.py | 389 | Concatenate two messages of the same role. Merges content with separator, and combines files and file_hashes. | STRING |
| HIGH | gptme/sandbox.py | 518 | Return path to the cached CPython WASI binary, downloading if needed. Args: path: Override cache path. Defa | STRING |
| HIGH | gptme/k_best.py | 77 | Decorator factory: run the wrapped function K times and return the best result. Args: k: Number of candidat | STRING |
| HIGH | gptme/knowledge.py | 206 | Save a knowledge entry to the cross-session knowledge base. Args: problem: Primary content — the problem, d | STRING |
| HIGH | gptme/tools/_browser_playwright.py | 784 | Load a previously saved browser session (cookies, localStorage) from a file. This is the in-session complement to ` | STRING |
| HIGH | gptme/tools/_browser_playwright.py | 941 | Press a keyboard key or shortcut in the current browser page. Dispatches the key event to the active focused elemen | STRING |
| HIGH | gptme/tools/computer.py | 770 | Return a text dump of the AT-SPI2 accessibility tree for all desktop apps. Requires the optional ``pyatspi`` packag | STRING |
| HIGH | gptme/tools/computer.py | 848 | Find an accessible element by role and name and return its center coordinates. Looks up the element via AT-SPI2, co | STRING |
| HIGH | gptme/tools/computer.py | 944 | Return a text dump of the macOS accessibility tree for visible apps. Uses AppleScript via ``osascript`` to query th | STRING |
| HIGH | gptme/tools/computer.py | 1048 | Find a UI element on macOS by AX role and name and return its center coordinates. Searches the frontmost applicatio | STRING |
| HIGH | gptme/tools/computer.py | 2436 | Start recording the screen to an MP4 file. Uses ``ffmpeg`` with ``x11grab`` (Linux) or ``avfoundation`` (macOS). | STRING |
| HIGH | gptme/tools/computer.py | 2519 | Record the screen for a fixed duration and return the output path. Synchronous wrapper around ``start_recording()`` | STRING |
| HIGH | gptme/tools/browser.py | 236 | Convert PDF pages to images using auto-detected CLI tools. Auto-detects and uses the first available tool: pdftoppm | STRING |
| HIGH | gptme/tools/browser.py | 1109 | Load a previously saved browser session (cookies, localStorage) from a file. In-session complement to ``save_browse | STRING |
| HIGH | gptme/tools/browser.py | 1220 | Press a keyboard key or shortcut in the current browser page. Dispatches the key event to the focused element (or d | STRING |
| HIGH | gptme/tools/computer_semantic.py | 125 | Compare pre/post screenshots and optionally apply a semantic expectation check. Pixel-change detection runs uncondi | STRING |
| HIGH | gptme/tools/screenshot.py | 63 | Validate that screenshot path is within allowed directory. Security: Prevents arbitrary file writes via path traver | STRING |
| HIGH | gptme/tools/base.py | 544 | Tool specification. Defines a tool that can be used by the agent. Args: name: The name of the tool. | STRING |
| HIGH | gptme/tools/autocompact/hook.py | 210 | Get a unique name for the compacted conversation fork. The original conversation stays untouched as the backup | STRING |
| HIGH | gptme/tools/subagent/batch.py | 394 | Wait for the first subagent to complete and return its result. Useful for speculative/hedging patterns: spawn N | STRING |
| HIGH | gptme/tools/subagent/api.py | 1351 | Inject a steering message into a running subagent's conversation. The message is queued via the subagent's logdir p | STRING |
| HIGH | gptme/tools/subagent/api.py | 1966 | Wait for the first of the given subagents to complete. Useful for speculative/hedging patterns: spawn N subagents a | STRING |
| HIGH | gptme/llm/__init__.py | 1378 | Get available models from a provider. Args: provider: The provider to get models from Returns: | STRING |
| HIGH | gptme/llm/utils.py | 93 | Convert Parameter objects to JSON Schema dictionary format. This utility converts a list of Parameter objects into | STRING |
| HIGH | gptme/oauth/openrouter.py | 146 | Run the OpenRouter PKCE OAuth flow and return a durable API key. Args: key_label: Label OpenRouter shows fo | STRING |
| HIGH | gptme/util/master_context.py | 167 | Recover truncated content from the master context. Args: logfile: Path to conversation.jsonl b | STRING |
| HIGH | gptme/util/git_worktree.py | 130 | Create a git worktree for isolated subagent execution. Args: repo_path: Path to the git repository root. | STRING |
| HIGH | gptme/util/content.py | 2 | Check if message content is a command (starts with / and first word has exactly one slash). Examples: | STRING |
| HIGH | gptme/util/keyword_matching.py | 20 | Convert a keyword (possibly with wildcards) to a compiled regex pattern. Wildcards: - '*' matches zero or more | STRING |
| HIGH | gptme/util/install.py | 40 | Get the install command for a package based on the current environment. Args: package: Package name (e | STRING |
| HIGH | gptme/util/tool_format.py | 214 | Format detailed tool information. Args: tool: The tool to format include_examples: Include example | STRING |
| HIGH | gptme/server/workspace_api.py | 160 | Safely resolve a path within a workspace. Args: workspace: Base workspace path path: Optional | STRING |
| HIGH | gptme/server/client.py | 53 | Create a new session for conversation via events endpoint. Args: conversation_id: The conversation | STRING |
| HIGH | gptme/server/client.py | 104 | Take a step in the conversation. Args: conversation_id: The conversation ID session_id: | STRING |
| HIGH | gptme/server/client.py | 140 | Stream events from conversation. Args: conversation_id: The conversation ID session_id: | STRING |
| HIGH | gptme/server/client.py | 174 | Interrupt the current generation or tool execution. Args: conversation_id: The conversation ID | STRING |
| HIGH | gptme/server/client.py | 206 | Confirm, edit, or skip a pending tool execution. Args: conversation_id: The conversation ID | STRING |
| HIGH | gptme/agent/workspace.py | 140 | Create an agent workspace by cloning a template repository. This is the recommended approach for creating agen | STRING |
| HIGH | gptme/mcp/client.py | 419 | Read a specific resource by URI. Args: uri: The URI of the resource to read. Returns: | STRING |
| HIGH | gptme/mcp/client.py | 499 | Get a specific prompt by name with optional arguments. Args: name: The name of the prompt to retrie | STRING |
| HIGH | gptme/logmanager/conversations.py | 559 | Delete a conversation by its ID. Args: conv_id: The conversation ID to delete Returns: Tr | STRING |
| HIGH | gptme/lessons/installer.py | 510 | Check if all skill dependencies are satisfied. Args: skill_names: Specific skills to check (None = check al | STRING |
| HIGH | gptme/lessons/parser.py | 110 | Convert a file glob pattern to likely keywords. Args: glob_pattern: File pattern like '**/*.py' or 'src/api | STRING |
| HIGH | gptme/eval/leaderboard.py | 1323 | Generate a leaderboard from eval results. Args: results_dir: Path to eval_results directory with timestampe | STRING |
| HIGH | gptme/eval/dspy/hybrid_optimizer.py | 382 | Select appropriate optimization strategy based on task characteristics. This function implements automated opt | STRING |
| HIGH | gptme/eval/dspy/experiments.py | 407 | Run a complete prompt optimization experiment. Args: experiment_name: Name for the experiment | STRING |
| HIGH | gptme/eval/dspy/experiments.py | 458 | Quick test of prompt variations without full optimization. Args: prompt_variations: Dictionary of prom | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 88 | - [🛡 Guardrails](#-guardrails) | CODE |
| MEDIUM | README.md | 372 | See [Running agents autonomously](https://gptme.org/docs/agents/autonomous.html) for scheduling, monitoring, and guardra | CODE |
| MEDIUM | tests/test_replay.py | 337 | # Model with a 100-token context window | COMMENT |
| MEDIUM | tests/conftest.py | 287 | # Download the embedding model before running tests. | COMMENT |
| MEDIUM⚡ | tests/test_cmd_service.py | 224 | # First scaffold a periodic agent (creates testagent.timer) | COMMENT |
| MEDIUM⚡ | tests/test_cmd_service.py | 967 | # launchd allows (apostrophe), then scaffold into it. | COMMENT |
| MEDIUM | tests/test_cmd_service.py | 659 | # to ensure the actual warning path was exercised (not just the scaffold line). | COMMENT |
| MEDIUM | tests/test_util_cli.py | 388 | # Indexing is isolated; retrieval ranking is not — the global RAG store | COMMENT |
| MEDIUM⚡ | tests/test_tools_rag.py | 58 | # Should yield nothing when RAG is not available | COMMENT |
| MEDIUM | tests/test_tools_rag.py | 33 | # Mock the config to enable RAG | COMMENT |
| MEDIUM | tests/test_tools_rag.py | 76 | # Should yield nothing when RAG is disabled | COMMENT |
| MEDIUM⚡ | tests/test_tools_token_awareness.py | 80 | # GPT-4 has a context window of 8192 or 128000 depending on version | COMMENT |
| MEDIUM⚡ | tests/test_init.py | 56 | # init() — orchestration tests | COMMENT |
| MEDIUM | docs/howto/automate-task.md | 60 | ## Set up a project scaffold | COMMENT |
| MEDIUM⚡ | scripts/eval_phase0_pruning.py | 276 | # default. Prefer the recorded model so the tokenizer and context window | COMMENT |
| MEDIUM | gptme/constants.py | 146 | # This prevents unbounded memory usage and context window overflow | COMMENT |
| MEDIUM | gptme/tools/rag.py | 21 | workspace_only = true # Whether to only search in the workspace directory, or the whole RAG index | STRING |
| MEDIUM | gptme/tools/rag.py | 22 | paths = [] # List of paths to include in the RAG index. Has no effect if workspace_only is true. | STRING |
| MEDIUM | gptme/tools/rag.py | 82 | ### When to use RAG | COMMENT |
| MEDIUM | gptme/tools/watch.py | 790 | # Shell keywords that are loop/condition scaffolding, not the polled check. | COMMENT |
| MEDIUM | gptme/tools/watch.py | 1208 | # before any prompt; below guardrails (200). | COMMENT |
| MEDIUM | gptme/tools/autocompact/resume.py | 1056 | # they always use the same tokenizer and context window. | COMMENT |
| MEDIUM | gptme/tools/subagent/hooks.py | 106 | # immediately, without waiting for the agentic turn to finish naturally. | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 383 | # GPT-5.3 Codex — top-tier agentic coding model | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 413 | # GPT-5.2 Codex — agentic coding variant of 5.2 | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 435 | # GPT-5.1 Codex — agentic coding variant of 5.1 | COMMENT |
| MEDIUM | gptme/llm/models/recommended.py | 18 | # Recommended model per provider: the model we would pick for agentic work | COMMENT |
| MEDIUM | gptme/context/config.py | 66 | # - float 0 < x ≤ 1: fraction of the model context window (e.g. 0.85) | COMMENT |
| MEDIUM | gptme/context/scout.py | 53 | # main model's context window. Per-file truncation uses CONTENT_SIZE_WARN_THRESHOLD. | COMMENT |
| MEDIUM | gptme/util/ask_execute.py | 131 | # execution request: route it through the hook chain again so guardrails | COMMENT |
| MEDIUM | gptme/agent/cli.py | 287 | gptme service init # Lightweight alternative: minimal service scaffold | STRING |
| MEDIUM | gptme/mcp/server.py | 177 | # TOOL_CONFIRM hooks (guardrails) still dispatch instead of auto-confirming. | COMMENT |
| MEDIUM | gptme/mcp/server.py | 189 | # auto-confirm without running TOOL_CONFIRM (guardrails). | COMMENT |
| MEDIUM | gptme/cli/util.py | 516 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 541 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 581 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/cmd_knowledge.py | 316 | # Build an ID-indexed map from the FULL JSONL store: RAG may rank | COMMENT |
| MEDIUM | gptme/cli/cmd_knowledge.py | 359 | # RAG succeeded but returned no live entries: the index may be empty, | COMMENT |
| MEDIUM | gptme/cli/cmd_knowledge.py | 361 | # no longer map to JSONL entries. A successful-but-empty RAG result is | COMMENT |
| MEDIUM | gptme/cli/cmd_knowledge.py | 494 | # deleted entry. Don't block the CLI on the RAG index operation. | COMMENT |
| MEDIUM | gptme/cli/setup.py | 464 | # Uncomment to enable RAG (Retrieval-Augmented Generation) | COMMENT |
| MEDIUM | gptme/cli/cmd_init.py | 9 | gptme init my-project # Create my-project/ with scaffold | STRING |
| MEDIUM⚡ | gptme/cli/doctor.py | 227 | # A placeholder key (e.g. "test", "dummy-key") is scaffolding, not | COMMENT |
| MEDIUM | gptme/cli/doctor.py | 51 | # Placeholder API keys that are commonly left in config as scaffolding. A | COMMENT |
| MEDIUM | gptme/logmanager/manager.py | 1142 | # Expired — drop from context window (not from the log on disk). | COMMENT |
| MEDIUM | gptme/logmanager/manager.py | 1450 | # Enrich with enabled context enhancements (RAG, fresh context) | COMMENT |
| MEDIUM | gptme/hooks/anomaly_watchdog.py | 653 | priority=150, # after guardrails (200), before confirm hooks | CODE |
| MEDIUM | gptme/hooks/anomaly_watchdog.py | 665 | priority=150, # after guardrails (200), before cli/server confirm | CODE |
| MEDIUM | gptme/prompts/__init__.py | 551 | # Sub-module imports for orchestration | COMMENT |
| MEDIUM | gptme/commands/llm.py | 369 | # Show context window utilization if model info is available | COMMENT |
| MEDIUM | gptme/eval/agents/swebench.py | 83 | # implementation. This is the orchestration skeleton from bjsi's | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | .pre-commit-config.yaml | 41 | - id: check-poetry-lock-sync | COMMENT |
| LOW | pyproject.toml | 461 | "xdist_group: marks tests that should run in the same xdist group", | COMMENT |
| LOW | docker-compose.yml | 1 | # Two services are available: | COMMENT |
| LOW | docker-compose.yml | 41 | restart: unless-stopped | COMMENT |
| LOW | gptme.toml | 1 | prompt = "This is gptme" | COMMENT |
| LOW | gptme.toml | 21 | #paths = [ | COMMENT |
| LOW | gptme.toml | 41 | #command = "npx" | COMMENT |
| LOW | tauri/src-tauri/src/lan_access.rs | 1 | //! LAN access: lets a phone/tablet on the same WiFi open gptme. | COMMENT |
| LOW | tauri/src-tauri/src/lan_access.rs | 121 | Ok, | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 241 | // Connect/read failed, response wasn't HTTP, or the probe timed out: | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 381 | // A debug build normally loads the Vite dev server, but E2E and other | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 861 | .expect("error while building tauri application") | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 921 | // Kill child processes first (e.g. uvicorn workers spawned by gptme-server, | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 961 | COMMENT | |
| LOW | tauri/e2e/test/specs/first_run.test.js | 181 | try { | COMMENT |
| LOW | tauri/e2e/test/specs/first_run.test.js | 241 | // | COMMENT |
| LOW | tests/conftest.py | 561 | # Make a copy to iterate over to avoid "dictionary changed size during iteration" | COMMENT |
| LOW | tests/thread_leak.py | 41 | DICT_RACE_MESSAGE = "dictionary changed size during iteration" | COMMENT |
| LOW | tests/test_subagent_unit.py | 4141 | # Prevent the thread from blocking on the global slot semaphore. | COMMENT |
| LOW | tests/test_subagent_unit.py | 7261 | """ | COMMENT |
| LOW | tests/test_logmanager.py | 901 | COMMENT | |
| LOW | tests/test_tui_e2e.py | 641 | def test_inline_prints_to_scrollback(self, tmux_tui, tmp_path): | COMMENT |
| LOW | tests/data/gh-issue-list.txt | 1 | #301 fix: broken import in tools/shell.py open 2025-01-15 | COMMENT |
| LOW | tests/data/gh-issue-list.txt | 21 | #321 fix: edge case with piped commands detection open 2025-01-28 | COMMENT |
| LOW | docs/conf.py | 201 | # Prefix each section label with the name of the document it is in, followed by a colon. | COMMENT |
| LOW | scripts/check_model_freshness.py | 41 | "llm/models/resolution.py", | COMMENT |
| LOW | scripts/bump_version.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/publish_release.sh | 1 | #!/bin/bash | COMMENT |
| LOW | scripts/install.sh | 1 | #!/usr/bin/env sh | COMMENT |
| LOW | .github/workflows/release.yml | 1 | name: Release | COMMENT |
| LOW | .github/workflows/release.yml | 261 | COMMENT | |
| LOW | .github/workflows/webui-visual-diff.yml | 161 | if: steps.diff.outputs.changed > 0 | COMMENT |
| LOW | webui/.pre-commit-config.yaml | 41 | # types_or: [javascript, jsx, ts, tsx] | COMMENT |
| LOW | webui/eslint.config.js | 61 | // { | COMMENT |
| LOW | webui/wrangler.toml | 1 | # Cloudflare Pages configuration | COMMENT |
| LOW | webui/e2e/generation.spec.ts | 1 | import { test, expect, type Page } from '@playwright/test'; | COMMENT |
| LOW | webui/e2e/generation.spec.ts | 21 | // chatConfig arrived. Fix: skeleton pill while loading (PR #3441). | COMMENT |
| LOW | webui/e2e/generation.spec.ts | 41 | // 1. UI: chat-input is enabled (server is reachable and a conversation can | COMMENT |
| LOW | webui/e2e/generation.spec.ts | 81 | // Wait for ConversationContent to actually mount. MainLayout returns null when | COMMENT |
| LOW | webui/e2e/performance.spec.ts | 1 | import { test, expect } from '@playwright/test'; | COMMENT |
| LOW | webui/e2e/ui-stability.spec.ts | 1 | import { test, expect } from '@playwright/test'; | COMMENT |
| LOW | webui/e2e/conversation.spec.ts | 141 | COMMENT | |
| LOW | webui/src/stores/conversations.ts | 61 | completedAt: number; | COMMENT |
| LOW | webui/src/stores/conversations.ts | 81 | // flash a skeleton right after send. chatConfig takes precedence once loaded. | COMMENT |
| LOW | webui/src/utils/notifications.ts | 61 | // Tauri deserializes the command arguments from an `options` field (the | COMMENT |
| LOW | webui/src/utils/workspaceApi.ts | 81 | // | COMMENT |
| LOW | webui/src/utils/conversation.ts | 1 | // This file can be removed or repurposed for other conversation utilities | COMMENT |
| LOW | webui/src/utils/tauri.ts | 1 | // Detect if we're running in Tauri environment. | COMMENT |
| LOW | webui/src/components/ConversationContent.tsx | 401 | }); | COMMENT |
| LOW | webui/src/components/SetupWizard.tsx | 741 | cloudLoginStartBaseUrlRef.current = connectionConfig.baseUrl; | COMMENT |
| LOW | webui/src/components/SandboxedIframePanel.tsx | 61 | // can address it. `resolveSandbox` drops `allow-same-origin` whenever | COMMENT |
| LOW | webui/src/components/ChatInput.tsx | 641 | // Get conversation config to read the actual model. | COMMENT |
| LOW | …/src/components/__tests__/ConversationContent.test.tsx | 961 | jest.useRealTimers(); | COMMENT |
| LOW | webui/src/hooks/useConversation.ts | 201 | } | COMMENT |
| LOW | webui/src/hooks/useConversation.ts | 621 | setConnected(conversationId, false); | COMMENT |
| LOW | gptme/constants.py | 141 | # The message's max_steps_stop metadata, not this display text, makes the loop | COMMENT |
| LOW | gptme/message.py | 201 | # unprefixed, e.g. "gpt-5.6-sol", "claude-sonnet-4-6-20250929", | COMMENT |
| LOW | gptme/message.py | 221 | # The value is the active view (empty for master), so a persisted request is | COMMENT |
| LOW | gptme/sandbox.py | 241 | # which case verify_memory_limit will have caught the unsatisfiable config | COMMENT |
| LOW | gptme/codeblock.py | 481 | # Track nesting depth to handle nested code blocks | COMMENT |
| 60 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_v2.py | 1713 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1720 | # Step 2: fetch that specific session by its ID (webui detail fetch) | COMMENT |
| LOW⚡ | tests/test_build_changelog.py | 116 | # Step 1: commit the bump and tag it (pre-amend state) | COMMENT |
| LOW⚡ | tests/test_build_changelog.py | 120 | # Step 2: generate the changelog (this is what the release flow does before amending) | COMMENT |
| LOW | tests/test_build_changelog.py | 133 | # Step 3: amend (embed release notes into the bump commit) + force-move the tag | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 267 | # Step 1: record state before attempt | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 276 | # Step 2: mutate workspace (simulate a failed attempt) | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 280 | # Step 3: restore to before-attempt | COMMENT |
| LOW | tests/test_server_v2_hooks.py | 275 | # We need to check if there's an endpoint for this or if it happens automatically | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 233 | # Step 1: open the form page | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 237 | # Step 2: fill message and author fields | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 241 | # Step 3: click the submit button (waits for page load internally) | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 244 | # Step 4: read the result page | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 604 | # Step 1: open a page and save the session | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 609 | # Step 2: reload the state in the same session | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 616 | # Step 3: open the same page again — should work with restored state | COMMENT |
| LOW⚡ | tests/test_chat.py | 537 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 542 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 548 | # Step 3: msgs2dicts preserves files for provider processing | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 117 | # Step 1: load the game | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 120 | # Step 2: verify initial state | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 129 | # Step 3: fire at the enemy — auto-aims so one Space wins | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 132 | # Step 4: verify the milestone marker | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 202 | # Step 1: load the game | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 205 | # Step 2: verify initial state | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 211 | # Step 3: click three ore nodes to gather 6 iron ore | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 216 | # Step 4: wait for the craft button to become enabled (needs >= 5 ore) | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 219 | # Step 5: craft an iron plate | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 222 | # Step 6: verify the milestone marker | COMMENT |
| LOW | gptme/llm/llm_gptme.py | 283 | # Step 1: Request device authorization | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 301 | # Step 2: Display code to user | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 305 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/auth.py | 81 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 112 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 128 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/onboard.py | 298 | # Step 1: Detect providers | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 331 | # Step 2: Select provider | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 341 | # Step 3: Test connectivity | COMMENT |
| LOW | gptme/cli/onboard.py | 355 | # Step 4: Create config | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 204 | # Step 1: Heuristic detection | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 210 | # Step 2: LLM parsing | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 216 | # Step 3: Create and yield form message | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_v2.py | 1713 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1720 | # Step 2: fetch that specific session by its ID (webui detail fetch) | COMMENT |
| LOW⚡ | tests/test_build_changelog.py | 116 | # Step 1: commit the bump and tag it (pre-amend state) | COMMENT |
| LOW⚡ | tests/test_build_changelog.py | 120 | # Step 2: generate the changelog (this is what the release flow does before amending) | COMMENT |
| LOW | tests/test_build_changelog.py | 133 | # Step 3: amend (embed release notes into the bump commit) + force-move the tag | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 267 | # Step 1: record state before attempt | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 276 | # Step 2: mutate workspace (simulate a failed attempt) | COMMENT |
| LOW⚡ | tests/test_snapshot_command.py | 280 | # Step 3: restore to before-attempt | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 233 | # Step 1: open the form page | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 237 | # Step 2: fill message and author fields | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 241 | # Step 3: click the submit button (waits for page load internally) | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 244 | # Step 4: read the result page | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 604 | # Step 1: open a page and save the session | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 609 | # Step 2: reload the state in the same session | COMMENT |
| LOW⚡ | tests/test_computer_use_integration.py | 616 | # Step 3: open the same page again — should work with restored state | COMMENT |
| LOW⚡ | tests/test_chat.py | 537 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 542 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 548 | # Step 3: msgs2dicts preserves files for provider processing | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 117 | # Step 1: load the game | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 120 | # Step 2: verify initial state | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 129 | # Step 3: fire at the enemy — auto-aims so one Space wins | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 132 | # Step 4: verify the milestone marker | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 202 | # Step 1: load the game | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 205 | # Step 2: verify initial state | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 211 | # Step 3: click three ore nodes to gather 6 iron ore | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 216 | # Step 4: wait for the craft button to become enabled (needs >= 5 ore) | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 219 | # Step 5: craft an iron plate | COMMENT |
| LOW⚡ | tests/test_computer_milestone_integration.py | 222 | # Step 6: verify the milestone marker | COMMENT |
| LOW | gptme/llm/llm_gptme.py | 283 | # Step 1: Request device authorization | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 301 | # Step 2: Display code to user | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 305 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/auth.py | 81 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 112 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 128 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/onboard.py | 298 | # Step 1: Detect providers | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 331 | # Step 2: Select provider | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 341 | # Step 3: Test connectivity | COMMENT |
| LOW | gptme/cli/onboard.py | 355 | # Step 4: Create config | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 204 | # Step 1: Heuristic detection | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 210 | # Step 2: LLM parsing | COMMENT |
| LOW⚡ | gptme/hooks/form_autodetect.py | 216 | # Step 3: Create and yield form message | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 120 | swebench = {version = ">=1.0", optional=true} # for SWE-bench eval harness | CODE |
| MEDIUM | pyproject.toml | 121 | terminal-bench = {version = ">=0.1", optional=true, python = ">=3.12"} # for Terminal-Bench eval harness | CODE |
| MEDIUM | tauri/src-tauri/src/lan_access.rs | 72 | // robust if the token format ever changes. | COMMENT |
| MEDIUM | tests/test_cc_memory.py | 255 | This is the core feature of #3625: memories written by any harness to | STRING |
| MEDIUM⚡ | tests/test_mcp_discovery.py | 158 | # We'll use a try-except to make the test more robust | COMMENT |
| MEDIUM | tests/test_memory_store.py | 1177 | # Reader harness: own root first, Codex write root still layered in | COMMENT |
| LOW⚡ | tests/test_reduce.py | 150 | # Should not raise ValueError, just return messages as-is with content preserved | COMMENT |
| MEDIUM⚡ | tests/test_relevance_pruning.py | 729 | # shadow_prune_stale_tool_outputs — dry-run / evaluation harness | COMMENT |
| MEDIUM | gptme/anti_slop.py | 309 | # a single soft (weight-1) tell like "robust" in a 10-word text scores | COMMENT |
| MEDIUM | gptme/anti_slop.py | 323 | # tells — repeating one soft tell ("robust robust robust") adds weight | COMMENT |
| MEDIUM | gptme/tools/shell.py | 3587 | # only when they refer to this conversation's harness-owned jobs. Otherwise | COMMENT |
| MEDIUM | gptme/tools/subagent/__init__.py | 143 | ### ACP Mode (multi-harness support) | COMMENT |
| MEDIUM | gptme/tools/subagent/api.py | 670 | # ACP mode: multi-harness support via Agent Client Protocol | COMMENT |
| MEDIUM | gptme/llm/__init__.py | 1092 | # TODO: make this more robust/general, maybe with a callback that runs on each char/chunk | COMMENT |
| LOW | gptme/util/reduce.py | 124 | # but if prev_len == tokens, we are not making progress, so just return the log as-is | COMMENT |
| MEDIUM | gptme/util/install.py | 18 | # Check for uvx (comprehensive cross-platform detection to avoid false positives) | COMMENT |
| MEDIUM | gptme/plugins/__init__.py | 485 | # Check for uvx (comprehensive cross-platform detection to avoid false positives) | COMMENT |
| LOW | gptme/server/openapi_docs.py | 844 | # For now, just use the first non-None type as 200 response | COMMENT |
| MEDIUM⚡ | gptme/server/tasks_api.py | 288 | """Get comprehensive task information with derived data.""" | STRING |
| MEDIUM | gptme/hooks/anomaly_watchdog.py | 71 | # copies a harness makes. | COMMENT |
| MEDIUM | gptme/prompts/workspace.py | 422 | # This makes memories written by any harness (gptme, Claude Code, Codex) visible | COMMENT |
| MEDIUM | gptme/prompts/workspace.py | 423 | # in gptme sessions — the cross-harness read path for #3625. | COMMENT |
| MEDIUM | gptme/eval/dspy/tasks.py | 415 | """Create advanced multi-step tasks for comprehensive evaluation.""" | STRING |
| MEDIUM | gptme/eval/dspy/experiments.py | 29 | """Generate a comprehensive optimization report.""" | STRING |
| MEDIUM | gptme/eval/swe_extra/swe_bench_test_spec.py | 1 | # edited from the original swebench/harness/test_spec.py | COMMENT |
| MEDIUM | gptme/eval/swebench/evaluate.py | 246 | # NOTE: This is NOT authoritative — use the official SWE-bench harness for | COMMENT |
| MEDIUM | gptme/eval/swebench/main.py | 208 | # Run the official harness for the first model's predictions | COMMENT |
| MEDIUM | gptme/eval/swebench/main.py | 209 | # (multi-model harness runs can be done by calling this multiple times) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_path_traversal.py | 291 | fake_key = tmp_path / "id_rsa" | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 292 | fake_key.write_text("PRIVATE KEY") | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 295 | mock_config.user.avatar = str(fake_key) | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 343 | fake_key = agent_dir / "id_rsa" | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 344 | fake_key.write_text("PRIVATE KEY") | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 393 | fake_key = agent_dir / "id_rsa" | CODE |
| LOW⚡ | tests/test_server_path_traversal.py | 394 | fake_key.write_text("PRIVATE KEY") | CODE |
| LOW | tests/test_agent.py | 687 | monkeypatch.setenv("GIT_AUTHOR_EMAIL", "test@test.com") | CODE |
| LOW | tests/test_agent.py | 689 | monkeypatch.setenv("GIT_COMMITTER_EMAIL", "test@test.com") | CODE |
| LOW | tests/test_prompts.py | 344 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_prompts.py | 620 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW⚡ | tests/test_doctor.py | 1088 | mock_config_obj.get_env.return_value = "dummy-key" | CODE |
| LOW⚡ | tests/test_doctor.py | 1096 | assert "placeholder" in result.message.lower() | CODE |
| LOW⚡ | tests/test_doctor.py | 1535 | config = Config(user=UserConfig(env={"ACME_CUSTOM_KEY": "dummy-key"})) | CODE |
| LOW⚡ | tests/test_doctor.py | 1080 | """Placeholder keys (e.g. "test", "dummy-key") are not-configured, not ERROR. | STRING |
| LOW | tests/test_subagent_worktree_isolation.py | 57 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_agent_doctor.py | 62 | "GIT_AUTHOR_EMAIL": "test@test.com", | CODE |
| LOW | tests/test_agent_doctor.py | 64 | "GIT_COMMITTER_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_lessons_commands.py | 160 | assert "placeholder" in result.lower() | CODE |
| LOW | tests/test_lessons_commands.py | 57 | keywords=["patch", "placeholder", "error"], | CODE |
| LOW⚡ | tests/test_util_cli.py | 1342 | "GIT_AUTHOR_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1344 | "GIT_COMMITTER_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1350 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_git_worktree.py | 23 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_config_encoding.py | 99 | config_file.write_text('[user]\nabout = "placeholder"\n', encoding="utf-8") | CODE |
| LOW | tests/test_auto_compact.py | 3560 | big_checkpoint = "## Objective\n" + ("lorem ipsum dolor sit amet " * 400) | CODE |
| LOW | tests/test_auto_compact.py | 3560 | big_checkpoint = "## Objective\n" + ("lorem ipsum dolor sit amet " * 400) | CODE |
| LOW | tests/test_auto_compact.py | 3766 | big_checkpoint = "## Objective\n" + ("lorem ipsum dolor sit amet " * 400) | CODE |
| LOW | tests/test_auto_compact.py | 3766 | big_checkpoint = "## Objective\n" + ("lorem ipsum dolor sit amet " * 400) | CODE |
| LOW⚡ | tests/test_util_keyword_matching.py | 251 | text = "Lorem ipsum " * 100 + "specific keyword here" + " dolor sit" * 100 | CODE |
| LOW | tests/test_util_review.py | 2517 | run(["git", "config", "user.email", "test@test.com"]) | CODE |
| LOW | .github/workflows/docs.yml | 62 | echo -e '[prompt]\nabout_user = "testing"\nresponse_preference = "just testing"\n\n[env]\nOPENAI_API_KEY="sk-d | CODE |
| LOW | webui/src/democonversations.ts | 158 | content: `Stress message ${i + 1}: ${'Lorem ipsum dolor sit amet. '.repeat(3)}`, | CODE |
| LOW | webui/src/democonversations.ts | 158 | content: `Stress message ${i + 1}: ${'Lorem ipsum dolor sit amet. '.repeat(3)}`, | CODE |
| LOW | webui/src/components/__tests__/CommandPalette.test.tsx | 678 | expect(input).toHaveAttribute('placeholder', expect.stringContaining('command')); | CODE |
| LOW | gptme/tools/_browser_playwright.py | 1112 | fill_element("[name='email']", "user@example.com") | STRING |
| LOW | gptme/tools/computer.py | 2073 | computer("type", text="user@example.com") | CODE |
| LOW | gptme/tools/computer.py | 2077 | computer("type", text="user@example.com") | CODE |
| LOW | gptme/tools/browser.py | 1343 | fill_element("[name='email']", "user@example.com") | STRING |
| LOW⚡ | gptme/cli/doctor.py | 227 | # A placeholder key (e.g. "test", "dummy-key") is scaffolding, not | COMMENT |
| LOW⚡ | gptme/cli/doctor.py | 62 | "dummy-key", | CODE |
| LOW⚡ | gptme/cli/doctor.py | 63 | "placeholder", | CODE |
| LOW | gptme/cli/doctor.py | 82 | Placeholder keys (e.g. "test", "dummy-key") are scaffolding left in config, | STRING |
| LOW | gptme/eval/suites/practical7.py | 215 | "phone": "555-1234", | CODE |
| LOW | gptme/eval/suites/practical7.py | 217 | "street": "123 Main St", | CODE |
| LOW | gptme/eval/suites/practical7.py | 230 | "street": "123 Main St", | CODE |
| LOW | gptme/eval/suites/behavioral/noisy_worktree_fix.py | 106 | assert validate_email("user@example.com") is True | CODE |
| LOW⚡ | gptme/eval/suites/behavioral/add_docstrings.py | 174 | assert validate_email("user@example.com") == "user@example.com" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_mcp_server.py | 36 | CODE | |
| MEDIUM | tests/test_llm_utils.py | 757 | CODE | |
| MEDIUM | tests/test_llm_retry_policy.py | 173 | CODE | |
| MEDIUM | tests/test_tools_request_tool_change.py | 462 | CODE | |
| MEDIUM | tests/test_tools_request_tool_change.py | 501 | CODE | |
| MEDIUM | tests/test_hooks.py | 92 | CODE | |
| MEDIUM | tests/test_hooks.py | 97 | CODE | |
| MEDIUM | tests/test_hooks.py | 102 | CODE | |
| MEDIUM | tests/test_llm_openai_subscription.py | 377 | CODE | |
| MEDIUM | tests/test_commands.py | 456 | CODE | |
| MEDIUM | tests/test_commands.py | 471 | CODE | |
| MEDIUM | tests/test_hooks_cwd_changed.py | 87 | CODE | |
| MEDIUM | tests/test_hooks_cwd_changed.py | 137 | CODE | |
| MEDIUM | gptme/hooks/aw_watcher_agent.py | 158 | CODE | |
| MEDIUM | gptme/hooks/aw_watcher_agent.py | 175 | CODE | |
| MEDIUM | gptme/hooks/aw_watcher_agent.py | 195 | CODE | |
| MEDIUM | gptme/hooks/aw_watcher_agent.py | 235 | CODE | |
| MEDIUM | gptme/hooks/cwd_changed.py | 42 | CODE | |
| MEDIUM | gptme/hooks/auto_snapshots.py | 253 | CODE | |
| MEDIUM | gptme/hooks/auto_snapshots.py | 284 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_util_cli_models.py | 191 | CODE | |
| LOW | tests/test_agent.py | 29 | CODE | |
| LOW | tests/test_chats_stats.py | 52 | CODE | |
| LOW | tests/test_util_cli.py | 1146 | CODE | |
| LOW | tests/test_util_tool_format.py | 28 | CODE | |
| LOW | tests/test_json_output.py | 137 | CODE | |
| LOW | tests/test_json_output.py | 653 | CODE | |
| LOW | tests/test_json_output.py | 767 | CODE | |
| LOW | gptme/chat.py | 212 | CODE | |
| LOW | gptme/chat.py | 1011 | CODE | |
| LOW | gptme/tools/shell.py | 3673 | CODE | |
| LOW | gptme/tools/chats.py | 666 | CODE | |
| LOW | gptme/tools/base.py | 596 | CODE | |
| LOW | gptme/tools/subagent/execution.py | 349 | CODE | |
| LOW | gptme/tools/subagent/execution.py | 1392 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 493 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 602 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 1098 | CODE | |
| LOW | gptme/tools/subagent/api.py | 163 | CODE | |
| LOW | gptme/llm/__init__.py | 395 | CODE | |
| LOW | gptme/llm/__init__.py | 850 | CODE | |
| LOW | gptme/llm/models/listing.py | 319 | CODE | |
| LOW | gptme/util/reduce.py | 457 | CODE | |
| LOW | gptme/config/cli_setup.py | 108 | CODE | |
| LOW | gptme/server/session_step.py | 1746 | CODE | |
| LOW | gptme/cli/cmd_init.py | 193 | CODE | |
| LOW | gptme/prompts/__init__.py | 457 | CODE | |
| LOW | gptme/prompts/__init__.py | 578 | CODE | |
| LOW | gptme/eval/main.py | 543 | CODE | |
| LOW | gptme/eval/dspy/prompt_optimizer.py | 226 | CODE | |
| LOW | gptme/eval/dspy/prompt_optimizer.py | 278 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test_eval_behavioral.py | 0 | \ def summarize(text): \"\"\"return a dict with word and line counts for the given text.\"\"\" if not text: return {"wor | STRING |
| HIGH | …vioral/minimal_feature_preserve_default_with_decoys.py | 0 | \ def summarize(text): \"\"\"return a dict with word and line counts for the given text.\"\"\" if not text: return {"wor | STRING |
| HIGH | …eval/suites/behavioral/add_feature_preserve_default.py | 0 | \ def summarize(text): \"\"\"return a dict with word and line counts for the given text.\"\"\" if not text: return {"wor | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_active_context.py | 20 | (tmp_path / "utils.py").write_text("def helper(): pass\n") | CODE |
| LOW | tests/test_active_context.py | 138 | assert "def helper(): pass" in content | CODE |
| LOW⚡ | tests/test_eval_behavioral.py | 231 | def helper(): | CODE |
| LOW⚡ | tests/test_eval_behavioral.py | 1665 | def helper(): | CODE |
| LOW⚡ | tests/test_context.py | 591 | (subdir / "utils.py").write_text("def helper(): pass") | CODE |
| LOW⚡ | tests/test_context.py | 880 | (subdir / "utils.py").write_text("def helper(): pass") | CODE |
| LOW⚡ | tests/test_tools_base.py | 277 | def helper(name: str) -> bool: | CODE |
| LOW⚡ | tests/test_tools_base.py | 288 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_base.py | 456 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_base.py | 502 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_shell.py | 562 | def test_function(shell): | CODE |
| LOW | gptme/cli/cmd_computer.py | 742 | def run_task(task: str, timeout: int, model: str | None, as_json: bool): | CODE |
| LOW | gptme/hooks/tests/test_active_context.py | 28 | (ws / "utils.py").write_text("def helper():\n return 42\n") | CODE |
| LOW | gptme/eval/dspy/tasks.py | 584 | "slow_processor.py": """def process_data(data): | STRING |
| LOW | gptme/eval/dspy/tasks.py | 708 | def process_data(size): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/github_ci_self_heal.py | 262 | f"*🤖 Auto-generated by gptme-bot self-heal ({model})*\n" | CODE |
| HIGH | gptme/cli/onboard.py | 261 | # Generated by gptme onboard | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | gptme/cli/util.py | 1902 | click.echo(f"Set it with: export {env_var}=your-api-key") | CODE |
| HIGH⚡ | gptme/cli/doctor.py | 65 | "your-api-key", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.yml | 56 | # Usage: | COMMENT |
| LOW | tauri/scripts/build-appimage.sh | 4 | # Usage: | COMMENT |
| LOW | scripts/bump_version.sh | 4 | # Usage: | COMMENT |
| LOW | scripts/gh-pr-view-with-pr-comments.sh | 9 | # Example usage: | COMMENT |
| LOW | scripts/publish_release.sh | 11 | # Usage: | COMMENT |
| LOW | scripts/install.sh | 4 | # Usage: | COMMENT |
| LOW | gptme/lessons/installer.py | 675 | # Example usage | COMMENT |
| LOW | gptme/eval/dspy/experiments.py | 498 | # Example usage | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | gptme/eval/suites/behavioral/implement_lru_cache.py | 144 | # TODO: implement LRU caching | COMMENT |
| LOW | gptme/eval/suites/behavioral/implement_memoization.py | 91 | # TODO: implement memoization | COMMENT |
| LOW⚡ | …tme/eval/suites/behavioral/implement_priority_queue.py | 97 | # TODO: implement priority queue | COMMENT |
| LOW⚡ | …tme/eval/suites/behavioral/implement_priority_queue.py | 101 | # TODO: implement | COMMENT |
| LOW⚡ | …tme/eval/suites/behavioral/implement_priority_queue.py | 111 | # TODO: implement | COMMENT |
| LOW⚡ | …tme/eval/suites/behavioral/implement_priority_queue.py | 120 | # TODO: implement | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/test_llm_anthropic.py | 1170 | timeout = mock_client.messages.create.call_args.kwargs.get("timeout") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM⚡ | tests/test_anti_slop.py | 31 | "Certainly! It's worth noting that we delve into a rich tapestry of ideas " | CODE |
| MEDIUM⚡ | tests/test_anti_slop.py | 51 | "It's worth noting that we delve into a rich tapestry of ideas." | CODE |
| MEDIUM | tests/test_server_v2_tool_confirmation.py | 45 | "Done, let me know if you need anything else.", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | webui/src/utils/__tests__/highlightUtils.test.ts | 37 | '// ... existing code ...\ndef updated_fn():\n return True\n// ... existing code ...'; | CODE |