railmux 0.4.2.dev6__tar.gz → 0.4.2.dev7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {railmux-0.4.2.dev6/src/railmux.egg-info → railmux-0.4.2.dev7}/PKG-INFO +1 -1
- railmux-0.4.2.dev7/src/railmux/__init__.py +1 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/transcript.py +40 -10
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7/src/railmux.egg-info}/PKG-INFO +1 -1
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_transcript.py +40 -6
- railmux-0.4.2.dev6/src/railmux/__init__.py +0 -1
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/LICENSE +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/MANIFEST.in +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/README.md +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/pyproject.toml +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/setup.cfg +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/__main__.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/atomic_file.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/background_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/cli.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/codex_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/config_cli.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/diagnostic_contract.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/diagnostics.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/discovery.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/display_transport.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/entrypoint.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_client.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_history.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_input.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_protocol.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_server.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/favorites.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fuzzy.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/help_workspace.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/image_paste.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/launcher.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/legacy_sessions.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/local_clipboard.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/local_open.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/models.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/modes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/mouse_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/orphan_marker.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/pane_surface.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/path_codec.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/preview_pager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/project_favorites.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/provider_paths.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/release_version.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/remote_config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/renames.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/restart_state.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/runtime_config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/scroll_agent.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/scroll_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/selection_isolation.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/self_update.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_cache.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_lease.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/setting_contracts.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/settings.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_args.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_compat.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_display_diagnostics.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_doctor.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_preflight.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/system_deps.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/terminal_screen.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/terminal_status.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_binding_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_capabilities.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_ctl.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_health.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_server.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tool_panes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/__init__.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/_widgets.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/app.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/keymap.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/modals.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/projects_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/running_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/sessions_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/sidebar.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/statusbar.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/workspace.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_attach_relay.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_bootstrap.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_install_log.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_msys2.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_pacman.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_paths.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_tmux_lifecycle.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_ui_transition.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/SOURCES.txt +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/dependency_links.txt +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/entry_points.txt +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/requires.txt +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/top_level.txt +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/app_test_harness.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_agent_workspace.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_codex_placeholder.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_quit.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_restart_restore.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_running_recovery.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_atomic_file.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_background_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_claude_continuation.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_cli.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_code_map.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_delete.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_lineage.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_transcript.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_config_cli.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_denested_transport_benchmark.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_diagnostics.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_discovery.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_display_transport.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_bootstrap.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_history.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_protocol.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_selection.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_server.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_terminal.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_focus_highlight.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fullscreen_binding.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fuzzy.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_help_agent.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_help_workspace.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_history_cleanup.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_image_paste.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_keymap.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_launcher.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_layout_profile.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_legacy_sessions.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_local_clipboard.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_local_open.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_modals.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_mode_selection.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_modes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_mouse_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_new_project.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_options.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_orphan_recovery.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_pane_surface.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_path_codec.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_preview_pager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_project_favorites.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_projects_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_provider_paths.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_notes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_version.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_workflow.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_remote_config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_renames.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_restart_state.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_running_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_running_sort.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_runtime_config.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_scroll_agent.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_scroll_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_selection_isolation.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_self_update.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_cache.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_index.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_lease.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_sessions_pane.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_setting_contracts.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_settings.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_sidebar.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_args.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_compat.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_display_benchmark.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_display_diagnostics.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_doctor.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_status.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_statusbar.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_system_deps.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_terminal_size.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_terminal_status.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_termux_local_touch.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_binding_manager.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_capabilities.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_ctl.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_health.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_integration.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_server.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_status.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tool_panes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_utf8_state.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_web_demo_recorder.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_wheel_smoke.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_widgets.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_attach_relay.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_bootstrap.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_install_log.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_msys2.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_pacman.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_paths.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_synchronized_screen.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_tmux_lifecycle.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_ui_transition.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_wrapper_contract.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_yolo_prompt.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/denested_transport_benchmark.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/release_notes.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/wheel_smoke.py +0 -0
- {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/windows_archive_smoke.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.2.dev7"
|
|
@@ -235,6 +235,7 @@ _MD_INLINE_RE = re.compile(
|
|
|
235
235
|
r"|\*\*(?=\S)(.+?)(?<=\S)\*\*"
|
|
236
236
|
r"|__(?=\S)(.+?)(?<=\S)__"
|
|
237
237
|
r"|(?<![\w*])\*(?=[^\s*])(.+?)(?<=[^\s*])\*(?![\w*])"
|
|
238
|
+
r"|\[([^\]\n]+)\]\(([^)\s]+)\)"
|
|
238
239
|
)
|
|
239
240
|
_MD_TABLE_SEPARATOR_RE = re.compile(
|
|
240
241
|
r"^\s*\|?\s*:?-{3,}:?\s*(\|\s*:?-{3,}:?\s*)*\|?\s*$")
|
|
@@ -305,12 +306,16 @@ def _wrap_styled(line: str, width: int, hang: int) -> list[str]:
|
|
|
305
306
|
else:
|
|
306
307
|
newline()
|
|
307
308
|
continue
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
309
|
+
capacity = width - hang
|
|
310
|
+
if column + token_width > width and column > hang:
|
|
311
|
+
# Like wrap-ansi: start a word on a fresh row when that fits it,
|
|
312
|
+
# or when splitting it from there needs fewer breaks.
|
|
313
|
+
breaks_here = 1 + (token_width - (width - column) - 1) // capacity
|
|
314
|
+
if (
|
|
315
|
+
token_width <= capacity
|
|
316
|
+
or (token_width - 1) // capacity < breaks_here
|
|
317
|
+
):
|
|
318
|
+
newline()
|
|
314
319
|
for char in token:
|
|
315
320
|
char_width = _char_width(char)
|
|
316
321
|
if column + char_width > width and column > hang:
|
|
@@ -373,15 +378,34 @@ def _markdown_table(lines: list[str], width: int) -> list[str] | None:
|
|
|
373
378
|
for line in lines[2:]:
|
|
374
379
|
cells = [_markdown_inline(cell) for cell in _table_cells(line)]
|
|
375
380
|
body.append((cells + [""] * count)[:count])
|
|
376
|
-
|
|
381
|
+
# Claude keeps two spare cells beside the borders and padding.
|
|
382
|
+
available = width - 3 - 3 * count
|
|
377
383
|
if available < 3 * count:
|
|
378
384
|
return None
|
|
385
|
+
rows = [header, *body]
|
|
379
386
|
natural = [
|
|
380
|
-
max(1, *(_visible_width(row[index]) for row in
|
|
387
|
+
max(1, *(_visible_width(row[index]) for row in rows))
|
|
381
388
|
for index in range(count)
|
|
382
389
|
]
|
|
390
|
+
longest_word = [
|
|
391
|
+
max(
|
|
392
|
+
_visible_width(word)
|
|
393
|
+
for row in rows
|
|
394
|
+
for word in [*_SGR_RE.sub("", row[index]).split(" "), ""]
|
|
395
|
+
)
|
|
396
|
+
for index in range(count)
|
|
397
|
+
]
|
|
398
|
+
minimum = [max(1, min(a, b)) for a, b in zip(natural, longest_word)]
|
|
383
399
|
widths = natural
|
|
384
|
-
if sum(natural) > available:
|
|
400
|
+
if sum(natural) > available and sum(minimum) <= available:
|
|
401
|
+
# Claude's split: every column fits its longest word, and the spare
|
|
402
|
+
# cells go to each column in proportion to how much more it wants.
|
|
403
|
+
spare = available - sum(minimum)
|
|
404
|
+
wanted = sum(n - m for n, m in zip(natural, minimum))
|
|
405
|
+
widths = [
|
|
406
|
+
m + spare * (n - m) // wanted for n, m in zip(natural, minimum)
|
|
407
|
+
]
|
|
408
|
+
elif sum(natural) > available:
|
|
385
409
|
low, high = 3, max(natural)
|
|
386
410
|
while low < high:
|
|
387
411
|
cap = (low + high + 1) // 2
|
|
@@ -419,11 +443,12 @@ def _markdown_table(lines: list[str], width: int) -> list[str] | None:
|
|
|
419
443
|
|
|
420
444
|
|
|
421
445
|
def _markdown_inline(line: str, *, bold: bool = False) -> str:
|
|
422
|
-
"""Style inline code, bold and
|
|
446
|
+
"""Style inline code, bold, italic and link spans like Claude's view.
|
|
423
447
|
|
|
424
448
|
Only targeted "off" codes close each span, so an enclosing style (for
|
|
425
449
|
example a bold heading) survives an inner code or italic span. *bold*
|
|
426
450
|
marks an already-bold context whose nested strong spans must not end it.
|
|
451
|
+
A link shows only its text, as Claude's clickable link does.
|
|
427
452
|
"""
|
|
428
453
|
|
|
429
454
|
def replace(match: re.Match[str]) -> str:
|
|
@@ -431,6 +456,8 @@ def _markdown_inline(line: str, *, bold: bool = False) -> str:
|
|
|
431
456
|
match.group(2), match.group(3), match.group(4), match.group(5))
|
|
432
457
|
if code is not None:
|
|
433
458
|
return f"{CLAUDE_ACCENT}{code}{FG_DEFAULT}"
|
|
459
|
+
if match.group(6) is not None:
|
|
460
|
+
return _markdown_inline(match.group(6), bold=bold)
|
|
434
461
|
if strong is not None or strong_alt is not None:
|
|
435
462
|
inner = _markdown_inline(
|
|
436
463
|
strong if strong is not None else strong_alt, bold=True)
|
|
@@ -477,6 +504,9 @@ def _markdown_lines(lines: list[str], width: int | None = None) -> list[str]:
|
|
|
477
504
|
if heading:
|
|
478
505
|
inner = _markdown_inline(heading.group(2), bold=True)
|
|
479
506
|
rendered.append(f"{BOLD}{inner}{RESET}")
|
|
507
|
+
# Claude always leaves a blank line below a heading.
|
|
508
|
+
if index < len(lines) and lines[index].strip():
|
|
509
|
+
rendered.append("")
|
|
480
510
|
continue
|
|
481
511
|
styled = _markdown_inline(line)
|
|
482
512
|
rendered.append(styled + RESET if styled != line else line)
|
|
@@ -962,12 +962,46 @@ def test_claude_native_history_draws_tables_that_fit_the_pane():
|
|
|
962
962
|
rows = _plain_rows(_native([_assistant(table)], width=30))[1:-1]
|
|
963
963
|
|
|
964
964
|
assert rows == [
|
|
965
|
-
"●
|
|
966
|
-
" │ Name │ Notes
|
|
967
|
-
"
|
|
968
|
-
" │ a │ one two three
|
|
969
|
-
" │ │ four
|
|
970
|
-
"
|
|
965
|
+
"● ┌──────┬─────────────────┐",
|
|
966
|
+
" │ Name │ Notes │",
|
|
967
|
+
" ├──────┼─────────────────┤",
|
|
968
|
+
" │ a │ one two three │",
|
|
969
|
+
" │ │ four │",
|
|
970
|
+
" └──────┴─────────────────┘",
|
|
971
971
|
]
|
|
972
972
|
assert all(len(row) <= 30 for row in rows)
|
|
973
973
|
assert table.splitlines()[0] in _native([_assistant(table)])
|
|
974
|
+
|
|
975
|
+
|
|
976
|
+
def test_claude_native_history_matches_claude_table_and_link_layout():
|
|
977
|
+
table = "\n".join([
|
|
978
|
+
"### Title",
|
|
979
|
+
"| PR | Notes |",
|
|
980
|
+
"|---|---|",
|
|
981
|
+
"| [#1](https://example.com/pull/1) | "
|
|
982
|
+
+ "alpha beta gamma delta epsilon zeta eta theta |",
|
|
983
|
+
])
|
|
984
|
+
rows = _plain_rows(_native([_assistant(table)], width=40))[1:-1]
|
|
985
|
+
|
|
986
|
+
assert rows == [
|
|
987
|
+
"● Title",
|
|
988
|
+
" ",
|
|
989
|
+
" ┌────┬─────────────────────────────┐",
|
|
990
|
+
" │ PR │ Notes │",
|
|
991
|
+
" ├────┼─────────────────────────────┤",
|
|
992
|
+
" │ #1 │ alpha beta gamma delta │",
|
|
993
|
+
" │ │ epsilon zeta eta theta │",
|
|
994
|
+
" └────┴─────────────────────────────┘",
|
|
995
|
+
]
|
|
996
|
+
|
|
997
|
+
|
|
998
|
+
def test_claude_native_wrap_moves_long_word_when_that_saves_a_break():
|
|
999
|
+
moved = _native([_assistant("intro " + "x" * 36)], width=20)
|
|
1000
|
+
kept = _native([_assistant("intro " + "x" * 30)], width=20)
|
|
1001
|
+
|
|
1002
|
+
assert _plain_rows(moved)[1:-1] == [
|
|
1003
|
+
"● intro", " " + "x" * 18, " " + "x" * 18,
|
|
1004
|
+
]
|
|
1005
|
+
assert _plain_rows(kept)[1:-1] == [
|
|
1006
|
+
"● intro " + "x" * 12, " " + "x" * 18,
|
|
1007
|
+
]
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.4.2.dev6"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|