railmux 0.4.2.dev2__tar.gz → 0.4.2.dev3__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.dev2/src/railmux.egg-info → railmux-0.4.2.dev3}/PKG-INFO +1 -1
- railmux-0.4.2.dev3/src/railmux/__init__.py +1 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/transcript.py +69 -2
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3/src/railmux.egg-info}/PKG-INFO +1 -1
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_transcript.py +39 -0
- railmux-0.4.2.dev2/src/railmux/__init__.py +0 -1
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/LICENSE +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/MANIFEST.in +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/README.md +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/pyproject.toml +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/setup.cfg +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/__main__.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/atomic_file.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/background_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/cli.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/codex_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/config_cli.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/diagnostic_contract.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/diagnostics.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/discovery.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/display_transport.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/entrypoint.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fast_display_client.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fast_display_history.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fast_display_input.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fast_display_protocol.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fast_display_server.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/favorites.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/fuzzy.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/help_workspace.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/image_paste.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/launcher.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/legacy_sessions.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/local_clipboard.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/local_open.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/models.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/modes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/mouse_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/orphan_marker.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/pane_surface.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/path_codec.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/preview_pager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/project_favorites.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/provider_paths.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/release_version.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/remote_config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/renames.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/restart_state.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/runtime_config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/scroll_agent.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/scroll_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/selection_isolation.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/self_update.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/session_cache.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/session_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/session_lease.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/setting_contracts.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/settings.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ssh_args.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ssh_compat.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ssh_display_diagnostics.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ssh_doctor.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ssh_preflight.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/system_deps.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/terminal_screen.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/terminal_status.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tmux_binding_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tmux_capabilities.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tmux_ctl.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tmux_health.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tmux_server.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/tool_panes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/__init__.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/_widgets.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/app.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/keymap.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/modals.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/projects_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/running_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/sessions_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/sidebar.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/statusbar.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/ui/workspace.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_attach_relay.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_bootstrap.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_install_log.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_msys2.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_pacman.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_paths.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_tmux_lifecycle.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux/windows_ui_transition.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux.egg-info/SOURCES.txt +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux.egg-info/dependency_links.txt +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux.egg-info/entry_points.txt +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux.egg-info/requires.txt +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/src/railmux.egg-info/top_level.txt +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/app_test_harness.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_agent_workspace.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_app_codex_placeholder.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_app_quit.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_app_restart_restore.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_app_running_recovery.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_atomic_file.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_background_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_cli.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_code_map.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_codex_delete.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_codex_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_codex_lineage.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_codex_transcript.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_config_cli.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_denested_transport_benchmark.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_diagnostics.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_discovery.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_display_transport.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_bootstrap.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_history.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_protocol.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_selection.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_server.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fast_display_terminal.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_focus_highlight.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fullscreen_binding.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_fuzzy.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_help_agent.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_help_workspace.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_history_cleanup.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_image_paste.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_keymap.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_launcher.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_layout_profile.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_legacy_sessions.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_local_clipboard.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_local_open.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_modals.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_mode_selection.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_modes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_mouse_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_new_project.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_options.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_orphan_recovery.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_pane_surface.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_path_codec.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_preview_pager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_project_favorites.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_projects_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_provider_paths.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_release_notes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_release_version.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_release_workflow.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_remote_config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_renames.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_restart_state.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_running_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_running_sort.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_runtime_config.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_scroll_agent.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_scroll_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_selection_isolation.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_self_update.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_session_cache.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_session_index.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_session_lease.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_sessions_pane.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_setting_contracts.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_settings.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_sidebar.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_ssh_args.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_ssh_compat.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_ssh_display_benchmark.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_ssh_display_diagnostics.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_ssh_doctor.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_status.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_statusbar.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_system_deps.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_terminal_size.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_terminal_status.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_termux_local_touch.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_binding_manager.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_capabilities.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_ctl.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_health.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_integration.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_server.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tmux_status.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_tool_panes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_utf8_state.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_web_demo_recorder.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_wheel_smoke.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_widgets.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_attach_relay.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_bootstrap.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_install_log.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_msys2.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_pacman.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_paths.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_synchronized_screen.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_tmux_lifecycle.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_ui_transition.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_windows_wrapper_contract.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tests/test_yolo_prompt.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tools/denested_transport_benchmark.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tools/release_notes.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tools/wheel_smoke.py +0 -0
- {railmux-0.4.2.dev2 → railmux-0.4.2.dev3}/tools/windows_archive_smoke.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.4.2.dev3"
|
|
@@ -10,6 +10,7 @@ from __future__ import annotations
|
|
|
10
10
|
import io
|
|
11
11
|
import json
|
|
12
12
|
import os
|
|
13
|
+
import re
|
|
13
14
|
import sys
|
|
14
15
|
from pathlib import Path
|
|
15
16
|
|
|
@@ -23,6 +24,10 @@ RED = "\033[31m"
|
|
|
23
24
|
RESET = "\033[0m"
|
|
24
25
|
CLAUDE_ACCENT = "\033[38;5;147m"
|
|
25
26
|
CLAUDE_MUTED = "\033[38;5;244m"
|
|
27
|
+
ITALIC = "\033[3m"
|
|
28
|
+
BOLD_OFF = "\033[22m"
|
|
29
|
+
ITALIC_OFF = "\033[23m"
|
|
30
|
+
FG_DEFAULT = "\033[39m"
|
|
26
31
|
|
|
27
32
|
_CODEX_SYNTHETIC_PREFIXES = (
|
|
28
33
|
"<environment_context>",
|
|
@@ -223,9 +228,70 @@ def _render_claude_tool_results(record: dict, calls: dict[str, str]):
|
|
|
223
228
|
yield _truncate(text, 500) + "\n"
|
|
224
229
|
|
|
225
230
|
|
|
226
|
-
|
|
231
|
+
_MD_FENCE_RE = re.compile(r"^\s*(```|~~~)")
|
|
232
|
+
_MD_HEADING_RE = re.compile(r"^(#{1,6})\s+(.*?)\s*#*\s*$")
|
|
233
|
+
_MD_INLINE_RE = re.compile(
|
|
234
|
+
r"(`+)(.+?)\1"
|
|
235
|
+
r"|\*\*(?=\S)(.+?)(?<=\S)\*\*"
|
|
236
|
+
r"|__(?=\S)(.+?)(?<=\S)__"
|
|
237
|
+
r"|(?<![\w*])\*(?=[^\s*])(.+?)(?<=[^\s*])\*(?![\w*])"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _markdown_inline(line: str, *, bold: bool = False) -> str:
|
|
242
|
+
"""Style inline code, bold and italic spans like Claude's markdown view.
|
|
243
|
+
|
|
244
|
+
Only targeted "off" codes close each span, so an enclosing style (for
|
|
245
|
+
example a bold heading) survives an inner code or italic span. *bold*
|
|
246
|
+
marks an already-bold context whose nested strong spans must not end it.
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
def replace(match: re.Match[str]) -> str:
|
|
250
|
+
code, strong, strong_alt, emphasis = (
|
|
251
|
+
match.group(2), match.group(3), match.group(4), match.group(5))
|
|
252
|
+
if code is not None:
|
|
253
|
+
return f"{CLAUDE_ACCENT}{code}{FG_DEFAULT}"
|
|
254
|
+
if strong is not None or strong_alt is not None:
|
|
255
|
+
inner = _markdown_inline(
|
|
256
|
+
strong if strong is not None else strong_alt, bold=True)
|
|
257
|
+
return inner if bold else f"{BOLD}{inner}{BOLD_OFF}"
|
|
258
|
+
return f"{ITALIC}{_markdown_inline(emphasis, bold=bold)}{ITALIC_OFF}"
|
|
259
|
+
|
|
260
|
+
return _MD_INLINE_RE.sub(replace, line)
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _markdown_lines(lines: list[str]) -> list[str]:
|
|
264
|
+
"""Approximate Claude Code's markdown rendering for sanitized text lines.
|
|
265
|
+
|
|
266
|
+
Styled lines end with a full reset: every span is already closed, and the
|
|
267
|
+
reset keeps row wrappers from carrying an ever-growing SGR prefix.
|
|
268
|
+
"""
|
|
269
|
+
rendered: list[str] = []
|
|
270
|
+
in_fence = False
|
|
271
|
+
for line in lines:
|
|
272
|
+
if _MD_FENCE_RE.match(line):
|
|
273
|
+
in_fence = not in_fence
|
|
274
|
+
continue
|
|
275
|
+
if in_fence:
|
|
276
|
+
rendered.append(line)
|
|
277
|
+
continue
|
|
278
|
+
heading = _MD_HEADING_RE.match(line)
|
|
279
|
+
if heading:
|
|
280
|
+
inner = _markdown_inline(heading.group(2), bold=True)
|
|
281
|
+
rendered.append(f"{BOLD}{inner}{RESET}")
|
|
282
|
+
continue
|
|
283
|
+
styled = _markdown_inline(line)
|
|
284
|
+
rendered.append(styled + RESET if styled != line else line)
|
|
285
|
+
return rendered
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def _claude_native_block(
|
|
289
|
+
marker: str, text: str, *, colour: str, markdown: bool = False,
|
|
290
|
+
) -> str:
|
|
227
291
|
"""Render a static, non-interactive approximation of one Claude TUI block."""
|
|
228
292
|
lines = _sanitize_text(text).strip().splitlines()
|
|
293
|
+
if markdown:
|
|
294
|
+
lines = _markdown_lines(lines)
|
|
229
295
|
if not lines:
|
|
230
296
|
return ""
|
|
231
297
|
continuation = "\n".join(f" {line}" for line in lines[1:])
|
|
@@ -269,7 +335,8 @@ def _render_claude_native_assistant(
|
|
|
269
335
|
block_type = block.get("type")
|
|
270
336
|
if block_type == "text":
|
|
271
337
|
rendered = _claude_native_block(
|
|
272
|
-
"●", str(block.get("text", "")), colour=CLAUDE_ACCENT
|
|
338
|
+
"●", str(block.get("text", "")), colour=CLAUDE_ACCENT,
|
|
339
|
+
markdown=True,
|
|
273
340
|
)
|
|
274
341
|
if rendered:
|
|
275
342
|
yield rendered
|
|
@@ -856,3 +856,42 @@ def test_transcript_unknown_prefix_does_not_force_claude_detection():
|
|
|
856
856
|
}),
|
|
857
857
|
])
|
|
858
858
|
assert "codex hello" in "".join(format_transcript(io.StringIO(text)))
|
|
859
|
+
|
|
860
|
+
|
|
861
|
+
def test_claude_native_history_styles_assistant_markdown():
|
|
862
|
+
text = "\n".join([
|
|
863
|
+
"## Plan **now**",
|
|
864
|
+
"Use **bold**, `code_name` and *emphasis* in snake_case 2*3*4.",
|
|
865
|
+
"```",
|
|
866
|
+
"**literal** `kept`",
|
|
867
|
+
"```",
|
|
868
|
+
])
|
|
869
|
+
record = {
|
|
870
|
+
"type": "assistant",
|
|
871
|
+
"message": {"role": "assistant", "content": [
|
|
872
|
+
{"type": "text", "text": text},
|
|
873
|
+
]},
|
|
874
|
+
}
|
|
875
|
+
rendered = "".join(format_transcript(
|
|
876
|
+
io.StringIO(json.dumps(record) + "\n"), fmt="claude", claude_native=True
|
|
877
|
+
))
|
|
878
|
+
|
|
879
|
+
assert f"{BOLD}Plan now{RESET}" in rendered
|
|
880
|
+
assert f"{BOLD}bold\033[22m" in rendered
|
|
881
|
+
assert f"{CLAUDE_ACCENT}code_name\033[39m" in rendered
|
|
882
|
+
assert "\033[3memphasis\033[23m" in rendered
|
|
883
|
+
assert "snake_case 2*3*4." in rendered
|
|
884
|
+
assert " **literal** `kept`\n" in rendered
|
|
885
|
+
assert "```" not in rendered
|
|
886
|
+
|
|
887
|
+
|
|
888
|
+
def test_claude_native_user_prompt_keeps_raw_markdown():
|
|
889
|
+
record = {
|
|
890
|
+
"type": "user",
|
|
891
|
+
"message": {"role": "user", "content": "keep **this** raw"},
|
|
892
|
+
}
|
|
893
|
+
rendered = "".join(format_transcript(
|
|
894
|
+
io.StringIO(json.dumps(record) + "\n"), fmt="claude", claude_native=True
|
|
895
|
+
))
|
|
896
|
+
|
|
897
|
+
assert "keep **this** raw" in rendered
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.4.2.dev2"
|
|
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
|