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,354 GitHub stars. SynthScan v2.0 examined 399,019 lines of code across 1269 source files, recording 10705 pattern matches distributed across 25 syntactic categories. The overall adjusted score of 34.4 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 10705 distinct pattern matches across 25 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_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 |
| LOW | tests/test_dspy_basic.py | 178 | def test_task_coverage_analysis(): | CODE |
| LOW | tests/test_dspy_basic.py | 201 | def test_optimization_experiment(): | CODE |
| 6995 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 | 328 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_computer_api.py | 330 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 118 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 120 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 180 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 182 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 212 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 214 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 296 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_computer_api.py | 298 | # --------------------------------------------------------------------------- | 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_util_context_dedup.py | 165 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 167 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 194 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 196 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_util_context_dedup.py | 8 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_util_context_dedup.py | 10 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 87 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 89 | # --------------------------------------------------------------------------- | STRING |
| MEDIUM⚡ | tests/test_util_context_dedup.py | 136 | # --------------------------------------------------------------------------- | STRING |
| 976 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 | 177 | assert _find_first_unquoted_pipe("cmd1 || cmd2") is None | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 180 | result = _find_first_unquoted_pipe("cmd1 || cmd2 | cmd3") | CODE |
| HIGH⚡ | tests/test_tools_shell_validation.py | 183 | cmd = "cmd1 || cmd2 | cmd3" | CODE |
| HIGH | tests/test_reduce.py | 707 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| HIGH | tests/test_reduce.py | 773 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| HIGH | tests/test_reduce.py | 835 | content="I'll run two things.\n```shell\necho a && echo b\n```", | CODE |
| 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/tools/_browser_playwright.py | 430 | 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 | 619 | '.[] | select(.event == "cross-referenced" and .source.issue.pull_request != null) ' | CODE |
| HIGH | gptme/server/api_v2.py | 1095 | # Cursor pagination path — returns {conversations: [...], next_cursor: string|null} | COMMENT |
| HIGH | gptme/server/api_v2.py | 1034 | "description": "If true, return a paginated response object {conversations: [...], next_cursor: string|null} | CODE |
| HIGH | gptme/server/api_v2.py | 1053 | ``{conversations: [...], next_cursor: string|null}``. Pass the returned | STRING |
| HIGH | gptme/server/openapi_docs.py | 948 | # Handle direct nullable patterns (type + default: null) | COMMENT |
| HIGH⚡ | gptme/cli/cmd_computer.py | 1372 | " sudo apt install stterm && st &" | CODE |
| HIGH | gptme/cli/cmd_computer.py | 1339 | " On Linux: sudo apt install scrot && export DISPLAY=:1\n" | CODE |
| HIGH | gptme/cli/cmd_computer.py | 1601 | hint="pip install playwright && python -m playwright install chromium (optional — needed for browser tool | CODE |
| HIGH | gptme/cli/cmd_computer.py | 1700 | "var text = (compose.innerText || compose.textContent || '').trim();" | CODE |
| HIGH | gptme/cli/setup.py | 602 | "install": "pip install playwright && playwright install", | CODE |
| 42 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_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_acp_client.py | 12 | CODE | |
| LOW | tests/test_acp_client.py | 32 | CODE | |
| LOW | tests/test_cli_from_turn.py | 3 | CODE | |
| LOW | tests/test_computer_record.py | 8 | CODE | |
| LOW | tests/test_tools_patch_anchored.py | 3 | CODE | |
| LOW | tests/test_tasks_api.py | 18 | CODE | |
| LOW | tests/test_computer_doctor_cmd.py | 7 | CODE | |
| LOW | tests/test_acp_session_runtime.py | 3 | CODE | |
| LOW | tests/test_util_hooks.py | 3 | CODE | |
| LOW | tests/test_computer_demo_cmd.py | 8 | CODE | |
| LOW | tests/test_gptme_provider.py | 8 | CODE | |
| LOW | tests/test_acp_protocol_logging.py | 7 | CODE | |
| LOW | tests/test_github_ci_self_heal.py | 1 | CODE | |
| LOW | tests/test_browser_state.py | 3 | CODE | |
| LOW | tests/test_computer_run_task_cli.py | 8 | CODE | |
| LOW | tests/test_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_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_computer_docker_config.py | 15 | 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 | |
| LOW | tests/test_unified_plugins.py | 3 | CODE | |
| LOW | tests/test_tools_base.py | 7 | CODE | |
| LOW | tests/test_commands_rag.py | 92 | CODE | |
| LOW | tests/test_snapshot_list.py | 3 | CODE | |
| LOW | tests/test_browser_session_persistence.py | 10 | CODE | |
| LOW | tests/test_util_cli_batch.py | 3 | CODE | |
| LOW | tests/test_server_session_models.py | 6 | CODE | |
| LOW | tests/test_util_cli_attest.py | 3 | CODE | |
| LOW | tests/test_computer_latency_cmd.py | 7 | CODE | |
| LOW | tests/test_oauth_openrouter.py | 3 | CODE | |
| LOW | tests/test_checkpoint.py | 3 | CODE | |
| LOW | tests/test_external_sessions.py | 7 | CODE | |
| LOW | tests/test_cli_resume.py | 3 | CODE | |
| LOW | scripts/check_model_freshness.py | 20 | CODE | |
| 619 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 | 286 | # 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 | 309 | # Create a temporary file with the given content | COMMENT |
| MEDIUM | tests/conftest.py | 430 | # Create a test client without authentication by default | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 1031 | # Create a fake log directory with a conversation.jsonl | COMMENT |
| MEDIUM | tests/test_acp_agent.py | 1501 | # 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 | 1266 | # Create a conversation with a non-test prefix so it isn't filtered out | COMMENT |
| MEDIUM | tests/test_server_v2.py | 1299 | # 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_agent.py | 451 | # Create a plist file | COMMENT |
| MEDIUM | tests/test_agent.py | 762 | # Create a fake workspace | COMMENT |
| MEDIUM | tests/test_agent.py | 982 | # 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 | 158 | # 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 | 542 | # Create a body that exceeds 1000 tokens (4000 chars) | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 571 | # Create a body with identifiable start and end | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 620 | # Create a mock response with a very long review comment | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 675 | # Create a long comment with a suggestion in the middle (where truncation would remove it) | COMMENT |
| MEDIUM | tests/test_util_gh_mocked.py | 797 | # 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 | 194 | # Create a report with artificially high-risk segments | COMMENT |
| MEDIUM⚡ | tests/test_message.py | 464 | # Create a message - role with special chars is unusual but should be safe | COMMENT |
| MEDIUM | tests/test_message.py | 178 | # Create a test file in tmp_path | COMMENT |
| MEDIUM | tests/test_llm_anthropic.py | 333 | # 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 | 905 | # 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_server_v2_sessions.py | 1172 | # Create a conversation via PUT, then manually remove the session to simulate no-session case | COMMENT |
| MEDIUM | tests/test_tools_tmux.py | 223 | # Create a worker-isolated session to avoid race conditions | COMMENT |
| 112 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 | 104 | except Exception: | CODE |
| LOW | tests/conftest.py | 251 | except Exception as e: | CODE |
| LOW | tests/conftest.py | 285 | except Exception: | CODE |
| LOW | tests/conftest.py | 496 | 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 | 374 | except Exception: | CODE |
| MEDIUM | tests/test_subagent_unit.py | 4888 | def thread_target(): | CODE |
| LOW | tests/test_subagent_unit.py | 4900 | except Exception as e: | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 1011 | print(f"Error: negative value {value}") | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 1017 | print(f"Error: {e}") | CODE |
| MEDIUM | tests/test_eval_behavioral.py | 973 | def process_record(record): | CODE |
| LOW⚡ | tests/test_eval_behavioral.py | 1669 | except Exception: | CODE |
| LOW | tests/test_eval_behavioral.py | 2938 | 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 | 345 | except Exception: | CODE |
| LOW | tests/test_llm_openai.py | 529 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1178 | except Exception: | CODE |
| LOW | tests/test_tools_subagent.py | 1227 | except Exception: | CODE |
| LOW | tests/test_server_session_models.py | 701 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 710 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 743 | except Exception as e: | CODE |
| LOW | tests/test_server_session_models.py | 751 | 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 |
| 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 | 643 | print("Error in resolve mode: provide GITHUB_EVENT_PATH or --issue") | STRING |
| MEDIUM | scripts/github_bot.py | 727 | 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 |
| LOW | scripts/demo_capture.py | 333 | except Exception as e: | CODE |
| LOW | scripts/demo_capture.py | 352 | except Exception as e: | CODE |
| 453 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_eval_behavioral_solutions.py | 55 | CODE | |
| LOW | tests/conftest.py | 144 | CODE | |
| LOW | tests/conftest.py | 257 | CODE | |
| LOW | tests/conftest.py | 341 | CODE | |
| LOW | tests/conftest.py | 463 | CODE | |
| LOW | tests/conftest.py | 349 | CODE | |
| LOW | tests/conftest.py | 472 | CODE | |
| LOW | tests/test_tree.py | 1 | CODE | |
| LOW | tests/test_onboard.py | 20 | CODE | |
| LOW | tests/test_plugins.py | 369 | CODE | |
| LOW | tests/test_server_parent_death_watcher.py | 42 | 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 | 667 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 201 | CODE | |
| LOW | tests/test_util_gh_mocked.py | 700 | 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 | 1129 | CODE | |
| LOW | tests/test_tools_subagent.py | 1183 | 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 | 104 | CODE | |
| LOW | gptme/checkpoint.py | 239 | CODE | |
| LOW | gptme/message.py | 494 | CODE | |
| LOW | gptme/message.py | 565 | CODE | |
| LOW | gptme/__version__.py | 8 | CODE | |
| LOW | gptme/__version__.py | 46 | CODE | |
| LOW | gptme/chat.py | 183 | CODE | |
| LOW | gptme/chat.py | 340 | CODE | |
| LOW | gptme/chat.py | 593 | CODE | |
| LOW | gptme/circuit_breaker.py | 108 | CODE | |
| LOW | gptme/codeblock.py | 96 | CODE | |
| LOW | gptme/init.py | 99 | CODE | |
| LOW | gptme/info.py | 132 | CODE | |
| LOW | gptme/info.py | 249 | CODE | |
| LOW | gptme/workspace_snapshot.py | 228 | CODE | |
| LOW | gptme/tools/_browser_lynx.py | 29 | CODE | |
| LOW | gptme/tools/patch.py | 263 | CODE | |
| LOW | gptme/tools/shell_validation.py | 111 | CODE | |
| 316 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 | 173 | # 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 | 240 | # Set cwd to a subdirectory so the file path escapes it | COMMENT |
| LOW | tests/test_cli.py | 1120 | # 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 | 455 | # 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 | 399 | # Check if user declined execution - return to prompt without generating response | COMMENT |
| LOW | gptme/chat.py | 436 | # Check if there are any runnable tools left | COMMENT |
| LOW | gptme/chat.py | 466 | # Check if there's an interrupt or decline message after the last assistant message | COMMENT |
| LOW | gptme/chat.py | 495 | # Check if we should prompt for input or generate response directly | COMMENT |
| LOW | gptme/codeblock.py | 252 | # Check if this line starts with backticks (potential opening or closing) | COMMENT |
| LOW | gptme/codeblock.py | 256 | # Check if this is a bare fence (only backticks on the line) | COMMENT |
| LOW | gptme/codeblock.py | 321 | # Check if this line is a bare fence (only backticks) | COMMENT |
| LOW | gptme/codeblock.py | 327 | # Check if there's content after it (allowing blank lines) | COMMENT |
| LOW | gptme/init.py | 141 | # Check if model has provider/model format | COMMENT |
| LOW | gptme/init.py | 144 | # 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 | 284 | # Check if installed via pipx (lives in ~/.local/pipx/) | COMMENT |
| LOW | gptme/info.py | 302 | # 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 | 184 | # Check if remaining text is the delimiter | COMMENT |
| LOW | gptme/tools/shell_validation.py | 189 | # Check if the line from pos to newline_idx is just the delimiter | COMMENT |
| LOW | gptme/tools/shell_validation.py | 219 | # Check if this pipe is inside quotes | COMMENT |
| LOW | gptme/tools/shell_validation.py | 221 | # Check if this is part of || (logical OR) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 277 | # Check if all commands in the pipeline are allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 329 | # Check if the match is within a safe region (quoted or heredoc) | COMMENT |
| LOW | gptme/tools/shell_validation.py | 363 | # Check if command is allowlisted | COMMENT |
| LOW | gptme/tools/shell_validation.py | 390 | # Check if disabled via environment variable | COMMENT |
| LOW | gptme/tools/shell_validation.py | 394 | # Check if shellcheck is available | COMMENT |
| LOW | gptme/tools/shell_validation.py | 463 | # 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 | 340 | # Check if -S or -n flags are present (they disable TTY need) | COMMENT |
| 125 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 | 32 | 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/test_eval_behavioral.py | 1044 | 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 | 9 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/prompt_queue.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/session.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/__init__.py | 13 | __all__ = ["Codeblock", "LogManager", "Message", "__version__", "chat", "get_prompt"] | 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/chat.py | 49 | 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/init.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/init.py | 283 | 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 | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_lynx.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell_validation.py | 23 | logger = logging.getLogger(__name__) | 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/_browser_playwright.py | 39 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 104 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell.py | 953 | def set_workspace_cwd(cwd: str) -> None: | CODE |
| LOW | gptme/tools/shell.py | 988 | def set_shell(shell: ShellSession) -> None: | CODE |
| LOW | gptme/tools/tmux.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/__init__.py | 40 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/__init__.py | 43 | __all__ = [ | CODE |
| LOW⚡ | gptme/tools/__init__.py | 83 | def _set_available_tools_cache(tools: list[ToolSpec] | None) -> None: | CODE |
| LOW | gptme/tools/__init__.py | 469 | 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 | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/_browser_thread.py | 41 | 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 | 374 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/autocommit.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/autocommit.py | 175 | __all__ = ["tool"] | STRING |
| LOW | gptme/tools/restart.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/shell_background.py | 31 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/rag.py | 60 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/python.py | 154 | def _setup_venv_paths(env_only: bool = False) -> None: | CODE |
| LOW | gptme/tools/vent.py | 52 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/complete.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/chats.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/pruner.py | 13 | logger = logging.getLogger(__name__) | CODE |
| LOW | gptme/tools/progress.py | 33 | logger = logging.getLogger(__name__) | CODE |
| 212 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 | 2721 | \ import re def parse_args(input_str): """Parse a shell-like argument string into a list of tokens. Handles q | STRING |
| HIGH | gptme/session.py | 81 | Create a new session. Args: session_id: Unique session identifier log: Optional LogMana | STRING |
| HIGH | gptme/message.py | 248 | Concatenate two messages of the same role. Merges content with separator, and combines files and file_hashes. | STRING |
| HIGH | gptme/tools/_browser_playwright.py | 730 | 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 | 882 | 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 | 174 | 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 | 1005 | Load a previously saved browser session (cookies, localStorage) from a file. In-session complement to ``save_browse | STRING |
| HIGH | gptme/tools/browser.py | 1115 | 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/screenshot.py | 53 | Validate that screenshot path is within allowed directory. Security: Prevents arbitrary file writes via path traver | STRING |
| HIGH | gptme/tools/base.py | 345 | 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 | 34 | 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 | 1252 | 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 | 1094 | 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 | 128 | 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 | 151 | 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 | 60 | 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 | 518 | Delete a conversation by its ID. Args: conv_id: The conversation ID to delete Returns: Tr | STRING |
| HIGH | gptme/lessons/installer.py | 509 | 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 |
|---|---|---|---|---|
| LOW⚡ | tests/test_server_v2.py | 1034 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1041 | # 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 | 478 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 483 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 489 | # 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 | 80 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 108 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 124 | # 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 | README.md | 83 | - [🛡 Guardrails](#-guardrails) | CODE |
| MEDIUM | tests/test_replay.py | 330 | # Model with a 100-token context window | COMMENT |
| MEDIUM | tests/conftest.py | 171 | # Download the embedding model before running tests. | 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 | 56 | # This prevents unbounded memory usage and context window overflow | COMMENT |
| MEDIUM | gptme/tools/rag.py | 21 | workspace_only = true # Whether to only search in the workspace directory, or the whole RAG index | STRING |
| MEDIUM | gptme/tools/rag.py | 22 | paths = [] # List of paths to include in the RAG index. Has no effect if workspace_only is true. | STRING |
| MEDIUM | gptme/tools/rag.py | 82 | ### When to use RAG | COMMENT |
| MEDIUM | gptme/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/cli/util.py | 328 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 349 | # Initialize RAG | COMMENT |
| MEDIUM | gptme/cli/util.py | 381 | # 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 | 722 | # Expired — drop from context window (not from the log on disk). | COMMENT |
| MEDIUM | gptme/logmanager/manager.py | 784 | # Enrich with enabled context enhancements (RAG, fresh context) | COMMENT |
| MEDIUM | gptme/prompts/__init__.py | 422 | # Sub-module imports for orchestration | COMMENT |
| MEDIUM | gptme/commands/llm.py | 294 | # 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 | 1034 | # Step 1: list sessions (webui catalog fetch) | COMMENT |
| LOW⚡ | tests/test_server_v2.py | 1041 | # 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 | 478 | # Step 1: include_paths extracts the image path | COMMENT |
| LOW⚡ | tests/test_chat.py | 483 | # Step 2: embed_attached_file_content preserves images | COMMENT |
| LOW⚡ | tests/test_chat.py | 489 | # 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 | 80 | # Step 1: Request device authorization | COMMENT |
| LOW | gptme/cli/auth.py | 108 | # Step 2: Show the user what to do | COMMENT |
| LOW⚡ | gptme/cli/auth.py | 124 | # 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 | 87 | swebench = {version = ">=1.0", optional=true} # for SWE-bench eval harness | CODE |
| MEDIUM | pyproject.toml | 88 | 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 | 137 | ### ACP Mode (multi-harness support) | COMMENT |
| MEDIUM | gptme/tools/subagent/api.py | 500 | # ACP mode: multi-harness support via Agent Client Protocol | COMMENT |
| MEDIUM | gptme/llm/__init__.py | 881 | # 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 | 609 | # For now, just use the first non-None type as 200 response | COMMENT |
| MEDIUM⚡ | gptme/server/tasks_api.py | 272 | """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 | 245 | # 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 | .pre-commit-config.yaml | 41 | # stages: [commit] | COMMENT |
| LOW | docker-compose.yml | 1 | # Two services are available: | COMMENT |
| LOW | docker-compose.yml | 41 | - gptme-config:/home/gptme/.config/gptme | 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 | 681 | // the normal tao event loop (e.g. last window closed via Cmd+W). | COMMENT |
| LOW | tauri/src-tauri/src/lib.rs | 741 | } | 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 | 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/performance.spec.ts | 1 | import { test, expect } from '@playwright/test'; | 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 | gptme/codeblock.py | 281 | # This fixes the case where ``` appears after a nested block | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 181 | _thread_local.agent_id = agent_id | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 321 | # Full context (using profile-filtered tools) | COMMENT |
| LOW | gptme/tools/subagent/execution.py | 361 | # Inject parent conversation context if provided | COMMENT |
| LOW | gptme/tools/subagent/batch.py | 281 | # collected in self.results. Workers will exit their poll loops within | COMMENT |
| LOW | gptme/llm/llm_openai.py | 1101 | # Ensure routed provider supports all request parameters (tools, | COMMENT |
| LOW | gptme/llm/__init__.py | 701 | # must buffer the entire line and then decide whether to emit or suppress it. | COMMENT |
| LOW | gptme/llm/__init__.py | 821 | # already-wrapped rows visible when think-sig is detected). | COMMENT |
| LOW | gptme/llm/__init__.py | 841 | # buffer (tag line itself should not reach the caller). | COMMENT |
| LOW | gptme/server/session_step.py | 1041 | # Clear previous error and mark as generating before starting thread | COMMENT |
| LOW | gptme/server/api_v2_sessions.py | 401 | COMMENT | |
| LOW | gptme/cli/util.py | 921 | def tools_call(tool_name: str, function_name: str, arg: list[str]): | COMMENT |
| LOW | gptme/eval/main.py | 121 | COMMENT | |
| LOW | gptme/eval/suites/computer.py | 201 | # Game mechanics (readable via read_page_text / ARIA): | COMMENT |
| LOW | gptme/eval/suites/computer.py | 941 | "clean exit": _expect_clean_exit, | COMMENT |
| LOW | gptme/eval/suites/computer.py | 981 | }, | COMMENT |
| LOW | gptme/eval/suites/computer.py | 1041 | # End-to-end validation of the click-driven gather-and-craft loop using a | COMMENT |
| LOW | gptme/eval/agents/swebench.py | 81 | COMMENT | |
| LOW | gptme/acp/agent.py | 141 | # Per-session model overrides (populated from per-project gptme.toml) | 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 | 680 | monkeypatch.setenv("GIT_AUTHOR_EMAIL", "test@test.com") | CODE |
| LOW | tests/test_agent.py | 682 | 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 | 509 | ["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 | 1011 | "GIT_AUTHOR_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1013 | "GIT_COMMITTER_EMAIL": "test@test.com", | CODE |
| LOW⚡ | tests/test_util_cli.py | 1019 | ["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_util_keyword_matching.py | 251 | text = "Lorem ipsum " * 100 + "specific keyword here" + " dolor sit" * 100 | 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/components/__tests__/CommandPalette.test.tsx | 405 | expect(input).toHaveAttribute('placeholder', expect.stringContaining('command')); | CODE |
| LOW | gptme/tools/_browser_playwright.py | 1053 | 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 | 1238 | 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_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 | 815 | CODE | |
| LOW | tests/test_util_tool_format.py | 28 | CODE | |
| LOW | tests/test_json_output.py | 137 | CODE | |
| LOW | tests/test_json_output.py | 630 | CODE | |
| LOW | tests/test_json_output.py | 743 | CODE | |
| LOW | gptme/chat.py | 53 | CODE | |
| LOW | gptme/tools/shell.py | 1749 | CODE | |
| LOW | gptme/tools/chats.py | 646 | CODE | |
| LOW | gptme/tools/base.py | 390 | CODE | |
| LOW | gptme/tools/subagent/execution.py | 834 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 491 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 600 | CODE | |
| LOW | gptme/tools/subagent/batch.py | 818 | CODE | |
| LOW | gptme/tools/subagent/api.py | 56 | CODE | |
| LOW | gptme/llm/__init__.py | 277 | CODE | |
| LOW | gptme/llm/models/listing.py | 282 | CODE | |
| LOW | gptme/config/cli_setup.py | 84 | CODE | |
| LOW | gptme/cli/cmd_init.py | 185 | CODE | |
| LOW | gptme/prompts/__init__.py | 337 | CODE | |
| LOW | gptme/prompts/__init__.py | 445 | CODE | |
| LOW | gptme/eval/main.py | 541 | 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 | 1654 | 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 | 58 | # 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 | 674 | # 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 |
|---|---|---|---|---|
| HIGH | gptme/cli/util.py | 1253 | click.echo(f"Set it with: export {env_var}=your-api-key") | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_server_v2_tool_confirmation.py | 39 | "Done, let me know if you need anything else.", | CODE |