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 presents the forensic synthetic code analysis of gptme/gptme, a Python project with 4,401 GitHub stars. SynthScan v2.0 examined 467,836 lines of code across 1389 source files, recording 13056 pattern matches distributed across 26 syntactic categories. The overall adjusted score of 35.7 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 13056 distinct pattern matches across 26 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. 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 diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| 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 | 21 | def test_cmd_model_appends_replacement_prompt_and_persists_generation(tmp_path: Path): | CODE |
| LOW | tests/test_commands_llm.py | 51 | def test_cmd_tools_load_appends_replacement_prompt(tmp_path: Path): | CODE |
| LOW | tests/test_commands_llm.py | 76 | def test_cmd_context_reports_context_savings(tmp_path: Path): | 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_dspy_basic.py | 138 | def test_tool_metric_empty_messages(): | CODE |
| LOW | tests/test_dspy_basic.py | 154 | def test_prompt_optimizer_init(mock_dspy): | CODE |
| 8653 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| 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_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 | 366 | # ============================================================================ | COMMENT |
| MEDIUM | tests/test_mcp_adapter.py | 368 | # ============================================================================ | 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 |
| MEDIUM | tests/test_eval_behavioral_solutions.py | 1379 | # ── Parametrized solution verification ─────────────────────────────────────── | STRING |
| MEDIUM | tests/test_eval_behavioral_solutions.py | 1451 | # ── Smoke tests for individual scenarios ───────────────────────────────────── | STRING |
| MEDIUM | tests/test_computer_x11_integration.py | 33 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_x11_integration.py | 35 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_x11_integration.py | 63 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_x11_integration.py | 65 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_x11_integration.py | 199 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_x11_integration.py | 201 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_computer_x11_integration.py | 219 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_computer_x11_integration.py | 221 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_backtrack.py | 17 | # ── helpers ────────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | tests/test_backtrack.py | 50 | # ── ConvCheckpoint primitives ───────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_backtrack.py | 100 | # ── /backtrack command ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | tests/test_k_best.py | 108 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_k_best.py | 110 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_k_best.py | 228 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_k_best.py | 230 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_k_best.py | 12 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_k_best.py | 14 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_k_best.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_k_best.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_k_best.py | 183 | # --------------------------------------------------------------------------- | COMMENT |
| 1366 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_codeblock.py | 160 | pwd && ls -la | CODE |
| HIGH⚡ | tests/test_codeblock.py | 166 | 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_tools_shell_background.py | 553 | job = start_background_job("echo out && echo err >&2") | CODE |
| HIGH | tests/test_tools_shell_background.py | 186 | job = start_background_job("echo hello && echo world") | CODE |
| HIGH | tests/test_tools_shell_background.py | 202 | job = start_background_job("sleep 0.1 && echo done") | 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_execenv.py | 410 | env.run("cat input.txt > output.txt && echo ' modified' >> output.txt") | 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 | 205 | assert _find_first_unquoted_pipe("cmd1 || cmd2") is None | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 208 | result = _find_first_unquoted_pipe("cmd1 || cmd2 | cmd3") | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 211 | cmd = "cmd1 || cmd2 | cmd3" | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 1215 | 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_reduce.py | 859 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| HIGH | tests/test_reduce.py | 925 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| HIGH | tests/test_reduce.py | 987 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| HIGH⚡ | tests/test_util_review.py | 1429 | self._review_jsonl('```json\n{"findings": null}\n```') | CODE |
| HIGH⚡ | tests/test_util_review.py | 1424 | """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 | 1275 | # stdin is a pipe (not /dev/null, not terminal) | COMMENT |
| HIGH | tests/test_tools_shell.py | 1325 | # stdin is a pipe (not /dev/null, not terminal) | COMMENT |
| HIGH | tests/test_tools_shell.py | 1638 | job = start_background_job("sleep 0.1 && echo 'done'") | CODE |
| HIGH | tests/test_tools_shell.py | 1641 | assert job.command == "sleep 0.1 && echo 'done'" | CODE |
| HIGH | tests/test_tools_shell.py | 1719 | start_background_job("sleep 0.5 && echo 'job1'") | CODE |
| HIGH | tests/test_tools_shell.py | 1720 | start_background_job("sleep 0.5 && echo 'job2'") | CODE |
| HIGH | tests/test_tools_shell.py | 205 | cat /tmp/test_space.sh && rm /tmp/test_space.sh""" | STRING |
| HIGH | tests/test_tools_shell.py | 216 | cat /tmp/test_space2.sh && rm /tmp/test_space2.sh""" | STRING |
| HIGH | tests/test_tools_shell.py | 1556 | """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 | 223 | "ulimit -v N && BASH_ENV='' exec bash"]`` | STRING |
| HIGH | gptme/sandbox.py | 243 | prefix = f"ulimit -H -v {kib} 2>/dev/null; ulimit -v {kib} && " | CODE |
| HIGH | gptme/sandbox.py | 276 | ["bash", "-c", f"ulimit -H -v {kib} 2>/dev/null; ulimit -v {kib}"], | CODE |
| HIGH | gptme/tools/_browser_playwright.py | 439 | if (el.className && typeof el.className === 'string') | STRING |
| HIGH | gptme/tools/tmux.py | 576 | "new-session cd ~/bob && gptme --non-interactive 'What is your latest work?'", | CODE |
| HIGH | gptme/tools/computer.py | 2177 | "(fix: pip install playwright && playwright install chromium)" | STRING |
| HIGH | gptme/tools/computer.py | 2235 | "pip install playwright && playwright install chromium", | STRING |
| HIGH | gptme/tools/python.py | 105 | _ipython.push({func.__name__: func}) | CODE |
| HIGH | gptme/tools/python.py | 199 | _ipython.push(registered_functions) | CODE |
| HIGH | gptme/util/gh.py | 744 | '.[] | select(.event == "cross-referenced" and .source.issue.pull_request != null) ' | CODE |
| 55 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 | 22 | CODE | |
| LOW | tests/test_acp_agent.py | 28 | 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_eventlog.py | 3 | CODE | |
| LOW | tests/test_mcp_server.py | 3 | CODE | |
| LOW | tests/test_mcp_server.py | 586 | 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_tools_patch_anchored.py | 3 | CODE | |
| LOW | tests/test_tasks_api.py | 18 | 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 | 1 | 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_tools__anchored.py | 7 | 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_computer_gate.py | 11 | CODE | |
| LOW | tests/test_computer_use_integration.py | 18 | 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_computer_settle.py | 12 | CODE | |
| LOW | tests/test_llm_openai.py | 6 | CODE | |
| LOW | tests/test_llm_openai.py | 7 | CODE | |
| LOW | tests/test_computer_risk_streaming.py | 16 | CODE | |
| 671 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 | 141 | except Exception: | CODE |
| LOW | tests/conftest.py | 418 | except Exception as e: | CODE |
| LOW | tests/conftest.py | 449 | except Exception as e: | CODE |
| LOW | tests/conftest.py | 497 | except Exception: | CODE |
| LOW | tests/conftest.py | 741 | except Exception as e: | CODE |
| LOW | tests/test_acp_agent.py | 413 | 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 | 377 | except Exception: | CODE |
| MEDIUM | tests/test_subagent_unit.py | 5139 | def thread_target(): | CODE |
| LOW | tests/test_subagent_unit.py | 5151 | 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 | 160 | 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_server_bad_input.py | 346 | except Exception: | CODE |
| LOW | tests/test_llm_openai.py | 688 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1225 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1274 | except Exception: | CODE |
| LOW | tests/test_server_session_models.py | 714 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 723 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 756 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 764 | 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 | 911 | def registerer(): | CODE |
| MEDIUM | tests/test_hooks_registry.py | 920 | def unregisterer(): | CODE |
| LOW | tests/test_hooks_registry.py | 917 | except Exception as e: | CODE |
| LOW | tests/test_hooks_registry.py | 924 | except Exception as e: | CODE |
| LOW | tests/test_tui.py | 520 | 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 |
| MEDIUM | scripts/github_bot.py | 72 | print(f"Error: {name} environment variable is required", file=sys.stderr) | CODE |
| MEDIUM | scripts/github_bot.py | 642 | print("Error in resolve mode: provide GITHUB_EVENT_PATH or --issue") | STRING |
| MEDIUM | scripts/github_bot.py | 726 | print("Error: Either GITHUB_EVENT_PATH or --comment-body required") | STRING |
| LOW | scripts/build_changelog.py | 587 | except Exception as e: | STRING |
| LOW | scripts/analyze_compression.py | 116 | except Exception as e: | CODE |
| LOW | scripts/analyze_compression.py | 220 | except Exception as e: | CODE |
| LOW | scripts/demo_capture.py | 195 | except Exception as e: | CODE |
| LOW | scripts/demo_capture.py | 275 | except Exception as e: | CODE |
| 527 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 | 530 | # Create a temporary file with the given content | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 1031 | # Create a fake log directory with a conversation.jsonl | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 1652 | # 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 | 1889 | # Create a conversation with a non-test prefix so it isn't filtered out | COMMENT |
| MEDIUM | tests/test_server_v2.py | 1922 | # 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 | 206 | # 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_cc_memory.py | 90 | # Create a fake CC memory 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 | 110 | # Create a subdirectory to work from | COMMENT |
| MEDIUM⚡ | tests/test_tools_save.py | 132 | # Create a directory outside the cwd | COMMENT |
| MEDIUM⚡ | tests/test_tools_save.py | 141 | # Create a symlink in work_dir pointing to outside_dir | COMMENT |
| MEDIUM | tests/test_tools_save.py | 188 | # 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 | 361 | # 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 | 94 | # 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 | 534 | # Create a message - role with special chars is unusual but should be safe | COMMENT |
| MEDIUM | tests/test_message.py | 246 | # Create a test file in tmp_path | COMMENT |
| MEDIUM | tests/test_llm_anthropic.py | 336 | # 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 | 211 | # Create a temp workspace with a file | COMMENT |
| MEDIUM⚡ | tests/test_prompts.py | 216 | # Create a file outside workspace | COMMENT |
| MEDIUM⚡ | tests/test_prompts.py | 221 | # Create a gptme.toml with path traversal attempt | COMMENT |
| MEDIUM | tests/test_execenv.py | 236 | # 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_tools_browser.py | 393 | # 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 | 193 | # Create a conversation via the API so LogManager can find it | COMMENT |
| MEDIUM | tests/test_acp_session_runtime.py | 204 | # Create a session backed by the dummy ACP runtime | COMMENT |
| MEDIUM | tests/test_acp_session_runtime.py | 917 | # 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 |
| MEDIUM⚡ | tests/test_cmd_service.py | 966 | # Create a subdir whose name contains a character systemd forbids but | COMMENT |
| MEDIUM | tests/test_server_v2_sessions.py | 2080 | # Create a conversation via PUT, then manually remove the session to simulate no-session case | COMMENT |
| 116 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_eval_behavioral_solutions.py | 55 | CODE | |
| LOW | tests/conftest.py | 254 | CODE | |
| LOW | tests/conftest.py | 454 | CODE | |
| LOW | tests/conftest.py | 575 | CODE | |
| LOW | tests/conftest.py | 708 | CODE | |
| LOW | tests/conftest.py | 583 | CODE | |
| LOW | tests/conftest.py | 717 | CODE | |
| LOW | tests/test_tree.py | 4 | CODE | |
| LOW | tests/test_onboard.py | 20 | 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_computer_docker_config.py | 28 | CODE | |
| LOW | tests/test_tools_subagent.py | 1176 | CODE | |
| LOW | tests/test_tools_subagent.py | 1230 | CODE | |
| LOW | tests/test_computer_semantic_fixtures.py | 183 | 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/treeofthoughts.py | 183 | CODE | |
| LOW | scripts/generate_sounds.py | 371 | CODE | |
| LOW | scripts/build_changelog.py | 207 | CODE | |
| LOW | scripts/build_changelog.py | 327 | CODE | |
| LOW | scripts/build_changelog.py | 454 | CODE | |
| LOW | scripts/check_rst_formatting.py | 26 | CODE | |
| LOW | scripts/check_rst_formatting.py | 170 | 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 | 109 | CODE | |
| LOW | gptme/checkpoint.py | 240 | CODE | |
| LOW | gptme/prompt_queue.py | 128 | CODE | |
| LOW | gptme/model_attestation.py | 129 | CODE | |
| LOW | gptme/message.py | 544 | CODE | |
| LOW | gptme/message.py | 615 | CODE | |
| LOW | gptme/__version__.py | 16 | CODE | |
| LOW | gptme/__version__.py | 60 | CODE | |
| LOW | gptme/status_provider.py | 77 | CODE | |
| LOW | gptme/sandbox.py | 548 | CODE | |
| LOW | gptme/chat.py | 201 | CODE | |
| LOW | gptme/chat.py | 391 | CODE | |
| LOW | gptme/chat.py | 695 | CODE | |
| LOW | gptme/circuit_breaker.py | 108 | CODE | |
| LOW | gptme/k_best.py | 69 | CODE | |
| LOW | gptme/k_best.py | 99 | CODE | |
| LOW | gptme/k_best.py | 101 | CODE | |
| 388 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 | 46 | 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 | 60 | 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 | 5908 | 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 | 11 | 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 | 274 | 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 | 32 | __all__ = [ | CODE |
| LOW | gptme/telemetry.py | 49 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/message.py | 30 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/message.py | 44 | 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 | 51 | 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 | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/init.py | 412 | def _set_console_compact(enabled: bool) -> None: | CODE |
| LOW | gptme/profiles.py | 41 | 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 | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell_validation.py | 24 | 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/gh.py | 47 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/convert.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_playwright.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 118 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 1040 | def set_workspace_cwd(cwd: str) -> None: | CODE |
| LOW | gptme/tools/shell.py | 1075 | def set_shell(shell: ShellSession) -> None: | CODE |
| LOW | gptme/tools/tmux.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/__init__.py | 42 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/__init__.py | 45 | __all__ = [ | CODE |
| LOW⚡ | gptme/tools/__init__.py | 85 | def _set_available_tools_cache(tools: list[ToolSpec] | None) -> None: | CODE |
| LOW | gptme/tools/__init__.py | 494 | def set_tools(tools: list[ToolSpec]) -> None: | CODE |
| LOW | gptme/tools/computer.py | 117 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_thread.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_thread.py | 44 | def set_storage_state_override(path: Path | None) -> None: | CODE |
| LOW | gptme/tools/elicit.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/browser.py | 389 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/autocommit.py | 33 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/autocommit.py | 176 | __all__ = ["tool"] | STRING |
| 237 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 | 287 | # 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_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 | 362 | # Check if original had <think>, if so, compacted should too | COMMENT |
| LOW⚡ | tests/test_tools_morph.py | 242 | # Set cwd to a subdirectory so the file path escapes it | COMMENT |
| LOW | tests/test_cli.py | 1338 | # 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 | 1265 | # Check if stdin is /dev/null | COMMENT |
| LOW | tests/test_tools_shell.py | 1315 | # 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 | 65 | # Check if we're exiting a code block (line with same or less indentation that has content) | COMMENT |
| LOW | scripts/check_rst_formatting.py | 99 | # Check if this is the start of a new list (not continuing an existing one) | COMMENT |
| LOW | scripts/check_rst_formatting.py | 106 | # Check if there's a blank line between this and the parent list item | COMMENT |
| LOW | scripts/check_rst_formatting.py | 119 | # Check if bullet list needs blank line before it | COMMENT |
| LOW | scripts/check_rst_formatting.py | 128 | # 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 | 453 | # Check if user declined execution - return to prompt without generating response | COMMENT |
| LOW | gptme/chat.py | 490 | # Check if there are any runnable tools left | COMMENT |
| LOW | gptme/chat.py | 520 | # Check if there's an interrupt or decline message after the last assistant message | COMMENT |
| LOW | gptme/chat.py | 549 | # Check if we should prompt for input or generate response directly | COMMENT |
| LOW | gptme/codeblock.py | 261 | # Check if this line starts with backticks (potential opening or closing) | COMMENT |
| LOW | gptme/codeblock.py | 265 | # Check if this is a bare fence (only backticks on the line) | COMMENT |
| LOW | gptme/codeblock.py | 330 | # Check if this line is a bare fence (only backticks) | COMMENT |
| LOW | gptme/codeblock.py | 336 | # Check if there's content after it (allowing blank lines) | COMMENT |
| LOW | gptme/init.py | 162 | # Check if model has provider/model format | COMMENT |
| LOW | gptme/init.py | 165 | # Check if it's a built-in provider or custom provider | COMMENT |
| LOW | gptme/info.py | 260 | # Check if editable via direct_url.json | COMMENT |
| LOW | gptme/info.py | 280 | # Check if installed via pipx (lives in ~/.local/pipx/) | COMMENT |
| LOW | gptme/info.py | 298 | # Check if any of the indicator packages are installed | COMMENT |
| LOW | gptme/tools/save.py | 160 | # Check if file exists and store original content for comparison | COMMENT |
| LOW | gptme/tools/save.py | 165 | # Check if folder exists | COMMENT |
| LOW | gptme/tools/save.py | 191 | # Check if this was an inefficient overwrite (minimal changes) | COMMENT |
| LOW | gptme/tools/save.py | 244 | # Check if folder exists first | COMMENT |
| LOW | gptme/tools/shell_validation.py | 245 | # Check if remaining text is the delimiter. Include the | COMMENT |
| LOW | gptme/tools/shell_validation.py | 252 | # Check if the line from pos to newline_idx is just the delimiter. | COMMENT |
| LOW | gptme/tools/shell_validation.py | 284 | # Check if this pipe is inside quotes | COMMENT |
| LOW | gptme/tools/shell_validation.py | 286 | # Check if this is part of || (logical OR) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 560 | # Check if all commands in the pipeline are allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 620 | # Check if the match is within a safe region (quoted or heredoc) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 680 | # Check if command is allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 707 | # Check if disabled via environment variable | COMMENT |
| LOW | gptme/tools/shell_validation.py | 711 | # Check if shellcheck is available | COMMENT |
| LOW | gptme/tools/shell_validation.py | 780 | # Check if any triggered codes are error codes (should block) | COMMENT |
| LOW | gptme/tools/gh.py | 244 | # Check if all checks are done | COMMENT |
| LOW | gptme/tools/mcp_adapter.py | 203 | # Check if the tool has inputSchema with properties | COMMENT |
| LOW | gptme/tools/mcp_adapter.py | 444 | # Check if server already loaded | COMMENT |
| LOW | gptme/tools/mcp_adapter.py | 448 | # Check if server is in config | COMMENT |
| LOW | gptme/tools/shell.py | 424 | # Check if -S or -n flags are present (they disable TTY need) | COMMENT |
| 126 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/model_attestation.py | 225 | 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 | 298 | Concatenate two messages of the same role. Merges content with separator, and combines files and file_hashes. | STRING |
| HIGH | gptme/sandbox.py | 517 | 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/tools/_browser_playwright.py | 739 | 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 | 891 | 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 | 765 | 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 | 843 | 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 | 939 | 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 | 1043 | 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 | 2431 | Start recording the screen to an MP4 file. Uses ``ffmpeg`` with ``x11grab`` (Linux) or ``avfoundation`` (macOS). | STRING |
| HIGH | gptme/tools/computer.py | 2514 | Record the screen for a fixed duration and return the output path. Synchronous wrapper around ``start_recording()`` | STRING |
| HIGH | gptme/tools/browser.py | 189 | 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 | 1020 | Load a previously saved browser session (cookies, localStorage) from a file. In-session complement to ``save_browse | STRING |
| HIGH | gptme/tools/browser.py | 1130 | 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 | 356 | 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 | 35 | Get a unique name for the compacted conversation fork. The original conversation stays untouched as the backup | STRING |
| HIGH | gptme/tools/subagent/batch.py | 392 | 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 | 1159 | 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 | 1523 | 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 | 1175 | Get available models from a provider. Args: provider: The provider to get models from Returns: | STRING |
| HIGH | gptme/llm/utils.py | 85 | 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 | 97 | 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 | 195 | 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 | 61 | Create an agent workspace by cloning a template repository. This is the recommended approach for creating agen | STRING |
| HIGH | gptme/mcp/client.py | 348 | Read a specific resource by URI. Args: uri: The URI of the resource to read. Returns: | STRING |
| HIGH | gptme/mcp/client.py | 428 | Get a specific prompt by name with optional arguments. Args: name: The name of the prompt to retrie | STRING |
| HIGH | gptme/logmanager/conversations.py | 553 | 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 | 1310 | 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 | 83 | - [🛡 Guardrails](#-guardrails) | CODE |
| MEDIUM | tests/test_replay.py | 337 | # Model with a 100-token context window | COMMENT |
| MEDIUM | tests/conftest.py | 285 | # 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_tools_rag.py | 50 | # Should yield nothing when RAG is not available | COMMENT |
| MEDIUM | tests/test_tools_rag.py | 68 | # 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 | 56 | ## Set up a project scaffold | COMMENT |
| MEDIUM | gptme/constants.py | 58 | # This prevents unbounded memory usage and context window overflow | COMMENT |
| MEDIUM | gptme/tools/shell.py | 1757 | # starting background execution so guardrails can intercept commands | COMMENT |
| MEDIUM | gptme/tools/shell.py | 1846 | # TOOL_CONFIRM hooks (including third-party guardrails) see the complete | 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/subagent/hooks.py | 105 | # immediately, without waiting for the agentic turn to finish naturally. | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 297 | # GPT-5.3 Codex — top-tier agentic coding model | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 327 | # GPT-5.2 Codex — agentic coding variant of 5.2 | COMMENT |
| MEDIUM | gptme/llm/llm_openai_models.py | 349 | # GPT-5.1 Codex — agentic coding variant of 5.1 | COMMENT |
| MEDIUM | gptme/util/ask_execute.py | 129 | # 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/cli/util.py | 466 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 487 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 519 | # Initialize RAG | 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/logmanager/manager.py | 842 | # Expired — drop from context window (not from the log on disk). | COMMENT |
| MEDIUM | gptme/logmanager/manager.py | 972 | # Enrich with enabled context enhancements (RAG, fresh context) | COMMENT |
| MEDIUM | gptme/prompts/__init__.py | 477 | # Sub-module imports for orchestration | COMMENT |
| MEDIUM | gptme/commands/llm.py | 353 | # 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⚡ | tests/test_server_v2.py | 1657 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1664 | # Step 2: fetch that specific session by its ID (webui detail fetch) | 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 | 498 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 503 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 509 | # 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 | 254 | # Step 1: Request device authorization | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 272 | # Step 2: Display code to user | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 276 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/auth.py | 81 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 109 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 125 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/onboard.py | 238 | # Step 1: Detect providers | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 268 | # Step 2: Select provider | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 278 | # Step 3: Test connectivity | COMMENT |
| LOW | gptme/cli/onboard.py | 292 | # 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 | .pre-commit-config.yaml | 41 | #- repo: local | COMMENT |
| LOW | pyproject.toml | 401 | # Scope --timeout to the test function only, NOT the whole runtest protocol. | 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/lib.rs | 61 | COMMENT | |
| LOW | tauri/src-tauri/src/lib.rs | 701 | // Two paths need coverage: | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 761 | match child.kill() { | COMMENT |
| LOW | tests/conftest.py | 461 | yield | COMMENT |
| LOW | tests/thread_leak.py | 41 | DICT_RACE_MESSAGE = "dictionary changed size during iteration" | 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 | 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/webui-visual-diff.yml | 161 | # Pinned to a full commit SHA (not the mutable `v2` tag) because this | COMMENT |
| LOW | .github/workflows/build.yml | 141 | labels: ${{ steps.meta-eval.outputs.labels }} | 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 | needsInitialStep: boolean; | 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 | const count = visibleMessageIndicesRef.current.length; | COMMENT |
| LOW | webui/src/components/ChatInput.tsx | 621 | defaultModel: apiDefaultModel, | COMMENT |
| LOW | …/src/components/__tests__/ConversationContent.test.tsx | 761 | // by the scroll handler. The second rAF must detect the position drift | COMMENT |
| LOW | …/src/components/__tests__/ConversationContent.test.tsx | 821 | }); | COMMENT |
| LOW | gptme/sandbox.py | 241 | # before we get here). The soft limit is then set to the same value and | COMMENT |
| LOW | gptme/codeblock.py | 141 | ) | COMMENT |
| LOW | gptme/codeblock.py | 221 | COMMENT | |
| LOW | gptme/codeblock.py | 281 | # Only treat it as a real blank if there's more content after. | COMMENT |
| LOW | gptme/tools/shell_validation.py | 361 | # predict at validation time, so any `..` in a path is treated as | COMMENT |
| LOW | gptme/tools/shell_validation.py | 581 | return False | COMMENT |
| LOW | gptme/tools/hashline_edit.py | 81 | COMMENT | |
| LOW | gptme/tools/base.py | 781 | # message and stamp call_id plus tool provenance on it. | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 201 | # with a fresh, empty contextvars context, so _loaded_tools_var here already | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 421 | # Subagent._read_log() instead. | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 581 | # Progress file for subprocess-mode progress delivery. | COMMENT |
| LOW | gptme/tools/subagent/batch.py | 281 | # collected in self.results. Workers will exit their poll loops within | COMMENT |
| LOW | gptme/tools/subagent/types.py | 301 | # behaviour: auto-remove if unchanged, preserve branch if changes exist. | COMMENT |
| LOW | gptme/llm/__init__.py | 741 | # Buffer chars for the current line before forwarding to on_token. | COMMENT |
| LOW | gptme/llm/__init__.py | 821 | just_closed_thinking = True | COMMENT |
| LOW | gptme/llm/__init__.py | 881 | # <think> tag characters from leaking to callers before are_thinking | COMMENT |
| LOW | gptme/llm/__init__.py | 921 | COMMENT | |
| LOW | gptme/llm/models/data.py | 61 | "azure", | COMMENT |
| LOW | gptme/llm/models/data.py | 381 | "preferred_edit_format": "diff", | COMMENT |
| LOW | gptme/server/session_step.py | 681 | COMMENT | |
| LOW | gptme/server/session_step.py | 1061 | # assistant message may contain multiple tool uses. After completing | COMMENT |
| 18 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_v2.py | 1657 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1664 | # Step 2: fetch that specific session by its ID (webui detail fetch) | 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 | 498 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 503 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 509 | # 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 | 254 | # Step 1: Request device authorization | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 272 | # Step 2: Display code to user | COMMENT |
| LOW⚡ | gptme/llm/llm_gptme.py | 276 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/auth.py | 81 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 109 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 125 | # Step 3: Poll for token | COMMENT |
| LOW | gptme/cli/onboard.py | 238 | # Step 1: Detect providers | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 268 | # Step 2: Select provider | COMMENT |
| LOW⚡ | gptme/cli/onboard.py | 278 | # Step 3: Test connectivity | COMMENT |
| LOW | gptme/cli/onboard.py | 292 | # 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 | 102 | swebench = {version = ">=1.0", optional=true} # for SWE-bench eval harness | CODE |
| MEDIUM | pyproject.toml | 103 | terminal-bench = {version = ">=0.1", optional=true, python = ">=3.12"} # for Terminal-Bench eval harness | CODE |
| MEDIUM⚡ | tests/test_mcp_discovery.py | 151 | # We'll use a try-except to make the test more robust | COMMENT |
| LOW⚡ | tests/test_reduce.py | 150 | # Should not raise ValueError, just return messages as-is with content preserved | COMMENT |
| MEDIUM | gptme/tools/autocompact/resume.py | 177 | resume_prompt = """Please create a comprehensive resume of this conversation that includes: | CODE |
| MEDIUM | gptme/tools/subagent/__init__.py | 141 | ### ACP Mode (multi-harness support) | COMMENT |
| MEDIUM | gptme/tools/subagent/api.py | 549 | # ACP mode: multi-harness support via Agent Client Protocol | COMMENT |
| MEDIUM | gptme/llm/__init__.py | 927 | # 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 | 482 | # Check for uvx (comprehensive cross-platform detection to avoid false positives) | COMMENT |
| LOW | gptme/server/openapi_docs.py | 634 | # For now, just use the first non-None type as 200 response | COMMENT |
| MEDIUM⚡ | gptme/server/tasks_api.py | 273 | """Get comprehensive task information with derived data.""" | STRING |
| 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 | 341 | ["git", "config", "user.email", "test@test.com"], | CODE |
| LOW | tests/test_prompts.py | 617 | ["git", "config", "user.email", "test@test.com"], | CODE |
| 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 | 1035 | "GIT_AUTHOR_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1037 | "GIT_COMMITTER_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1043 | ["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_util_keyword_matching.py | 251 | text = "Lorem ipsum " * 100 + "specific keyword here" + " dolor sit" * 100 | CODE |
| LOW | tests/test_util_review.py | 2332 | run(["git", "config", "user.email", "test@test.com"]) | CODE |
| LOW | .github/workflows/docs.yml | 39 | echo -e '[prompt]\nabout_user = "testing"\nresponse_preference = "just testing"\n\n[env]\nOPENAI_API_KEY="sk-d | CODE |
| LOW | webui/src/democonversations.ts | 152 | content: `Stress message ${i + 1}: ${'Lorem ipsum dolor sit amet. '.repeat(3)}`, | CODE |
| LOW | webui/src/democonversations.ts | 152 | 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 | 1062 | fill_element("[name='email']", "user@example.com") | STRING |
| LOW | gptme/tools/computer.py | 2068 | computer("type", text="user@example.com") | CODE |
| LOW | gptme/tools/computer.py | 2072 | computer("type", text="user@example.com") | CODE |
| LOW | gptme/tools/browser.py | 1253 | fill_element("[name='email']", "user@example.com") | 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 | 481 | CODE | |
| MEDIUM | tests/test_hooks.py | 64 | CODE | |
| MEDIUM | tests/test_hooks.py | 69 | CODE | |
| MEDIUM | tests/test_hooks.py | 74 | CODE | |
| MEDIUM | tests/test_llm_openai_subscription.py | 357 | 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 | 839 | CODE | |
| LOW | tests/test_util_tool_format.py | 28 | CODE | |
| LOW | tests/test_json_output.py | 137 | CODE | |
| LOW | tests/test_json_output.py | 652 | CODE | |
| LOW | tests/test_json_output.py | 765 | CODE | |
| LOW | gptme/chat.py | 55 | CODE | |
| LOW | gptme/tools/shell.py | 1951 | CODE | |
| LOW | gptme/tools/chats.py | 646 | CODE | |
| LOW | gptme/tools/base.py | 401 | CODE | |
| LOW | gptme/tools/subagent/execution.py | 155 | CODE | |
| LOW | gptme/tools/subagent/execution.py | 889 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 491 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 600 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 1096 | CODE | |
| LOW | gptme/tools/subagent/api.py | 98 | CODE | |
| LOW | gptme/llm/__init__.py | 279 | CODE | |
| LOW | gptme/llm/__init__.py | 690 | CODE | |
| LOW | gptme/llm/models/listing.py | 284 | CODE | |
| LOW | gptme/util/reduce.py | 632 | CODE | |
| LOW | gptme/config/cli_setup.py | 101 | CODE | |
| LOW | gptme/cli/cmd_init.py | 187 | CODE | |
| LOW | gptme/prompts/__init__.py | 385 | CODE | |
| LOW | gptme/prompts/__init__.py | 504 | CODE | |
| LOW | gptme/eval/main.py | 542 | 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 | 353 | (subdir / "utils.py").write_text("def helper(): pass") | CODE |
| LOW⚡ | tests/test_context.py | 492 | (subdir / "utils.py").write_text("def helper(): pass") | CODE |
| LOW⚡ | tests/test_tools_base.py | 276 | def helper(name: str) -> bool: | CODE |
| LOW⚡ | tests/test_tools_base.py | 287 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_base.py | 455 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_base.py | 501 | def helper(name: str) -> bool: | CODE |
| LOW | tests/test_tools_shell.py | 388 | def test_function(shell): | STRING |
| LOW | gptme/cli/cmd_computer.py | 903 | 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 | 201 | # Generated by gptme onboard | COMMENT |
| 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 |
|---|---|---|---|---|
| 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 |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | gptme/cli/util.py | 1391 | click.echo(f"Set it with: export {env_var}=your-api-key") | CODE |