Repository Analysis

tmux-python/tmuxp

🖥️ Session manager for tmux, built on libtmux.

20.7 Moderate AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of tmux-python/tmuxp, a Python project with 4,541 GitHub stars. SynthScan v2.0 examined 37,302 lines of code across 237 source files, recording 731 pattern matches distributed across 10 syntactic categories. The overall adjusted score of 20.7 places this repository in the Moderate 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).

20.7
Adjusted Score
20.7
Raw Score
100%
Time Factor
2026-07-14
Last Push
4.5K
Stars
Python
Language
37.3K
Lines of Code
237
Files
731
Pattern Hits
2026-07-14
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

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.

CRITICAL 0HIGH 0MEDIUM 1LOW 730

Directory Score Breakdown

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.

Pattern Findings

The scanner identified 731 distinct pattern matches across 10 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.

Hyper-Verbose Identifiers511 hits · 544 pts
SeverityFileLineSnippetContext
LOWconftest.py88def monkeypatch_plugin_test_packages(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWconftest.py121def pytest_collection_modifyitems(items: list[pytest.Item]) -> None:CODE
LOWtests/test_plugin.py39def test_tmux_version_fail_min() -> None:CODE
LOWtests/test_plugin.py46def test_tmux_version_fail_max() -> None:CODE
LOWtests/test_plugin.py53def test_tmux_version_fail_incompatible() -> None:CODE
LOWtests/test_plugin.py60def test_tmuxp_version_fail_min() -> None:CODE
LOWtests/test_plugin.py67def test_tmuxp_version_fail_max() -> None:CODE
LOWtests/test_plugin.py74def test_tmuxp_version_fail_incompatible() -> None:CODE
LOWtests/test_plugin.py81def test_libtmux_version_fail_min() -> None:CODE
LOWtests/test_plugin.py88def test_libtmux_version_fail_max() -> None:CODE
LOWtests/test_plugin.py95def test_libtmux_version_fail_incompatible() -> None:CODE
LOWtests/test_plugin.py102def test_plugin_version_check_logs_debug(CODE
LOWtests/test_util.py85def test_run_before_script_isatty(CODE
LOWtests/test_util.py125def test_beforeload_returncode() -> None:CODE
LOWtests/test_util.py134def test_beforeload_returns_stderr_messages() -> None:CODE
LOWtests/test_util.py143def test_get_session_should_default_to_local_attached_session(CODE
LOWtests/test_util.py159def test_get_session_should_return_first_session_if_no_active_session(CODE
LOWtests/test_util.py174def test_get_pane_logs_debug_on_failure(CODE
LOWtests/test_util.py205def test_oh_my_zsh_auto_title_logs_warning(CODE
LOWtests/test_log.py18def test_level_colors_no_colorama() -> None:CODE
LOWtests/test_log.py26def test_log_formatter_format_plain_text() -> None:CODE
LOWtests/test_log.py43def test_debug_log_formatter_format_smoke() -> None:CODE
LOWtests/test_log.py59def test_timestamp_format_has_minutes() -> None:CODE
LOWtests/test_log.py84def test_tmuxp_echo_default_stdout(capsys: pytest.CaptureFixture[str]) -> None:CODE
LOWtests/test_log.py92def test_tmuxp_echo_to_stderr(capsys: pytest.CaptureFixture[str]) -> None:CODE
LOWtests/test_log.py100def test_tmuxp_echo_none_is_no_op(capsys: pytest.CaptureFixture[str]) -> None:CODE
LOWtests/test_docs_tmux_layout.py45def test_arrange_fills_screen(case: ArrangeCase) -> None:CODE
LOWtests/test_docs_tmux_layout.py61def test_arrange_unknown_layout_raises() -> None:CODE
LOWtests/test_docs_tmux_layout.py86def test_highlight_emits_pygments_classes(case: HighlightCase) -> None:CODE
LOWtests/test_docs_tmux_layout.py93def test_highlight_leaves_command_builtin_default() -> None:CODE
LOWtests/test_docs_tmux_layout.py99def test_highlight_escapes_markup() -> None:CODE
LOWtests/test_docs_tmux_layout.py161def test_parse_size_invalid_raises() -> None:CODE
LOWtests/test_docs_tmux_layout.py167def test_render_layout_structure() -> None:CODE
LOWtests/test_docs_tmux_layout.py178def test_render_layout_clips_compact_pane_text_without_rescaling() -> None:CODE
LOWtests/test_docs_tmux_layout.py200def test_setup_registers_components() -> None:CODE
LOWtests/_internal/test_private_path.py14def test_private_path_collapses_home(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py22def test_private_path_collapses_home_exact(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py30def test_private_path_preserves_non_home(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py38def test_private_path_preserves_tmp(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py46def test_private_path_preserves_already_collapsed() -> None:CODE
LOWtests/_internal/test_private_path.py60def test_private_path_in_fstring(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py69def test_private_path_similar_prefix_not_collapsed(CODE
LOWtests/_internal/test_private_path.py83def test_collapse_home_in_string_single_path(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py91def test_collapse_home_in_string_multiple_paths(CODE
LOWtests/_internal/test_private_path.py103def test_collapse_home_in_string_no_home_paths(CODE
LOWtests/_internal/test_private_path.py113def test_collapse_home_in_string_mixed_paths(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_private_path.py121def test_collapse_home_in_string_empty() -> None:CODE
LOWtests/_internal/test_colors.py185def test_get_color_mode_none_returns_auto() -> None:CODE
LOWtests/_internal/test_colors.py190def test_get_color_mode_auto_string() -> None:CODE
LOWtests/_internal/test_colors.py195def test_get_color_mode_always_string() -> None:CODE
LOWtests/_internal/test_colors.py200def test_get_color_mode_never_string() -> None:CODE
LOWtests/_internal/test_colors.py205def test_get_color_mode_case_insensitive() -> None:CODE
LOWtests/_internal/test_colors.py212def test_get_color_mode_invalid_returns_auto() -> None:CODE
LOWtests/_internal/test_colors.py222def test_semantic_color_names() -> None:CODE
LOWtests/_internal/test_colors.py278def test_style_with_empty_tuple() -> None:CODE
LOWtests/_internal/test_colors.py286def test_style_with_rgb_value_too_high() -> None:CODE
LOWtests/_internal/test_colors.py292def test_style_with_rgb_value_negative() -> None:CODE
LOWtests/_internal/test_colors.py298def test_style_with_rgb_non_integer() -> None:CODE
LOWtests/_internal/test_colors.py307def test_heading_applies_bright_cyan_bold(monkeypatch: pytest.MonkeyPatch) -> None:CODE
LOWtests/_internal/test_colors.py41def test_auto_no_tty_disabled(monkeypatch: pytest.MonkeyPatch) -> None:CODE
451 more matches not shown…
Unused Imports123 hits · 120 pts
SeverityFileLineSnippetContext
LOWconftest.py11CODE
LOWtests/test_plugin.py3CODE
LOWtests/constants.py3CODE
LOWtests/test_util.py3CODE
LOWtests/test_log.py3CODE
LOWtests/test_docs_tmux_layout.py3CODE
LOWtests/test_shell.py3CODE
LOWtests/_internal/conftest.py3CODE
LOWtests/_internal/test_private_path.py3CODE
LOWtests/_internal/test_colors.py3CODE
LOWtests/_internal/test_colors_formatters.py3CODE
LOWtests/_internal/test_colors_integration.py3CODE
LOWtests/workspace/test_freezer.py3CODE
LOWtests/workspace/conftest.py3CODE
LOWtests/workspace/test_options.py3CODE
LOWtests/workspace/test_finders_local.py3CODE
LOWtests/workspace/test_import_teamocil.py3CODE
LOWtests/workspace/test_builder_registry.py3CODE
LOWtests/workspace/test_progress.py3CODE
LOWtests/workspace/test_finder.py3CODE
LOWtests/workspace/test_builder.py3CODE
LOWtests/workspace/test_config.py3CODE
LOWtests/workspace/test_import_tmuxinator.py3CODE
LOWtests/tests/test_helpers.py3CODE
LOWtests/cli/conftest.py3CODE
LOWtests/cli/test_freeze_colors.py3CODE
LOWtests/cli/test_search.py3CODE
LOWtests/cli/test_freeze.py3CODE
LOWtests/cli/test_ls.py3CODE
LOWtests/cli/test_convert.py3CODE
LOWtests/cli/test_output.py3CODE
LOWtests/cli/test_debug_info_colors.py3CODE
LOWtests/cli/test_progress.py3CODE
LOWtests/cli/test_shell_colors.py3CODE
LOWtests/cli/test_prompt_colors.py3CODE
LOWtests/cli/test_import.py3CODE
LOWtests/cli/test_convert_colors.py3CODE
LOWtests/cli/test_formatter.py3CODE
LOWtests/cli/test_debug_info.py3CODE
LOWtests/cli/test_edit_colors.py3CODE
LOWtests/cli/test_help_examples.py3CODE
LOWtests/cli/test_shell.py3CODE
LOWtests/cli/test_cli.py3CODE
LOWtests/cli/test_load.py3CODE
LOWtests/cli/test_import_colors.py3CODE
LOWdocs/conf.py3CODE
LOWdocs/_ext/conftest.py7CODE
LOWdocs/_ext/aafig.py15CODE
LOWdocs/_ext/tmux_layout.py34CODE
LOWsrc/tmuxp/log.py4CODE
LOWsrc/tmuxp/util.py3CODE
LOWsrc/tmuxp/shell.py4CODE
LOWsrc/tmuxp/__init__.py7CODE
LOWsrc/tmuxp/__init__.py11CODE
LOWsrc/tmuxp/__init__.py11CODE
LOWsrc/tmuxp/__init__.py12CODE
LOWsrc/tmuxp/__init__.py12CODE
LOWsrc/tmuxp/__init__.py12CODE
LOWsrc/tmuxp/__init__.py12CODE
LOWsrc/tmuxp/__init__.py12CODE
63 more matches not shown…
Modern Structural Boilerplate45 hits · 44 pts
SeverityFileLineSnippetContext
LOWconftest.py29logger = logging.getLogger(__name__)CODE
LOWdocs/_ext/aafig.py40logger = logging.getLogger(__name__)CODE
LOWdocs/_ext/tmux_layout.py50logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/log.py13logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/util.py23logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/shell.py11logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/__init__.py23logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/types.py15logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/exc.py11logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/__about__.py7logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/plugin.py15logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_compat.py6logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_internal/config_reader.py12logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_internal/__init__.py7logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_internal/types.py19logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_internal/private_path.py14logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/_internal/private_path.py143__all__ = ["PrivatePath", "collapse_home_in_string"]CODE
LOWsrc/tmuxp/_internal/colors.py52logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/freezer.py8logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/finders.py15logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/constants.py7logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/__init__.py7logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/importers.py8logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/loader.py10logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/validation.py10logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/workspace/builder/__init__.py32__all__ = [CODE
LOWsrc/tmuxp/workspace/builder/classic.py30logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/_colors.py26logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/_colors.py28__all__ = [CODE
LOWsrc/tmuxp/cli/_output.py32logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/import_config.py20logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/_formatter.py20logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/convert.py19logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/shell.py19logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/__init__.py62logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/debug_info.py24logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/edit.py16logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/ls.py50logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/utils.py19logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/utils.py25__all__ = [CODE
LOWsrc/tmuxp/cli/freeze.py25logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/search.py43logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/load.py39logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/_progress.py22logger = logging.getLogger(__name__)CODE
LOWsrc/tmuxp/cli/_progress.py902 def update_message(self, message: str) -> None:STRING
Deep Nesting25 hits · 25 pts
SeverityFileLineSnippetContext
LOWtests/workspace/test_finder.py425CODE
LOWtests/cli/test_help_examples.py13CODE
LOWtests/cli/test_help_examples.py42CODE
LOWdocs/_ext/aafig.py166CODE
LOWsrc/tmuxp/util.py28CODE
LOWsrc/tmuxp/util.py144CODE
LOWsrc/tmuxp/shell.py106CODE
LOWsrc/tmuxp/shell.py298CODE
LOWsrc/tmuxp/workspace/freezer.py59CODE
LOWsrc/tmuxp/workspace/finders.py285CODE
LOWsrc/tmuxp/workspace/importers.py116CODE
LOWsrc/tmuxp/workspace/loader.py68CODE
LOWsrc/tmuxp/workspace/loader.py197CODE
LOWsrc/tmuxp/cli/_formatter.py172CODE
LOWsrc/tmuxp/cli/__init__.py281CODE
LOWsrc/tmuxp/cli/ls.py258CODE
LOWsrc/tmuxp/cli/ls.py399CODE
LOWsrc/tmuxp/cli/ls.py482CODE
LOWsrc/tmuxp/cli/search.py534CODE
LOWsrc/tmuxp/cli/search.py676CODE
LOWsrc/tmuxp/cli/load.py122CODE
LOWsrc/tmuxp/cli/load.py330CODE
LOWsrc/tmuxp/cli/load.py447CODE
LOWsrc/tmuxp/cli/_progress.py437CODE
LOWsrc/tmuxp/cli/_progress.py785CODE
Structural Annotation Overuse11 hits · 19 pts
SeverityFileLineSnippetContext
LOW.claude/skills/update-libtmux/SKILL.md29## Step 0: PreflightCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md59## Step 1: Study upstream changesCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md112## Step 2: Create branchCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md120## Step 3: Package commitCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md174## Step 4: Code commit(s) — if neededCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md218## Step 5: Test commit(s) — if neededCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md249## Step 6: CHANGES commitCOMMENT
LOW.claude/skills/update-libtmux/SKILL.md286## Step 7: Push and open PRCOMMENT
LOW.github/issue_template.md5### Step 1: Provide a summary of your problemCOMMENT
LOW.github/issue_template.md9### Step 2: Provide tmuxp detailsCOMMENT
LOW.github/issue_template.md14### Step 3: Describe the problem:COMMENT
Excessive Try-Catch Wrapping8 hits · 8 pts
SeverityFileLineSnippetContext
LOWdocs/_ext/aafig.py206 except Exception as e:CODE
LOWsrc/tmuxp/log.py161 except Exception as e:CODE
LOWsrc/tmuxp/util.py162 except Exception as e:CODE
LOWsrc/tmuxp/util.py184 except Exception as e:CODE
LOWsrc/tmuxp/util.py203 except Exception as e:CODE
LOWsrc/tmuxp/workspace/builder/classic.py70 except Exception:CODE
LOWsrc/tmuxp/workspace/builder/classic.py532 except Exception:CODE
LOWsrc/tmuxp/cli/load.py655 except Exception:CODE
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippetContext
LOWtests/workspace/test_builder.py340 # Print output for easier debugging if assertion failsCOMMENT
LOWtests/cli/test_debug_info.py158 # Set SHELL to a path under home directoryCOMMENT
LOWsrc/tmuxp/cli/search.py230 # Check if prefix is a valid field aliasCOMMENT
LOWsrc/tmuxp/cli/search.py1301 # Output resultsCOMMENT
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUMtests/cli/test_prompt_colors.py134 # Create a path under the user's home directoryCOMMENT
AI Structural Patterns2 hits · 2 pts
SeverityFileLineSnippetContext
LOWsrc/tmuxp/_internal/colors.py735CODE
LOWsrc/tmuxp/cli/load.py447CODE
Over-Commented Block1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/workspace/test_config.py101}COMMENT