Are we tiny?#
gptme is intended to be small and simple, and focus on doing the right thing in the right way, rather than all the things in all the ways.
The benefits of this approach are many:
It is easier to understand and maintain.
It is easier to contribute to.
It is easier to learn.
It is easier to extend.
It is more fun to work on.
Being aggressive about keeping things small and simple is a way to keep the project maintainable and fun to work on. The fastest way to kill a project is to make it too big and complex, and suffer burnout as a result.
Another major benefit of keeping things small and simple is that it makes it easier for AI to understand and work with the codebase. This is a major goal of the project, and it is important to keep in mind that the simpler the codebase is, the easier it will be for AI to work with it:
“The simpler your API is, the more effectively the AI can harness it when generating code.”
—Kenneth Reitz (and many others)
To that end, in this document we will present some statistics about the current state of the project, trying to be mindful to keep an eye on this page and make sure we are not growing too much.
Startup time#
$ make bench-import
make[2]: Entering directory '/home/runner/work/gptme/gptme'
Benchmarking import time for gptme
time poetry run python -X importtime -m gptme --model openai --non-interactive 2>&1 | grep "import time" | cut -d'|' -f 2- | sort -n | tail -n 10
283041 | mcp.types
285353 | gptme.tools.mcp_adapter
303724 | openai.types
371631 | openai
438202 | gptme.llm.llm_openai
697847 | gptme.cli.main
703712 | gptme.llm
705641 | gptme.commands
728617 | gptme.chat
778034 | gptme
real 0m2.603s
user 0m2.107s
sys 0m0.612s
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
$ make bench-startup
make[2]: Entering directory '/home/runner/work/gptme/gptme'
Benchmarking startup time for gptme
hyperfine "poetry run gptme '/exit'" -M 5 || poetry run gptme '/exit' || exit 1
Benchmark 1: poetry run gptme '/exit'
Time (mean ± σ): 2.399 s ± 0.079 s [User: 2.078 s, System: 0.529 s]
Range (min … max): 2.340 s … 2.538 s 5 runs
Warning: The first benchmarking run for this command was significantly slower than the rest (2.538 s). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run.
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
Lines of code#
LoC Core#
$ make cloc-core
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/*.py gptme/llm/*.py gptme/util/*.py gptme/tools/base.py gptme/tools/__init__.py gptme/hooks/__init__.py gptme/plugins/__init__.py gptme/lessons/*.py --by-file --hide-rate --quiet | tail -n +2
-----------------------------------------------------------------------------------------------
File blank comment code
-----------------------------------------------------------------------------------------------
gptme/util/gh.py 217 245 1103
gptme/llm/llm_openai.py 222 232 940
gptme/llm/llm_anthropic.py 153 193 717
gptme/tools/base.py 138 178 573
gptme/util/context.py 136 192 528
gptme/llm/llm_openai_subscription.py 136 116 523
gptme/lessons/installer.py 146 165 495
gptme/llm/__init__.py 85 120 418
gptme/util/prompt.py 103 151 410
gptme/chat.py 68 92 395
gptme/util/_telemetry.py 106 123 357
gptme/message.py 85 116 343
gptme/telemetry.py 85 54 342
gptme/info.py 85 70 294
gptme/tools/__init__.py 89 71 273
gptme/plugins/__init__.py 85 119 256
gptme/lessons/index.py 93 136 229
gptme/util/auto_naming.py 68 78 224
gptme/codeblock.py 37 142 221
gptme/profiles.py 64 67 217
gptme/lessons/hybrid_matcher.py 84 113 214
gptme/lessons/commands.py 91 48 213
gptme/lessons/parser.py 73 114 206
gptme/util/_sound_sounddevice.py 52 46 204
gptme/util/sound.py 65 72 200
gptme/llm/llm_openai_models.py 6 25 193
gptme/hooks/__init__.py 20 42 188
gptme/llm/validate.py 30 28 170
gptme/util/__init__.py 34 29 155
gptme/llm/utils.py 54 73 153
gptme/llm/llm_openai_models_deprecated.py 5 13 151
gptme/util/tool_format.py 48 75 151
gptme/util/cost_display.py 39 31 148
gptme/util/reduce.py 45 42 147
gptme/init.py 33 32 133
gptme/llm/llm_gptme.py 47 58 127
gptme/util/clipboard.py 22 12 118
gptme/util/export.py 26 29 111
gptme/util/cost_tracker.py 43 62 109
gptme/dirs.py 42 31 102
gptme/lessons/matcher.py 35 47 102
gptme/util/ask_execute.py 25 40 89
gptme/util/tree.py 21 15 87
gptme/util/git_worktree.py 25 33 83
gptme/lessons/auto_include.py 31 27 78
gptme/llm/llm_anthropic_models_deprecated.py 5 11 70
gptme/session.py 39 64 70
gptme/util/generate_name.py 5 6 69
gptme/util/master_context.py 28 38 66
gptme/__version__.py 15 11 64
gptme/util/_sound_cmd.py 22 17 62
gptme/util/tokens.py 20 20 60
gptme/util/uri.py 29 42 59
gptme/util/output_storage.py 26 36 54
gptme/util/context_dedup.py 41 93 53
gptme/util/terminal.py 28 23 53
gptme/llm/provider_plugins.py 39 35 48
gptme/util/cost.py 12 9 47
gptme/util/file_storage.py 30 47 40
gptme/util/keyword_matching.py 35 66 39
gptme/util/install.py 13 25 30
gptme/util/content.py 18 24 29
gptme/util/useredit.py 11 13 26
gptme/constants.py 17 19 25
gptme/executor.py 18 26 24
gptme/util/interrupt.py 13 15 23
gptme/lessons/__init__.py 7 15 18
gptme/__main__.py 2 0 12
gptme/__init__.py 1 0 7
gptme/llm/constants.py 1 4 1
-----------------------------------------------------------------------------------------------
SUM: 3672 4456 13539
-----------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC LLM#
$ make cloc-llm
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/llm/*.py --by-file --hide-rate --quiet | tail -n +2
-----------------------------------------------------------------------------------------------
File blank comment code
-----------------------------------------------------------------------------------------------
gptme/llm/llm_openai.py 222 232 940
gptme/llm/llm_anthropic.py 153 193 717
gptme/llm/llm_openai_subscription.py 136 116 523
gptme/llm/__init__.py 85 120 418
gptme/llm/llm_openai_models.py 6 25 193
gptme/llm/validate.py 30 28 170
gptme/llm/utils.py 54 73 153
gptme/llm/llm_openai_models_deprecated.py 5 13 151
gptme/llm/llm_gptme.py 47 58 127
gptme/llm/llm_anthropic_models_deprecated.py 5 11 70
gptme/llm/provider_plugins.py 39 35 48
gptme/llm/constants.py 1 4 1
-----------------------------------------------------------------------------------------------
SUM: 783 908 3511
-----------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC Tools#
$ make cloc-tools
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/tools/*.py gptme/hooks/*.py gptme/plugins/*.py --by-file --hide-rate --quiet | tail -n +2
-------------------------------------------------------------------------------------
File blank comment code
-------------------------------------------------------------------------------------
gptme/tools/shell.py 195 300 1092
gptme/hooks/workspace_agents.py 147 102 616
gptme/tools/mcp_adapter.py 206 210 610
gptme/tools/base.py 138 178 573
gptme/tools/browser.py 190 263 568
gptme/tools/_browser_playwright.py 140 105 517
gptme/tools/gh.py 116 126 500
gptme/tools/computer.py 155 223 450
gptme/hooks/registry.py 88 78 381
gptme/tools/chats.py 85 97 371
gptme/tools/tmux.py 95 171 346
gptme/tools/mcp.py 102 102 337
gptme/tools/save.py 61 60 274
gptme/tools/__init__.py 89 71 273
gptme/tools/shell_validation.py 88 121 273
gptme/tools/shell_background.py 65 36 270
gptme/tools/patch.py 62 95 258
gptme/plugins/__init__.py 85 119 256
gptme/tools/lessons.py 91 105 247
gptme/tools/python.py 74 90 237
gptme/tools/todo.py 95 109 232
gptme/tools/precommit.py 70 97 226
gptme/hooks/elicitation.py 90 132 213
gptme/hooks/__init__.py 20 42 188
gptme/tools/morph.py 43 47 185
gptme/tools/_browser_thread.py 27 12 156
gptme/hooks/cli_confirm.py 50 54 152
gptme/tools/restart.py 51 81 150
gptme/tools/rag.py 62 74 146
gptme/tools/form.py 38 55 145
gptme/tools/read.py 32 25 144
gptme/hooks/token_awareness.py 44 50 142
gptme/hooks/types.py 74 111 139
gptme/tools/elicit.py 36 109 135
gptme/hooks/cost_awareness.py 45 56 133
gptme/hooks/cache_awareness.py 95 138 128
gptme/tools/complete.py 34 45 125
gptme/hooks/form_autodetect.py 48 65 123
gptme/hooks/server_confirm.py 51 58 122
gptme/plugins/registry.py 40 32 115
gptme/hooks/server_elicit.py 52 56 113
gptme/hooks/confirm.py 53 88 109
gptme/tools/choice.py 31 37 105
gptme/hooks/active_context.py 25 23 100
gptme/hooks/time_awareness.py 29 31 84
gptme/tools/autocommit.py 37 58 75
gptme/tools/screenshot.py 25 29 69
gptme/tools/vision.py 20 13 62
gptme/hooks/agents_md_inject.py 23 31 61
gptme/tools/_browser_perplexity.py 22 16 60
gptme/tools/_browser_lynx.py 12 13 56
gptme/hooks/cwd_changed.py 15 11 54
gptme/hooks/markdown_validation.py 36 41 51
gptme/plugins/entrypoints.py 15 13 42
gptme/hooks/test.py 12 5 33
gptme/hooks/cwd_awareness.py 11 17 28
gptme/hooks/auto_confirm.py 11 9 24
gptme/plugins/plugin.py 25 39 17
gptme/tools/_browser_format.py 3 5 3
-------------------------------------------------------------------------------------
SUM: 3774 4579 12694
-------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC Server#
$ make cloc-server
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/server --by-file --hide-rate --quiet | tail -n +2
--------------------------------------------------------------------------------------
File blank comment code
--------------------------------------------------------------------------------------
gptme/server/session_step.py 143 172 605
gptme/server/tasks_api.py 171 110 596
gptme/server/api_v2.py 119 88 519
gptme/server/openapi_docs.py 183 142 496
gptme/server/static/main.js 51 69 496
gptme/server/api_v2_sessions.py 82 84 398
gptme/server/workspace_api.py 86 76 318
gptme/server/static/index.html 11 18 198
gptme/server/acp_session_runtime.py 34 30 161
gptme/server/auth.py 57 80 160
gptme/server/client.py 60 78 143
gptme/server/static/style.css 27 4 143
gptme/server/cli.py 26 13 133
gptme/server/session_models.py 38 41 116
gptme/server/api_v2_common.py 64 44 102
gptme/server/static/computer.html 1 1 90
gptme/server/api_v2_agents.py 24 15 89
gptme/server/app.py 23 21 57
gptme/server/__init__.py 2 3 3
gptme/server/__main__.py 1 0 3
gptme/server/constants.py 1 3 1
--------------------------------------------------------------------------------------
SUM: 1204 1092 4827
--------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC Tests#
$ make cloc-tests
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc tests --by-file --hide-rate --quiet | tail -n +2
-----------------------------------------------------------------------------------------------
File blank comment code
-----------------------------------------------------------------------------------------------
tests/test_init.py 207 109 1131
tests/test_llm_openai.py 309 176 1108
tests/test_acp_agent.py 321 184 1074
tests/test_util_gh.py 211 107 966
tests/test_tools_subagent.py 308 161 907
tests/test_info.py 167 73 878
tests/test_util_gh_mocked.py 149 119 777
tests/test_tools_shell.py 251 397 729
tests/test_tools_browser.py 232 52 697
tests/test_tools_gh.py 134 69 675
tests/test_agent.py 199 110 665
tests/test_hooks_registry.py 238 89 640
tests/test_acp_session_runtime.py 206 67 596
tests/test_config.py 161 284 585
tests/test_tools_precommit.py 109 86 578
tests/test_tasks_api.py 140 49 563
tests/test_server_workspace.py 118 120 561
tests/test_eval_leaderboard.py 66 52 557
tests/test_prompt_templates.py 206 140 551
tests/test_auto_compact.py 227 189 543
tests/test_llm_utils.py 159 101 538
tests/test_lessons.py 156 151 516
tests/test_tools_lessons.py 125 42 502
tests/test_doctor.py 142 90 486
tests/test_llm_auth.py 169 56 476
tests/test_skill_installer.py 138 154 459
tests/test_tools_shell_background.py 117 51 456
tests/test_tools_base.py 147 51 428
tests/test_lessons_commands.py 157 82 422
tests/test_dirs.py 97 69 421
tests/test_codeblock.py 283 717 404
tests/test_tools_shell_validation.py 161 63 399
tests/test_tools_mcp.py 102 20 398
tests/test_tools_computer.py 159 93 397
tests/context/test_task_analyzer.py 119 58 389
tests/test_util_cli_mcp.py 89 45 380
tests/test_lessons_parser.py 162 188 365
tests/test_profiles.py 84 30 354
tests/test_llm_anthropic.py 64 28 352
tests/test_shell_background.py 99 71 342
tests/test_cli.py 95 71 341
tests/test_unified_plugins.py 94 38 341
tests/test_commands.py 120 59 340
tests/test_eval_trends.py 35 22 335
tests/test_util_cli.py 87 52 333
tests/test_provider_plugins.py 90 32 331
tests/test_lessons_index.py 113 97 329
tests/test_message.py 119 110 323
tests/test_util_tool_format.py 78 32 322
tests/conftest.py 89 89 320
tests/test_agent_doctor.py 72 34 318
tests/test_mcp_discovery.py 97 39 315
tests/test_tools_morph.py 89 66 310
tests/test_context.py 130 79 297
tests/test_workspace_agents.py 137 57 296
tests/test_lessons_matcher.py 89 80 288
tests/lessons/test_wildcard_matching.py 114 125 287
tests/test_mcp_adapter.py 95 52 286
tests/test_eval.py 54 60 285
tests/test_server.py 106 71 283
tests/test_workspace_api.py 79 17 280
tests/test_tools_restart.py 72 49 274
tests/test_tools_complete.py 78 77 271
tests/test_execenv.py 70 51 268
tests/test_hybrid_lessons.py 71 32 263
tests/test_tools.py 113 59 259
tests/test_tools_autocommit.py 98 47 258
tests/test_context_selector.py 83 45 254
tests/test_eval_claude_code.py 66 27 253
tests/test_chat.py 122 142 252
tests/test_lessons_integration.py 97 66 252
tests/test_util_cli_providers.py 60 27 250
tests/test_prompt_tools.py 57 30 249
tests/test_llm_models.py 87 63 248
tests/test_tools_browser_thread.py 69 38 245
tests/test_agents_md_inject.py 43 37 241
tests/test_complete.py 56 40 241
tests/test_cost_display.py 27 20 241
tests/test_server_v2.py 71 40 235
tests/test_auto_naming.py 69 45 232
tests/test_hooks.py 114 46 232
tests/test_browser.py 96 53 221
tests/test_util_keyword_matching.py 75 46 218
tests/test_lessons_tool.py 62 34 216
tests/test_mcp.py 59 45 214
tests/test_autocompact_scoring.py 86 39 208
tests/test_executor.py 50 31 206
tests/test_plugins.py 82 70 203
tests/test_tools_screenshot.py 55 48 203
tests/test_util_file_storage.py 51 36 203
tests/test_chats_json.py 30 17 202
tests/test_tool_use.py 38 43 200
tests/test_subagent_unit.py 45 20 199
tests/test_tools_save.py 57 36 193
tests/test_chats_clean.py 46 18 191
tests/test_logmanager.py 56 50 188
tests/test_chats_stats.py 63 27 184
tests/test_prompts.py 59 43 184
tests/test_dspy_hybrid.py 65 45 179
tests/test_dspy_basic.py 66 44 177
tests/test_hooks_cwd_changed.py 55 24 176
tests/test_server_v2_hooks.py 71 52 175
tests/test_tools_todo.py 81 65 173
tests/test_chats_export.py 48 17 172
tests/test_acp_types.py 35 12 171
tests/test_util_terminal.py 52 34 168
tests/test_tools_elicit.py 50 25 167
tests/test_tree.py 59 37 167
tests/test_acp_protocol_logging.py 56 15 160
tests/test_acp_client.py 64 34 159
tests/test_acp_stdout.py 76 37 158
tests/test_uri.py 55 30 158
tests/test_tools_patch.py 85 203 156
tests/test_tools_time_awareness.py 52 34 155
tests/test_cost_tracker.py 21 24 154
tests/test_shell_allowlist_autoconfirm.py 38 38 154
tests/test_tools_tmux.py 69 63 154
tests/test_util_cli_skills.py 59 41 151
tests/test_util_tree.py 44 33 151
tests/test_util_install.py 34 31 148
tests/test_master_context.py 39 24 147
tests/test_file_selector_integration.py 50 23 145
tests/test_gptme_provider.py 66 20 143
tests/test_util_tokens.py 72 35 143
tests/test_dspy_integration.py 54 32 139
tests/test_tools_vision.py 36 31 138
tests/test_server_elicitation.py 47 17 137
tests/test_util_content.py 49 25 137
tests/test_acp_adapter.py 42 33 128
tests/test_conversations.py 19 10 128
tests/test_cwe214_docker_env_leak.py 42 41 128
tests/test_active_context.py 41 22 126
tests/test_tools_token_awareness.py 59 47 126
tests/test_util_context_dedup.py 61 43 125
tests/test_util_interrupt.py 48 38 121
tests/test_prompt.py 36 36 120
tests/test_integration_phase4.py 22 19 119
tests/test_llm_openai_subscription.py 32 10 118
tests/test_util_clipboard_paste.py 27 14 117
tests/test_tools_python.py 50 16 114
tests/test_lessons_status.py 67 96 113
tests/test_reduce.py 30 22 113
tests/test_chats_rename.py 42 17 112
tests/test_cost_awareness_delayed_warning.py 42 32 108
tests/test_server_v2_tool_confirmation.py 32 32 107
tests/test_util_cost.py 21 19 103
tests/test_git_worktree.py 31 19 102
tests/test_llm_validate.py 25 19 102
tests/test_command_completion.py 33 23 100
tests/test_tools_read.py 30 14 98
tests/test_session.py 40 21 95
tests/test_tools_choice.py 47 24 91
tests/test_agent_memory.py 26 17 90
tests/test_browser_lynx.py 35 15 90
tests/test_server_v2_auto_stepping.py 20 22 87
tests/test_browser_github_routing.py 27 0 86
tests/test_server_auth.py 40 19 84
tests/context/test_adaptive_compressor.py 35 23 83
tests/test_prompt_skills_summary.py 44 44 80
tests/test_util.py 42 85 78
tests/test_markdown_validation.py 43 34 75
tests/test_shell_issue729.py 50 52 75
tests/test_util_output_storage.py 18 10 75
tests/test_custom_providers.py 32 44 74
tests/test_shell_issue772.py 48 47 73
tests/test_chat_config.py 24 19 72
tests/test_hooks_form_autodetect.py 22 34 68
tests/test_tools_form.py 22 19 67
tests/test_shell_output_mixing_issue408.py 25 29 60
tests/test_server_client.py 33 26 59
tests/test_chat_history.py 14 12 56
tests/test_tools_chats.py 16 13 51
tests/test_server_v2_sse.py 15 13 50
tests/test_dspy_gepa.py 18 9 46
tests/test_demo_capture.py 19 9 45
tests/test_util_generate_name.py 17 10 45
tests/test-integration.sh 22 36 43
tests/test_pdf_to_images.py 13 13 43
tests/test_onboard.py 11 10 41
tests/test_xml_format.py 19 68 41
tests/test_shell_fd_leak.py 23 16 39
tests/test_utils.py 14 17 38
tests/test_util_export.py 20 11 36
tests/test_message_command.py 13 12 35
tests/test_cli_confirm_hook.py 24 20 34
tests/test_tools_rag.py 15 8 34
tests/test_shell_for_loop_issue724.py 16 24 33
tests/test_telemetry.py 20 15 28
tests/test_quota_skip.py 5 3 26
tests/data/example-patch-codeblock.txt 4 0 25
tests/data/example-interrupted.txt 8 0 24
tests/test_tool_loading_duplicate.py 16 15 24
tests/test_setup_completions.py 9 6 22
tests/test_tools_shell_multiline.py 7 19 19
tests/test_browser_format.py 8 6 18
tests/test_screenshot.py 9 6 15
-----------------------------------------------------------------------------------------------
SUM: 14731 10434 47989
-----------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC Eval#
$ make cloc-eval
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/eval/**.py --by-file --hide-rate --quiet | tail -n +2
---------------------------------------------------------------------------------------
File blank comment code
---------------------------------------------------------------------------------------
gptme/eval/main.py 95 103 759
gptme/eval/execenv.py 83 135 506
gptme/eval/leaderboard.py 60 135 430
gptme/eval/run.py 58 60 402
gptme/eval/trends.py 59 31 317
gptme/eval/types.py 26 26 74
gptme/eval/filestore.py 11 8 63
gptme/eval/cost.py 12 24 6
gptme/eval/__init__.py 2 2 4
gptme/eval/__main__.py 1 0 3
---------------------------------------------------------------------------------------
SUM: 407 524 2564
---------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
LoC Total#
$ make cloc-total
make[2]: Entering directory '/home/runner/work/gptme/gptme'
cloc gptme/session.py gptme/executor.py gptme/__init__.py gptme/context/compress.py gptme/context/__init__.py gptme/context/task_analyzer.py gptme/context/selector/__init__.py gptme/context/selector/file_integration.py gptme/context/selector/llm_based.py gptme/context/selector/file_selector.py gptme/context/selector/base.py gptme/context/selector/rule_based.py gptme/context/selector/config.py gptme/context/selector/file_config.py gptme/context/selector/hybrid.py gptme/context/adaptive_compressor.py gptme/context/config.py gptme/cli/setup.py gptme/cli/main.py gptme/cli/__init__.py gptme/cli/cmd_mcp.py gptme/cli/util.py gptme/cli/onboard.py gptme/cli/auth.py gptme/cli/doctor.py gptme/cli/cmd_skills.py gptme/cli/wut.py gptme/cli/cmd_chats.py gptme/constants.py gptme/profiles.py gptme/message.py gptme/mcp/__init__.py gptme/mcp/client.py gptme/mcp/registry.py gptme/codeblock.py gptme/__main__.py gptme/prompts/context_cmd.py gptme/prompts/__init__.py gptme/prompts/templates.py gptme/prompts/workspace.py gptme/prompts/chat_history.py gptme/prompts/skills.py gptme/info.py gptme/init.py gptme/eval/main.py gptme/eval/__init__.py gptme/eval/cost.py gptme/eval/__main__.py gptme/eval/execenv.py gptme/eval/trends.py gptme/eval/types.py gptme/eval/dspy/experiments.py gptme/eval/dspy/__init__.py gptme/eval/dspy/prompt_optimizer.py gptme/eval/dspy/metrics.py gptme/eval/dspy/cli.py gptme/eval/dspy/tasks.py gptme/eval/dspy/__main__.py gptme/eval/dspy/signatures.py gptme/eval/dspy/hybrid_optimizer.py gptme/eval/filestore.py gptme/eval/run.py gptme/eval/leaderboard.py gptme/eval/suites/__init__.py gptme/eval/suites/practical5.py gptme/eval/suites/practical3.py gptme/eval/suites/practical12.py gptme/eval/suites/practical11.py gptme/eval/suites/init_projects.py gptme/eval/suites/practical4.py gptme/eval/suites/practical9.py gptme/eval/suites/browser.py gptme/eval/suites/practical7.py gptme/eval/suites/practical10.py gptme/eval/suites/practical13.py gptme/eval/suites/practical6.py gptme/eval/suites/practical.py gptme/eval/suites/practical14.py gptme/eval/suites/practical2.py gptme/eval/suites/practical8.py gptme/eval/suites/basic.py gptme/eval/agents/__init__.py gptme/eval/agents/claude_code.py gptme/eval/agents/swebench.py gptme/eval/swebench/main.py gptme/eval/swebench/__init__.py gptme/eval/swebench/utils.py gptme/eval/swebench/__main__.py gptme/eval/swebench/info.py gptme/eval/swebench/evaluate.py gptme/eval/swe_extra/swe_bench_extra_data.py gptme/eval/swe_extra/__init__.py gptme/eval/swe_extra/swe_bench_constants.py gptme/eval/swe_extra/swe_bench_test_spec.py gptme/eval/swe_extra/run_swe_extra.py gptme/eval/tbench/__init__.py gptme/eval/tbench/agent.py gptme/eval/tbench/run.py gptme/telemetry.py gptme/llm/llm_openai.py gptme/llm/llm_openai_models_deprecated.py gptme/llm/__init__.py gptme/llm/constants.py gptme/llm/llm_openai_subscription.py gptme/llm/utils.py gptme/llm/llm_anthropic.py gptme/llm/validate.py gptme/llm/provider_plugins.py gptme/llm/llm_openai_models.py gptme/llm/models/__init__.py gptme/llm/models/resolution.py gptme/llm/models/types.py gptme/llm/models/data.py gptme/llm/models/listing.py gptme/llm/llm_anthropic_models_deprecated.py gptme/llm/llm_gptme.py gptme/acp/__init__.py gptme/acp/agent.py gptme/acp/__main__.py gptme/acp/types.py gptme/acp/client.py gptme/acp/adapter.py gptme/config/__init__.py gptme/config/core.py gptme/config/cli_setup.py gptme/config/models.py gptme/config/project.py gptme/config/user.py gptme/config/chat.py gptme/plugins/__init__.py gptme/plugins/plugin.py gptme/plugins/entrypoints.py gptme/plugins/registry.py gptme/hooks/workspace_agents.py gptme/hooks/__init__.py gptme/hooks/cache_awareness.py gptme/hooks/elicitation.py gptme/hooks/types.py gptme/hooks/test.py gptme/hooks/agents_md_inject.py gptme/hooks/server_elicit.py gptme/hooks/token_awareness.py gptme/hooks/cwd_awareness.py gptme/hooks/cost_awareness.py gptme/hooks/confirm.py gptme/hooks/cwd_changed.py gptme/hooks/server_confirm.py gptme/hooks/form_autodetect.py gptme/hooks/markdown_validation.py gptme/hooks/tests/test_elicitation.py gptme/hooks/tests/__init__.py gptme/hooks/tests/test_confirm.py gptme/hooks/tests/test_active_context.py gptme/hooks/tests/test_markdown_validation.py gptme/hooks/tests/test_cost_awareness.py gptme/hooks/tests/test_workspace_agents.py gptme/hooks/tests/test_agents_md_inject.py gptme/hooks/tests/test_cache_awareness.py gptme/hooks/tests/test_token_awareness.py gptme/hooks/tests/test_form_autodetect.py gptme/hooks/tests/test_server_confirm.py gptme/hooks/tests/test_cli_confirm.py gptme/hooks/tests/test_time_awareness.py gptme/hooks/tests/test_auto_confirm.py gptme/hooks/tests/test_server_elicit.py gptme/hooks/tests/test_cwd_awareness.py gptme/hooks/active_context.py gptme/hooks/registry.py gptme/hooks/cli_confirm.py gptme/hooks/time_awareness.py gptme/hooks/auto_confirm.py gptme/agent/__init__.py gptme/agent/cli.py gptme/agent/workspace.py gptme/agent/doctor.py gptme/agent/service.py gptme/tools/mcp.py gptme/tools/__init__.py gptme/tools/shell_background.py gptme/tools/rag.py gptme/tools/autocompact/decision.py gptme/tools/autocompact/__init__.py gptme/tools/autocompact/hook.py gptme/tools/autocompact/scoring.py gptme/tools/autocompact/handlers.py gptme/tools/autocompact/engine.py gptme/tools/autocompact/resume.py gptme/tools/computer.py gptme/tools/autocommit.py gptme/tools/shell.py gptme/tools/browser.py gptme/tools/_browser_lynx.py gptme/tools/morph.py gptme/tools/read.py gptme/tools/_browser_playwright.py gptme/tools/complete.py gptme/tools/precommit.py gptme/tools/gh.py gptme/tools/_browser_thread.py gptme/tools/mcp_adapter.py gptme/tools/chats.py gptme/tools/screenshot.py gptme/tools/elicit.py gptme/tools/todo.py gptme/tools/shell_validation.py gptme/tools/choice.py gptme/tools/_browser_format.py gptme/tools/tmux.py gptme/tools/python.py gptme/tools/subagent/__init__.py gptme/tools/subagent/batch.py gptme/tools/subagent/api.py gptme/tools/subagent/types.py gptme/tools/subagent/execution.py gptme/tools/subagent/hooks.py gptme/tools/base.py gptme/tools/save.py gptme/tools/lessons.py gptme/tools/vision.py gptme/tools/form.py gptme/tools/restart.py gptme/tools/patch.py gptme/tools/_browser_perplexity.py gptme/dirs.py gptme/__version__.py gptme/server/__init__.py gptme/server/api_v2_common.py gptme/server/constants.py gptme/server/session_step.py gptme/server/cli.py gptme/server/__main__.py gptme/server/auth.py gptme/server/openapi_docs.py gptme/server/workspace_api.py gptme/server/tasks_api.py gptme/server/acp_session_runtime.py gptme/server/client.py gptme/server/app.py gptme/server/api_v2_agents.py gptme/server/session_models.py gptme/server/api_v2_sessions.py gptme/server/api_v2.py gptme/util/clipboard.py gptme/util/__init__.py gptme/util/export.py gptme/util/useredit.py gptme/util/sound.py gptme/util/cost.py gptme/util/output_storage.py gptme/util/prompt.py gptme/util/_sound_cmd.py gptme/util/git_worktree.py gptme/util/_sound_sounddevice.py gptme/util/gh.py gptme/util/content.py gptme/util/tree.py gptme/util/auto_naming.py gptme/util/context_dedup.py gptme/util/interrupt.py gptme/util/tokens.py gptme/util/file_storage.py gptme/util/tool_format.py gptme/util/cost_display.py gptme/util/reduce.py gptme/util/terminal.py gptme/util/context.py gptme/util/master_context.py gptme/util/_telemetry.py gptme/util/uri.py gptme/util/cost_tracker.py gptme/util/keyword_matching.py gptme/util/generate_name.py gptme/util/ask_execute.py gptme/util/install.py gptme/lessons/matcher.py gptme/lessons/__init__.py gptme/lessons/parser.py gptme/lessons/auto_include.py gptme/lessons/commands.py gptme/lessons/installer.py gptme/lessons/skills/python-repl/python_helpers.py gptme/lessons/hybrid_matcher.py gptme/lessons/index.py gptme/commands/session.py gptme/commands/__init__.py gptme/commands/export.py gptme/commands/meta.py gptme/commands/base.py gptme/commands/llm.py gptme/logmanager/__init__.py gptme/logmanager/manager.py gptme/logmanager/conversations.py gptme/chat.py tests/test_util_context_dedup.py tests/test_server_v2_hooks.py tests/test_hooks_form_autodetect.py tests/test_tools_read.py tests/test_tools_rag.py tests/test_eval.py tests/test_context.py tests/test_llm_openai_subscription.py tests/test_uri.py tests/test_tools_lessons.py tests/test_util_terminal.py tests/test_tools_time_awareness.py tests/test_tools_shell_validation.py tests/test_acp_protocol_logging.py tests/test_shell_fd_leak.py tests/context/test_task_analyzer.py tests/context/test_adaptive_compressor.py tests/test_custom_providers.py tests/test_chats_export.py tests/test_tools_shell.py tests/test_tools_mcp.py tests/test_util_cli_skills.py tests/test_chats_clean.py tests/test_tools_complete.py tests/test_tools_shell_multiline.py tests/test_prompt.py tests/test_util_tree.py tests/conftest.py tests/test_llm_anthropic.py tests/test_eval_leaderboard.py tests/test_prompt_tools.py tests/test_xml_format.py tests/test_server_v2.py tests/test_chat_config.py tests/test_chats_stats.py tests/test_shell_for_loop_issue724.py tests/test_util_cli_providers.py tests/test_tool_use.py tests/test_skill_installer.py tests/test_lessons_tool.py tests/test_active_context.py tests/test_telemetry.py tests/test_dspy_basic.py tests/test_lessons_status.py tests/test_shell_issue772.py tests/test_util_content.py tests/test_autocompact_scoring.py tests/test_shell_issue729.py tests/test_lessons.py tests/test_workspace_api.py tests/test_codeblock.py tests/test_server.py tests/test_util_tokens.py tests/test_config.py tests/test_markdown_validation.py tests/test_onboard.py tests/test_conversations.py tests/test_message.py tests/test_tools_morph.py tests/test_util_export.py tests/test_shell_background.py tests/test_init.py tests/test_quota_skip.py tests/test_workspace_agents.py tests/test_tools_shell_background.py tests/test_info.py tests/test_chat.py tests/test_subagent_unit.py tests/test_tools_vision.py tests/test_agents_md_inject.py tests/test_tools_browser_thread.py tests/test_provider_plugins.py tests/test_server_v2_auto_stepping.py tests/test_context_selector.py tests/test_prompt_templates.py tests/test_plugins.py tests/test_hooks.py tests/test_browser_lynx.py tests/test_auto_compact.py tests/test_tools_choice.py tests/test_util_generate_name.py tests/test_chat_history.py tests/test_complete.py tests/test_unified_plugins.py tests/test_tasks_api.py tests/test_util_keyword_matching.py tests/test_dirs.py tests/test_tools_save.py tests/test_tree.py tests/test_tools_chats.py tests/test_message_command.py tests/test_pdf_to_images.py tests/test_setup_completions.py tests/test_server_v2_sse.py tests/test_lessons_matcher.py tests/test_util_install.py tests/test_gptme_provider.py tests/test_tools_base.py tests/test_server_client.py tests/test_agent.py tests/test_acp_types.py tests/test_agent_doctor.py tests/test_shell_allowlist_autoconfirm.py tests/test_mcp_adapter.py tests/test_cost_display.py tests/test_hooks_registry.py tests/test_util_tool_format.py tests/test_server_elicitation.py tests/test_tools_python.py tests/test_session.py tests/test_tools_browser.py tests/test_tools_token_awareness.py tests/test_tools_restart.py tests/test_server_v2_tool_confirmation.py tests/test_llm_models.py tests/test_tools.py tests/test_util_gh.py tests/test_prompts.py tests/test_tool_loading_duplicate.py tests/test_command_completion.py tests/test_browser.py tests/test_llm_utils.py tests/test_dspy_hybrid.py tests/test_lessons_integration.py tests/test_prompt_skills_summary.py tests/test_auto_naming.py tests/test_acp_client.py tests/test_browser_github_routing.py tests/test_tools_todo.py tests/test_util_output_storage.py tests/test_profiles.py tests/test_tools_elicit.py tests/test_tools_precommit.py tests/test_hooks_cwd_changed.py tests/test_server_workspace.py tests/test_acp_adapter.py tests/test_logmanager.py tests/test_integration_phase4.py tests/test_lessons_parser.py tests/test_tools_patch.py tests/test_mcp_discovery.py tests/test_screenshot.py tests/test_shell_output_mixing_issue408.py tests/test_utils.py tests/test_tools_form.py tests/test_execenv.py tests/test_eval_claude_code.py tests/test_tools_gh.py tests/test_reduce.py tests/test_util_interrupt.py tests/test_util_cost.py tests/test_git_worktree.py tests/test_tools_subagent.py tests/test_cost_tracker.py tests/lessons/test_wildcard_matching.py tests/test_llm_auth.py tests/test_cli_confirm_hook.py tests/test_server_auth.py tests/test_acp_agent.py tests/test_util_cli.py tests/test_util.py tests/test_llm_validate.py tests/test_tools_computer.py tests/test_llm_openai.py tests/test_browser_format.py tests/test_tools_tmux.py tests/test_dspy_gepa.py tests/test_lessons_index.py tests/test_util_gh_mocked.py tests/test_cli.py tests/test_hybrid_lessons.py tests/test_util_clipboard_paste.py tests/test_master_context.py tests/test_util_file_storage.py tests/test_demo_capture.py tests/test_chats_json.py tests/test_commands.py tests/test_dspy_integration.py tests/test_tools_autocommit.py tests/test_agent_memory.py tests/test_lessons_commands.py tests/test_executor.py tests/test_doctor.py tests/test_chats_rename.py tests/test_eval_trends.py tests/test_file_selector_integration.py tests/test_acp_stdout.py tests/test_acp_session_runtime.py tests/test_tools_screenshot.py tests/test_cwe214_docker_env_leak.py tests/test_cost_awareness_delayed_warning.py tests/test_util_cli_mcp.py tests/test_mcp.py scripts/auto_rename_logs.py scripts/eval_trends.py scripts/analyze_compression.py scripts/demo_capture.py scripts/train/collect.py scripts/eval_leaderboard.py scripts/github_bot.py scripts/check_rst_formatting.py --by-file --hide-rate --quiet | tail -n +2
-----------------------------------------------------------------------------------------------------
File blank comment code
-----------------------------------------------------------------------------------------------------
tests/test_init.py 207 109 1131
tests/test_llm_openai.py 309 176 1108
gptme/util/gh.py 217 245 1103
gptme/tools/shell.py 195 300 1092
tests/test_acp_agent.py 321 184 1074
gptme/acp/agent.py 181 294 983
tests/test_util_gh.py 211 107 966
gptme/llm/llm_openai.py 222 232 940
tests/test_tools_subagent.py 308 161 907
tests/test_info.py 167 73 878
tests/test_util_gh_mocked.py 149 119 777
gptme/eval/main.py 95 103 759
tests/test_tools_shell.py 251 397 729
gptme/llm/llm_anthropic.py 153 193 717
gptme/eval/suites/basic.py 138 55 715
tests/test_tools_browser.py 232 52 697
tests/test_tools_gh.py 134 69 675
tests/test_agent.py 199 110 665
tests/test_hooks_registry.py 238 89 640
gptme/eval/dspy/tasks.py 170 374 639
gptme/cli/doctor.py 102 76 627
gptme/hooks/workspace_agents.py 147 102 616
gptme/tools/mcp_adapter.py 206 210 610
gptme/server/session_step.py 143 172 605
gptme/cli/main.py 93 92 599
gptme/server/tasks_api.py 171 110 596
tests/test_acp_session_runtime.py 206 67 596
tests/test_config.py 161 284 585
tests/test_tools_precommit.py 109 86 578
gptme/cli/setup.py 134 67 573
gptme/tools/base.py 138 178 573
gptme/tools/browser.py 190 263 568
tests/test_tasks_api.py 140 49 563
tests/test_server_workspace.py 118 120 561
tests/test_eval_leaderboard.py 66 52 557
gptme/cli/util.py 149 88 552
tests/test_prompt_templates.py 206 140 551
tests/test_auto_compact.py 227 189 543
tests/test_llm_utils.py 159 101 538
gptme/util/context.py 136 192 528
gptme/llm/llm_openai_subscription.py 136 116 523
gptme/server/api_v2.py 119 88 519
gptme/tools/_browser_playwright.py 140 105 517
tests/test_lessons.py 156 151 516
gptme/eval/execenv.py 83 135 506
tests/test_tools_lessons.py 125 42 502
gptme/tools/gh.py 116 126 500
gptme/server/openapi_docs.py 183 142 496
gptme/lessons/installer.py 146 165 495
tests/test_doctor.py 142 90 486
gptme/logmanager/manager.py 114 139 482
tests/test_llm_auth.py 169 56 476
tests/test_skill_installer.py 138 154 459
tests/test_tools_shell_background.py 117 51 456
gptme/tools/computer.py 155 223 450
scripts/analyze_compression.py 103 68 446
scripts/demo_capture.py 104 83 445
gptme/eval/leaderboard.py 60 135 430
tests/test_tools_base.py 147 51 428
tests/test_lessons_commands.py 157 82 422
tests/test_dirs.py 97 69 421
gptme/eval/dspy/prompt_optimizer.py 109 89 420
gptme/llm/__init__.py 85 120 418
gptme/util/prompt.py 103 151 410
scripts/github_bot.py 84 79 409
tests/test_codeblock.py 283 717 404
gptme/eval/run.py 58 60 402
tests/test_tools_shell_validation.py 161 63 399
gptme/server/api_v2_sessions.py 82 84 398
tests/test_tools_mcp.py 102 20 398
tests/test_tools_computer.py 159 93 397
gptme/chat.py 68 92 395
tests/context/test_task_analyzer.py 119 58 389
gptme/agent/doctor.py 89 43 387
gptme/hooks/registry.py 88 78 381
tests/test_util_cli_mcp.py 89 45 380
gptme/agent/service.py 108 103 379
gptme/tools/chats.py 85 97 371
gptme/agent/cli.py 105 125 369
gptme/hooks/tests/test_workspace_agents.py 102 36 369
gptme/tools/subagent/api.py 63 113 368
tests/test_lessons_parser.py 162 188 365
gptme/eval/dspy/cli.py 73 57 364
gptme/util/_telemetry.py 106 123 357
tests/test_profiles.py 84 30 354
tests/test_llm_anthropic.py 64 28 352
gptme/eval/dspy/experiments.py 94 60 350
gptme/tools/tmux.py 95 171 346
gptme/eval/dspy/metrics.py 97 98 345
gptme/hooks/tests/test_elicitation.py 91 45 343
gptme/message.py 85 116 343
gptme/telemetry.py 85 54 342
tests/test_shell_background.py 99 71 342
tests/test_cli.py 95 71 341
tests/test_unified_plugins.py 94 38 341
tests/test_commands.py 120 59 340
gptme/tools/mcp.py 102 102 337
gptme/llm/models/data.py 3 28 336
tests/test_eval_trends.py 35 22 335
tests/test_util_cli.py 87 52 333
tests/test_provider_plugins.py 90 32 331
tests/test_lessons_index.py 113 97 329
gptme/eval/suites/practical.py 35 30 326
gptme/agent/workspace.py 120 206 324
tests/test_message.py 119 110 323
tests/test_util_tool_format.py 78 32 322
tests/conftest.py 89 89 320
gptme/server/workspace_api.py 86 76 318
tests/test_agent_doctor.py 72 34 318
gptme/eval/trends.py 59 31 317
tests/test_mcp_discovery.py 97 39 315
tests/test_tools_morph.py 89 66 310
gptme/hooks/tests/test_confirm.py 100 59 309
gptme/tools/subagent/execution.py 87 117 308
gptme/mcp/client.py 93 104 300
tests/test_context.py 130 79 297
tests/test_workspace_agents.py 137 57 296
gptme/info.py 85 70 294
tests/test_lessons_matcher.py 89 80 288
tests/lessons/test_wildcard_matching.py 114 125 287
tests/test_mcp_adapter.py 95 52 286
tests/test_eval.py 54 60 285
tests/test_server.py 106 71 283
gptme/eval/dspy/hybrid_optimizer.py 141 345 282
tests/test_workspace_api.py 79 17 280
gptme/tools/save.py 61 60 274
tests/test_tools_restart.py 72 49 274
gptme/tools/__init__.py 89 71 273
gptme/tools/shell_validation.py 88 121 273
tests/test_tools_complete.py 78 77 271
gptme/tools/shell_background.py 65 36 270
tests/test_execenv.py 70 51 268
gptme/cli/cmd_chats.py 63 35 267
gptme/eval/swe_extra/swe_bench_test_spec.py 52 29 267
gptme/acp/client.py 66 121 266
tests/test_hybrid_lessons.py 71 32 263
tests/test_tools.py 113 59 259
gptme/tools/patch.py 62 95 258
tests/test_tools_autocommit.py 98 47 258
gptme/plugins/__init__.py 85 119 256
tests/test_context_selector.py 83 45 254
gptme/hooks/tests/test_form_autodetect.py 73 25 253
tests/test_eval_claude_code.py 66 27 253
gptme/cli/cmd_skills.py 71 35 252
gptme/llm/models/listing.py 62 56 252
tests/test_chat.py 122 142 252
tests/test_lessons_integration.py 97 66 252
tests/test_util_cli_providers.py 60 27 250
tests/test_prompt_tools.py 57 30 249
gptme/llm/models/resolution.py 59 64 248
tests/test_llm_models.py 87 63 248
gptme/tools/lessons.py 91 105 247
tests/test_tools_browser_thread.py 69 38 245
tests/test_agents_md_inject.py 43 37 241
tests/test_complete.py 56 40 241
tests/test_cost_display.py 27 20 241
gptme/context/task_analyzer.py 100 124 237
gptme/tools/python.py 74 90 237
tests/test_server_v2.py 71 40 235
gptme/commands/meta.py 54 20 234
gptme/context/adaptive_compressor.py 76 130 232
gptme/tools/todo.py 95 109 232
tests/test_auto_naming.py 69 45 232
tests/test_hooks.py 114 46 232
gptme/lessons/index.py 93 136 229
gptme/hooks/tests/test_cost_awareness.py 49 37 227
gptme/tools/precommit.py 70 97 226
gptme/hooks/tests/test_token_awareness.py 37 28 224
gptme/prompts/__init__.py 48 86 224
gptme/util/auto_naming.py 68 78 224
gptme/codeblock.py 37 142 221
gptme/eval/suites/practical6.py 56 46 221
tests/test_browser.py 96 53 221
gptme/commands/llm.py 53 51 220
gptme/hooks/tests/test_cli_confirm.py 75 23 218
tests/test_util_keyword_matching.py 75 46 218
gptme/profiles.py 64 67 217
gptme/mcp/registry.py 59 70 216
gptme/prompts/workspace.py 37 56 216
tests/test_lessons_tool.py 62 34 216
gptme/lessons/hybrid_matcher.py 84 113 214
tests/test_mcp.py 59 45 214
gptme/eval/swe_extra/swe_bench_extra_data.py 69 51 213
gptme/hooks/elicitation.py 90 132 213
gptme/lessons/commands.py 91 48 213
tests/test_autocompact_scoring.py 86 39 208
gptme/lessons/parser.py 73 114 206
tests/test_executor.py 50 31 206
gptme/util/_sound_sounddevice.py 52 46 204
tests/test_plugins.py 82 70 203
tests/test_tools_screenshot.py 55 48 203
tests/test_util_file_storage.py 51 36 203
gptme/cli/auth.py 47 28 202
gptme/tools/autocompact/engine.py 41 58 202
tests/test_chats_json.py 30 17 202
gptme/eval/suites/practical7.py 57 81 201
gptme/util/sound.py 65 72 200
tests/test_tool_use.py 38 43 200
tests/test_subagent_unit.py 45 20 199
gptme/hooks/tests/test_active_context.py 37 29 198
gptme/config/chat.py 41 46 196
gptme/hooks/tests/test_server_elicit.py 58 23 196
gptme/prompts/templates.py 52 87 195
gptme/config/models.py 67 58 194
gptme/llm/llm_openai_models.py 6 25 193
tests/test_tools_save.py 57 36 193
gptme/logmanager/conversations.py 41 56 192
gptme/eval/suites/practical8.py 68 62 191
tests/test_chats_clean.py 46 18 191
gptme/cli/onboard.py 61 52 188
gptme/hooks/__init__.py 20 42 188
tests/test_logmanager.py 56 50 188
gptme/eval/suites/practical14.py 64 52 185
gptme/tools/morph.py 43 47 185
tests/test_chats_stats.py 63 27 184
tests/test_prompts.py 59 43 184
gptme/eval/agents/claude_code.py 41 33 182
gptme/hooks/tests/test_server_confirm.py 48 29 179
tests/test_dspy_hybrid.py 65 45 179
gptme/tools/autocompact/resume.py 50 74 178
gptme/context/selector/file_selector.py 50 61 177
tests/test_dspy_basic.py 66 44 177
gptme/eval/suites/practical4.py 47 24 176
tests/test_hooks_cwd_changed.py 55 24 176
tests/test_server_v2_hooks.py 71 52 175
tests/test_tools_todo.py 81 65 173
tests/test_chats_export.py 48 17 172
gptme/eval/suites/practical10.py 55 65 171
gptme/hooks/tests/test_agents_md_inject.py 31 19 171
tests/test_acp_types.py 35 12 171
gptme/commands/session.py 58 47 170
gptme/llm/validate.py 30 28 170
tests/test_util_terminal.py 52 34 168
tests/test_tools_elicit.py 50 25 167
tests/test_tree.py 59 37 167
gptme/config/user.py 51 46 164
gptme/eval/suites/practical2.py 46 18 164
gptme/server/acp_session_runtime.py 34 30 161
gptme/server/auth.py 57 80 160
tests/test_acp_protocol_logging.py 56 15 160
tests/test_acp_client.py 64 34 159
gptme/eval/suites/practical3.py 27 19 158
tests/test_acp_stdout.py 76 37 158
tests/test_uri.py 55 30 158
gptme/tools/_browser_thread.py 27 12 156
tests/test_tools_patch.py 85 203 156
gptme/tools/subagent/__init__.py 31 134 155
gptme/util/__init__.py 34 29 155
tests/test_tools_time_awareness.py 52 34 155
tests/test_cost_tracker.py 21 24 154
tests/test_shell_allowlist_autoconfirm.py 38 38 154
tests/test_tools_tmux.py 69 63 154
gptme/llm/utils.py 54 73 153
gptme/hooks/cli_confirm.py 50 54 152
gptme/tools/autocompact/scoring.py 53 89 152
gptme/eval/suites/practical9.py 69 76 151
gptme/llm/llm_openai_models_deprecated.py 5 13 151
gptme/util/tool_format.py 48 75 151
tests/test_util_cli_skills.py 59 41 151
tests/test_util_tree.py 44 33 151
gptme/eval/agents/swebench.py 26 22 150
gptme/tools/restart.py 51 81 150
gptme/acp/__main__.py 58 70 149
gptme/util/cost_display.py 39 31 148
tests/test_util_install.py 34 31 148
gptme/util/reduce.py 45 42 147
scripts/check_rst_formatting.py 41 52 147
tests/test_master_context.py 39 24 147
gptme/tools/rag.py 62 74 146
gptme/tools/form.py 38 55 145
tests/test_file_selector_integration.py 50 23 145
gptme/tools/read.py 32 25 144
gptme/server/client.py 60 78 143
tests/test_gptme_provider.py 66 20 143
tests/test_util_tokens.py 72 35 143
gptme/hooks/token_awareness.py 44 50 142
gptme/cli/cmd_mcp.py 41 14 140
gptme/eval/agents/__init__.py 23 12 139
gptme/hooks/types.py 74 111 139
tests/test_dspy_integration.py 54 32 139
gptme/eval/suites/practical5.py 67 80 138
tests/test_tools_vision.py 36 31 138
tests/test_server_elicitation.py 47 17 137
tests/test_util_content.py 49 25 137
gptme/tools/elicit.py 36 109 135
gptme/hooks/cost_awareness.py 45 56 133
gptme/init.py 33 32 133
gptme/server/cli.py 26 13 133
gptme/hooks/cache_awareness.py 95 138 128
tests/test_acp_adapter.py 42 33 128
tests/test_conversations.py 19 10 128
tests/test_cwe214_docker_env_leak.py 42 41 128
gptme/hooks/tests/test_markdown_validation.py 29 21 127
gptme/llm/llm_gptme.py 47 58 127
gptme/commands/base.py 54 58 126
gptme/config/cli_setup.py 22 38 126
tests/test_active_context.py 41 22 126
tests/test_tools_token_awareness.py 59 47 126
gptme/hooks/tests/test_cache_awareness.py 47 34 125
gptme/tools/complete.py 34 45 125
tests/test_util_context_dedup.py 61 43 125
gptme/hooks/form_autodetect.py 48 65 123
gptme/commands/export.py 31 21 122
gptme/eval/suites/practical11.py 53 26 122
gptme/eval/suites/practical12.py 56 49 122
gptme/hooks/server_confirm.py 51 58 122
tests/test_util_interrupt.py 48 38 121
gptme/config/core.py 39 31 120
tests/test_prompt.py 36 36 120
tests/test_integration_phase4.py 22 19 119
gptme/util/clipboard.py 22 12 118
tests/test_llm_openai_subscription.py 32 10 118
tests/test_util_clipboard_paste.py 27 14 117
gptme/server/session_models.py 38 41 116
gptme/tools/autocompact/hook.py 40 48 116
gptme/plugins/registry.py 40 32 115
scripts/auto_rename_logs.py 34 23 115
tests/test_tools_python.py 50 16 114
gptme/hooks/server_elicit.py 52 56 113
tests/test_lessons_status.py 67 96 113
tests/test_reduce.py 30 22 113
tests/test_chats_rename.py 42 17 112
gptme/llm/models/types.py 47 54 111
gptme/util/export.py 26 29 111
gptme/eval/swebench/evaluate.py 25 7 110
gptme/hooks/confirm.py 53 88 109
gptme/hooks/tests/test_time_awareness.py 36 11 109
gptme/util/cost_tracker.py 43 62 109
tests/test_cost_awareness_delayed_warning.py 42 32 108
tests/test_server_v2_tool_confirmation.py 32 32 107
gptme/eval/suites/practical13.py 47 47 105
gptme/tools/choice.py 31 37 105
scripts/train/collect.py 35 52 104
tests/test_util_cost.py 21 19 103
gptme/dirs.py 42 31 102
gptme/lessons/matcher.py 35 47 102
gptme/server/api_v2_common.py 64 44 102
tests/test_git_worktree.py 31 19 102
tests/test_llm_validate.py 25 19 102
gptme/hooks/active_context.py 25 23 100
tests/test_command_completion.py 33 23 100
tests/test_tools_read.py 30 14 98
tests/test_session.py 40 21 95
gptme/tools/subagent/types.py 36 46 93
gptme/prompts/chat_history.py 34 27 91
tests/test_tools_choice.py 47 24 91
gptme/acp/types.py 25 13 90
tests/test_agent_memory.py 26 17 90
tests/test_browser_lynx.py 35 15 90
gptme/server/api_v2_agents.py 24 15 89
gptme/util/ask_execute.py 25 40 89
gptme/util/tree.py 21 15 87
tests/test_server_v2_auto_stepping.py 20 22 87
gptme/tools/autocompact/decision.py 34 48 86
tests/test_browser_github_routing.py 27 0 86
gptme/hooks/time_awareness.py 29 31 84
tests/test_server_auth.py 40 19 84
gptme/commands/__init__.py 15 21 83
gptme/util/git_worktree.py 25 33 83
tests/context/test_adaptive_compressor.py 35 23 83
gptme/eval/tbench/run.py 16 12 81
gptme/eval/swebench/main.py 13 4 80
gptme/eval/swebench/utils.py 19 0 80
tests/test_prompt_skills_summary.py 44 44 80
gptme/eval/swe_extra/run_swe_extra.py 16 14 79
gptme/lessons/auto_include.py 31 27 78
tests/test_util.py 42 85 78
gptme/context/compress.py 63 131 76
gptme/tools/autocommit.py 37 58 75
tests/test_markdown_validation.py 43 34 75
tests/test_shell_issue729.py 50 52 75
tests/test_util_output_storage.py 18 10 75
gptme/eval/types.py 26 26 74
gptme/hooks/tests/test_cwd_awareness.py 13 12 74
tests/test_custom_providers.py 32 44 74
tests/test_shell_issue772.py 48 47 73
tests/test_chat_config.py 24 19 72
gptme/llm/llm_anthropic_models_deprecated.py 5 11 70
gptme/session.py 39 64 70
gptme/config/project.py 23 28 69
gptme/context/selector/llm_based.py 32 38 69
gptme/tools/screenshot.py 25 29 69
gptme/util/generate_name.py 5 6 69
tests/test_hooks_form_autodetect.py 22 34 68
gptme/prompts/context_cmd.py 11 9 67
tests/test_tools_form.py 22 19 67
gptme/eval/swe_extra/swe_bench_constants.py 9 9 66
gptme/util/master_context.py 28 38 66
gptme/eval/tbench/agent.py 20 24 65
gptme/__version__.py 15 11 64
gptme/config/__init__.py 6 15 63
gptme/eval/filestore.py 11 8 63
gptme/lessons/skills/python-repl/python_helpers.py 28 26 63
gptme/eval/suites/__init__.py 22 18 62
gptme/eval/suites/init_projects.py 21 1 62
gptme/tools/vision.py 20 13 62
gptme/util/_sound_cmd.py 22 17 62
gptme/hooks/agents_md_inject.py 23 31 61
gptme/llm/models/__init__.py 3 12 60
gptme/tools/_browser_perplexity.py 22 16 60
gptme/util/tokens.py 20 20 60
tests/test_shell_output_mixing_issue408.py 25 29 60
gptme/context/selector/rule_based.py 20 13 59
gptme/util/uri.py 29 42 59
tests/test_server_client.py 33 26 59
gptme/prompts/skills.py 16 10 58
gptme/server/app.py 23 21 57
gptme/eval/dspy/signatures.py 19 21 56
gptme/tools/_browser_lynx.py 12 13 56
tests/test_chat_history.py 14 12 56
gptme/context/selector/file_integration.py 13 10 55
gptme/tools/autocompact/handlers.py 19 9 55
gptme/hooks/cwd_changed.py 15 11 54
gptme/util/output_storage.py 26 36 54
gptme/tools/subagent/batch.py 26 47 53
gptme/util/context_dedup.py 41 93 53
gptme/util/terminal.py 28 23 53
gptme/hooks/markdown_validation.py 36 41 51
tests/test_tools_chats.py 16 13 51
tests/test_server_v2_sse.py 15 13 50
gptme/eval/swebench/info.py 8 3 49
gptme/llm/provider_plugins.py 39 35 48
gptme/util/cost.py 12 9 47
tests/test_dspy_gepa.py 18 9 46
tests/test_demo_capture.py 19 9 45
tests/test_util_generate_name.py 17 10 45
tests/test_pdf_to_images.py 13 13 43
gptme/plugins/entrypoints.py 15 13 42
gptme/context/selector/file_config.py 10 8 41
tests/test_onboard.py 11 10 41
tests/test_xml_format.py 19 68 41
gptme/util/file_storage.py 30 47 40
gptme/context/selector/hybrid.py 14 16 39
gptme/tools/subagent/hooks.py 19 25 39
gptme/util/keyword_matching.py 35 66 39
tests/test_shell_fd_leak.py 23 16 39
tests/test_utils.py 14 17 38
gptme/tools/autocompact/__init__.py 3 12 37
gptme/logmanager/__init__.py 3 9 36
tests/test_util_export.py 20 11 36
tests/test_message_command.py 13 12 35
gptme/cli/wut.py 13 12 34
tests/test_cli_confirm_hook.py 24 20 34
tests/test_tools_rag.py 15 8 34
gptme/hooks/test.py 12 5 33
tests/test_shell_for_loop_issue724.py 16 24 33
gptme/hooks/tests/test_auto_confirm.py 12 4 32
gptme/util/install.py 13 25 30
gptme/util/content.py 18 24 29
gptme/hooks/cwd_awareness.py 11 17 28
tests/test_telemetry.py 20 15 28
gptme/util/useredit.py 11 13 26
tests/test_quota_skip.py 5 3 26
gptme/acp/adapter.py 19 22 25
gptme/constants.py 17 19 25
gptme/executor.py 18 26 24
gptme/hooks/auto_confirm.py 11 9 24
tests/test_tool_loading_duplicate.py 16 15 24
gptme/context/selector/base.py 14 23 23
gptme/util/interrupt.py 13 15 23
tests/test_setup_completions.py 9 6 22
gptme/acp/__init__.py 5 13 21
gptme/context/__init__.py 3 8 21
gptme/context/selector/config.py 8 8 21
gptme/agent/__init__.py 3 6 19
gptme/context/config.py 12 25 19
gptme/context/selector/__init__.py 6 13 19
tests/test_tools_shell_multiline.py 7 19 19
gptme/lessons/__init__.py 7 15 18
tests/test_browser_format.py 8 6 18
gptme/eval/suites/browser.py 5 0 17
gptme/plugins/plugin.py 25 39 17
gptme/eval/swebench/__init__.py 1 0 16
gptme/cli/__init__.py 10 13 15
tests/test_screenshot.py 9 6 15
gptme/mcp/__init__.py 1 0 14
gptme/__main__.py 2 0 12
gptme/eval/tbench/__init__.py 13 22 8
gptme/__init__.py 1 0 7
gptme/eval/dspy/__init__.py 6 6 7
gptme/eval/cost.py 12 24 6
scripts/eval_trends.py 2 1 5
gptme/eval/__init__.py 2 2 4
scripts/eval_leaderboard.py 2 1 4
gptme/eval/__main__.py 1 0 3
gptme/eval/dspy/__main__.py 3 5 3
gptme/eval/swebench/__main__.py 1 0 3
gptme/server/__init__.py 2 3 3
gptme/server/__main__.py 1 0 3
gptme/tools/_browser_format.py 3 5 3
gptme/llm/constants.py 1 4 1
gptme/server/constants.py 1 3 1
-----------------------------------------------------------------------------------------------------
SUM: 30283 27716 105913
-----------------------------------------------------------------------------------------------------
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
Code Metrics#
$ make metrics
make[2]: Entering directory '/home/runner/work/gptme/gptme'
=== Code Metrics Summary ===
Project Overview:
Files: 495
Total blocks: 8520
Average complexity: 3.7019953051643193
Most Complex Functions (D+):
gptme/context/selector/file_selector.py
gptme/context/selector/rule_based.py
M 27:4 RuleBasedSelector.select - D
gptme/cli/main.py
gptme/cli/cmd_skills.py
F 17:0 skills_list - D
gptme/codeblock.py
gptme/prompts/__init__.py
F 106:0 get_prompt - E
gptme/prompts/workspace.py
gptme/prompts/chat_history.py
F 20:0 prompt_chat_history - E
gptme/info.py
F 335:0 format_version_info - D
gptme/eval/main.py
gptme/eval/trends.py
F 157:0 compute_diff - D
gptme/eval/dspy/hybrid_optimizer.py
C 239:0 TaskComplexity - D
M 283:4 TaskComplexity.analyze - D
gptme/telemetry.py
F 286:0 record_llm_request - E
gptme/llm/llm_openai.py
F 206:0 init - E
F 1024:0 _transform_msgs_for_special_provider - D
F 692:0 stream - D
gptme/llm/__init__.py
F 309:0 _reply_stream - E
gptme/llm/llm_openai_subscription.py
F 582:0 stream - D
gptme/llm/llm_anthropic.py
gptme/llm/models/resolution.py
F 164:0 get_model - E
gptme/llm/models/listing.py
F 273:0 list_models - D
gptme/acp/agent.py
M 521:4 GptmeAgent.new_session - D
M 951:4 GptmeAgent.prompt - D
gptme/config/core.py
M 61:4 Config.mcp - D
gptme/config/cli_setup.py
gptme/plugins/__init__.py
F 154:0 _load_plugin - D
gptme/hooks/token_awareness.py
F 88:0 add_token_usage_warning - D
gptme/hooks/registry.py
M 112:4 HookRegistry.trigger - D
gptme/hooks/cli_confirm.py
F 162:0 _looks_like_diff - D
gptme/agent/doctor.py
F 337:0 check_lessons - E
gptme/tools/mcp.py
gptme/tools/__init__.py
F 132:0 init_tools - D
gptme/tools/shell_background.py
M 56:4 BackgroundJob._read_output - D
gptme/tools/autocompact/engine.py
gptme/tools/computer.py
F 459:0 computer - D
gptme/tools/shell.py
F 1344:0 _shorten_stdout - E
M 681:4 ShellSession._read_output_unix - E
M 522:4 ShellSession._read_output_windows - D
M 389:4 ShellSession._run_pipe - D
F 1201:0 execute_shell - D
gptme/tools/gh.py
F 526:0 execute_gh - E
F 95:0 _wait_for_checks - D
gptme/tools/chats.py
gptme/tools/tmux.py
F 374:0 execute_tmux - D
gptme/tools/subagent/api.py
F 31:0 subagent - D
gptme/tools/subagent/execution.py
F 97:0 _create_subagent_thread - D
gptme/tools/lessons.py
F 190:0 auto_include_lessons_hook - D
gptme/server/session_step.py
F 493:0 step - E
gptme/server/openapi_docs.py
F 570:0 _convert_to_openapi_nullable - D
gptme/server/tasks_api.py
F 358:0 get_git_status - D
gptme/server/api_v2_sessions.py
F 197:0 api_conversation_step - D
gptme/util/prompt.py
M 296:4 GptmeCompleter.get_completions - D
gptme/util/gh.py
F 952:0 get_github_run_logs - D
F 1132:0 search_github_issues - D
F 1236:0 search_github_prs - D
gptme/util/tool_format.py
F 104:0 format_tools_list - D
gptme/util/context.py
F 725:0 _resource_to_codeblock - E
F 446:0 include_paths - D
gptme/lessons/parser.py
F 257:0 parse_lesson - D
gptme/lessons/installer.py
F 239:0 install_skill - E
F 506:0 check_dependencies - D
gptme/lessons/index.py
M 96:4 LessonIndex._default_dirs - D
gptme/commands/meta.py
F 138:0 cmd_plugin - E
gptme/commands/llm.py
F 129:0 cmd_tools - D
gptme/logmanager/conversations.py
F 73:0 get_conversations - E
gptme/chat.py
F 278:0 _process_message_conversation - D
tests/test_config.py
F 533:0 test_project_config_loaded_from_toml - D
F 570:0 test_project_config_loaded_from_json - D
tests/test_server_v2_auto_stepping.py
F 16:0 test_auto_stepping - E
tests/test_util_cli.py
F 146:0 test_tools_list - D
F 226:0 test_models_list - D
scripts/auto_rename_logs.py
F 32:0 auto_rename_logs - D
scripts/demo_capture.py
F 485:0 main - D
scripts/check_rst_formatting.py
F 26:0 check_file - E
Largest Files (>300 SLOC):
1181 gptme/tools/shell.py
1131 tests/test_init.py
1120 gptme/util/gh.py
1111 tests/test_llm_openai.py
1074 tests/test_acp_agent.py
983 gptme/acp/agent.py
966 tests/test_util_gh.py
947 gptme/eval/dspy/tasks.py
941 gptme/llm/llm_openai.py
937 tests/test_tools_shell.py
907 tests/test_tools_subagent.py
878 tests/test_info.py
824 tests/test_codeblock.py
805 tests/test_config.py
784 tests/test_util_gh_mocked.py
761 gptme/eval/main.py
719 gptme/llm/llm_anthropic.py
715 gptme/eval/suites/basic.py
697 tests/test_tools_browser.py
675 tests/test_tools_gh.py
665 tests/test_agent.py
650 gptme/tools/browser.py
640 tests/test_hooks_registry.py
627 gptme/cli/doctor.py
626 gptme/cli/main.py
617 gptme/hooks/workspace_agents.py
611 tests/test_lessons.py
610 gptme/tools/mcp_adapter.py
605 gptme/server/session_step.py
596 tests/test_acp_session_runtime.py
596 gptme/server/tasks_api.py
582 gptme/cli/setup.py
580 tests/test_auto_compact.py
579 gptme/tools/base.py
578 tests/test_tools_precommit.py
573 tests/test_skill_installer.py
568 gptme/tools/gh.py
563 tests/test_tasks_api.py
563 tests/test_eval_leaderboard.py
561 tests/test_server_workspace.py
556 gptme/cli/util.py
551 tests/test_prompt_templates.py
546 gptme/util/context.py
545 gptme/llm/llm_openai_subscription.py
538 tests/test_llm_utils.py
532 gptme/tools/_browser_playwright.py
520 gptme/server/openapi_docs.py
520 gptme/eval/leaderboard.py
519 gptme/server/api_v2.py
518 gptme/eval/execenv.py
513 gptme/lessons/installer.py
506 gptme/tools/computer.py
502 tests/test_tools_lessons.py
486 tests/test_doctor.py
484 tests/test_lessons_parser.py
483 gptme/logmanager/manager.py
476 tests/test_llm_auth.py
456 tests/test_tools_shell_background.py
452 tests/test_tools_base.py
451 scripts/demo_capture.py
445 scripts/analyze_compression.py
433 gptme/tools/tmux.py
430 gptme/util/prompt.py
422 tests/test_lessons_commands.py
421 tests/test_dirs.py
421 gptme/eval/dspy/prompt_optimizer.py
418 scripts/github_bot.py
418 gptme/llm/__init__.py
409 tests/test_tools_computer.py
403 gptme/eval/run.py
401 gptme/server/api_v2_sessions.py
399 tests/test_tools_shell_validation.py
398 tests/test_tools_mcp.py
398 gptme/agent/service.py
395 gptme/chat.py
389 tests/context/test_task_analyzer.py
387 gptme/agent/doctor.py
381 gptme/hooks/registry.py
380 tests/test_util_cli_mcp.py
377 gptme/tools/chats.py
373 gptme/agent/workspace.py
369 gptme/hooks/tests/test_workspace_agents.py
369 gptme/agent/cli.py
368 gptme/tools/subagent/api.py
364 gptme/eval/dspy/cli.py
362 gptme/llm/models/data.py
357 gptme/util/_telemetry.py
355 gptme/eval/dspy/experiments.py
354 tests/test_profiles.py
353 tests/test_llm_anthropic.py
351 gptme/tools/mcp.py
350 tests/test_cli.py
350 gptme/message.py
350 gptme/eval/dspy/metrics.py
346 tests/lessons/test_wildcard_matching.py
343 gptme/hooks/tests/test_elicitation.py
342 tests/test_shell_background.py
342 gptme/telemetry.py
341 tests/test_unified_plugins.py
340 tests/test_commands.py
338 tests/test_lessons_index.py
336 tests/test_eval_trends.py
334 tests/test_message.py
333 tests/test_util_cli.py
331 tests/test_provider_plugins.py
327 tests/test_tools_patch.py
326 gptme/eval/suites/practical.py
322 tests/test_util_tool_format.py
320 tests/conftest.py
318 tests/test_agent_doctor.py
318 gptme/server/workspace_api.py
316 gptme/eval/trends.py
315 tests/test_mcp_discovery.py
310 tests/test_tools_morph.py
309 gptme/hooks/tests/test_confirm.py
308 tests/test_lessons_matcher.py
308 gptme/tools/subagent/execution.py
304 tests/test_eval.py
make[3]: Entering directory '/home/runner/work/gptme/gptme'
Most Duplicated Files:
npm warn exec The following package was not found and will be installed: jscpd@4.0.8
Clone found (python):
- gptme/util/_sound_sounddevice.py [92:5 - 103:67] (11 lines, 101 tokens)
gptme/util/_sound_sounddevice.py [52:5 - 63:27]
Clone found (python):
- gptme/tools/autocompact/engine.py [235:17 - 245:19] (10 lines, 92 tokens)
gptme/tools/autocompact/engine.py [185:13 - 195:16]
Clone found (python):
- gptme/tools/shell_background.py [89:9 - 97:2] (8 lines, 84 tokens)
gptme/tools/shell_background.py [71:4 - 79:16]
Clone found (python):
- gptme/tools/precommit.py [124:21 - 132:7] (8 lines, 71 tokens)
gptme/tools/precommit.py [113:7 - 122:51]
Clone found (python):
- gptme/tools/patch.py [318:5 - 332:4] (14 lines, 93 tokens)
gptme/tools/save.py [127:5 - 141:41]
Clone found (python):
- gptme/server/workspace_api.py [60:5 - 67:19] (7 lines, 94 tokens)
gptme/server/workspace_api.py [41:29 - 48:17]
Clone found (python):
- gptme/server/workspace_api.py [456:9 - 466:7] (10 lines, 102 tokens)
gptme/server/workspace_api.py [401:9 - 411:6]
Clone found (python):
- gptme/server/tasks_api.py [482:5 - 493:42] (11 lines, 79 tokens)
gptme/server/tasks_api.py [469:26 - 479:5]
Clone found (python):
- gptme/server/api_v2_sessions.py [539:5 - 549:3] (10 lines, 98 tokens)
gptme/server/api_v2_sessions.py [199:5 - 209:7]
Clone found (python):
- gptme/plugins/__init__.py [412:5 - 437:25] (25 lines, 183 tokens)
gptme/util/install.py [14:5 - 39:28]
Clone found (python):
- gptme/llm/models/listing.py [339:24 - 345:24] (6 lines, 75 tokens)
gptme/llm/models/listing.py [166:17 - 172:17]
Clone found (python):
- gptme/llm/validate.py [200:37 - 214:14] (14 lines, 99 tokens)
gptme/llm/validate.py [183:40 - 197:19]
Clone found (python):
- gptme/llm/validate.py [217:29 - 228:45] (11 lines, 93 tokens)
gptme/llm/validate.py [183:40 - 194:45]
Clone found (python):
- gptme/hooks/tests/test_time_awareness.py [130:24 - 136:3] (6 lines, 77 tokens)
gptme/hooks/tests/test_time_awareness.py [112:28 - 118:2]
Clone found (python):
- gptme/hooks/tests/test_time_awareness.py [144:23 - 150:2] (6 lines, 77 tokens)
gptme/hooks/tests/test_time_awareness.py [112:28 - 118:2]
Clone found (python):
- gptme/hooks/tests/test_server_confirm.py [244:4 - 256:3] (12 lines, 124 tokens)
gptme/hooks/tests/test_server_elicit.py [265:4 - 277:3]
Clone found (python):
- gptme/hooks/tests/test_agents_md_inject.py [105:2 - 120:3] (15 lines, 112 tokens)
gptme/hooks/tests/test_agents_md_inject.py [73:43 - 88:3]
Clone found (python):
- gptme/hooks/tests/test_agents_md_inject.py [153:24 - 169:7] (16 lines, 116 tokens)
gptme/hooks/tests/test_agents_md_inject.py [73:43 - 89:9]
Clone found (python):
- gptme/hooks/tests/test_agents_md_inject.py [177:11 - 192:4] (15 lines, 104 tokens)
gptme/hooks/tests/test_agents_md_inject.py [73:43 - 87:2]
Clone found (python):
- gptme/hooks/tests/test_agents_md_inject.py [203:17 - 219:10] (16 lines, 118 tokens)
gptme/hooks/tests/test_agents_md_inject.py [73:43 - 169:22]
Clone found (python):
- gptme/eval/dspy/cli.py [316:31 - 331:49] (15 lines, 104 tokens)
gptme/eval/dspy/cli.py [78:1 - 93:7]
Clone found (python):
- gptme/eval/dspy/cli.py [423:12 - 439:46] (16 lines, 93 tokens)
gptme/eval/dspy/cli.py [160:9 - 176:41]
Clone found (python):
- gptme/eval/dspy/cli.py [450:13 - 456:15] (6 lines, 84 tokens)
gptme/eval/dspy/cli.py [187:13 - 192:17]
Clone found (python):
- gptme/eval/agents/swebench.py [109:13 - 118:4] (9 lines, 93 tokens)
gptme/eval/agents/swebench.py [85:9 - 92:3]
Clone found (python):
- gptme/eval/leaderboard.py [362:51 - 378:6] (16 lines, 119 tokens)
gptme/eval/leaderboard.py [302:11 - 319:4]
Clone found (python):
- gptme/eval/execenv.py [196:9 - 218:50] (22 lines, 229 tokens)
gptme/eval/execenv.py [87:8 - 108:6]
Clone found (python):
- gptme/eval/execenv.py [238:13 - 247:64] (9 lines, 109 tokens)
gptme/eval/filestore.py [62:13 - 71:6]
Clone found (python):
- gptme/eval/execenv.py [386:4 - 400:10] (14 lines, 115 tokens)
gptme/eval/execenv.py [153:2 - 167:4]
Clone found (python):
- gptme/eval/execenv.py [463:9 - 487:6] (24 lines, 180 tokens)
gptme/eval/execenv.py [181:9 - 95:3]
Clone found (python):
- gptme/eval/execenv.py [567:5 - 587:5] (20 lines, 118 tokens)
gptme/eval/execenv.py [347:5 - 367:5]
Clone found (python):
- gptme/context/adaptive_compressor.py [69:4 - 81:2] (12 lines, 86 tokens)
gptme/tools/autocompact/scoring.py [158:2 - 167:2]
Clone found (python):
- gptme/context/adaptive_compressor.py [203:2 - 212:2] (9 lines, 86 tokens)
gptme/tools/autocompact/scoring.py [263:2 - 272:2]
Clone found (python):
- gptme/commands/meta.py [210:9 - 219:7] (9 lines, 90 tokens)
gptme/commands/meta.py [161:9 - 170:6]
Clone found (python):
- gptme/cli/util.py [726:5 - 733:17] (7 lines, 79 tokens)
gptme/cli/util.py [693:9 - 700:10]
Clone found (python):
- gptme/cli/doctor.py [202:15 - 217:8] (15 lines, 97 tokens)
gptme/cli/doctor.py [180:15 - 195:6]
Clone found (python):
- gptme/acp/client.py [428:5 - 435:14] (7 lines, 139 tokens)
gptme/acp/client.py [239:9 - 246:5]
Clone found (python):
- scripts/generate_sounds.py [165:2 - 173:13] (8 lines, 81 tokens)
scripts/generate_sounds.py [91:2 - 99:11]
Clone found (python):
- scripts/analyze_compression.py [152:43 - 164:2] (12 lines, 97 tokens)
scripts/analyze_compression.py [55:71 - 67:3]
Clone found (python):
- scripts/analyze_compression.py [220:9 - 231:24] (11 lines, 97 tokens)
scripts/analyze_compression.py [116:9 - 127:20]
Clone found (python):
- gptme/telemetry.py [57:2 - 80:4] (23 lines, 106 tokens)
gptme/util/_telemetry.py [303:5 - 326:7]
Clone found (python):
- gptme/telemetry.py [445:5 - 456:11] (11 lines, 90 tokens)
gptme/telemetry.py [110:9 - 121:10]
┌────────────┬────────────────┬─────────────┬──────────────┬──────────────┬──────────────────┬───────────────────┐
│ Format │ Files analyzed │ Total lines │ Total tokens │ Clones found │ Duplicated lines │ Duplicated tokens │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ python │ 291 │ 80665 │ 514702 │ 41 │ 506 (0.63%) │ 4284 (0.83%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ css │ 1 │ 173 │ 1045 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ javascript │ 1 │ 615 │ 5606 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ markup │ 2 │ 317 │ 2664 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ markdown │ 7 │ 1234 │ 8782 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ bash │ 11 │ 641 │ 3359 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ url │ 1 │ 2 │ 16 │ 0 │ 0 (0%) │ 0 (0%) │
├────────────┼────────────────┼─────────────┼──────────────┼──────────────┼──────────────────┼───────────────────┤
│ Total: │ 314 │ 83647 │ 536174 │ 41 │ 506 (0.6%) │ 4284 (0.8%) │
└────────────┴────────────────┴─────────────┴──────────────┴──────────────┴──────────────────┴───────────────────┘
Found 41 clones.
Detection time:: 5.412s
make[3]: Leaving directory '/home/runner/work/gptme/gptme'
make[2]: Leaving directory '/home/runner/work/gptme/gptme'
The metrics above show:
Project Overview: Basic stats about the codebase size and complexity
Complex Functions: Functions rated D+ (high complexity, should be refactored)
Large Files: Files over 300 SLOC (should be split into smaller modules)
Duplicated Files: Using jscpd to find duplicated code
We should aim to:
Keep average complexity below 4.0
Have no E-rated functions (extremely complex)
Have few D-rated functions (very complex)
Keep files under 300 SLOC where possible