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.
Files changed (208) hide show
  1. {railmux-0.4.2.dev6/src/railmux.egg-info → railmux-0.4.2.dev7}/PKG-INFO +1 -1
  2. railmux-0.4.2.dev7/src/railmux/__init__.py +1 -0
  3. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/transcript.py +40 -10
  4. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7/src/railmux.egg-info}/PKG-INFO +1 -1
  5. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_transcript.py +40 -6
  6. railmux-0.4.2.dev6/src/railmux/__init__.py +0 -1
  7. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/LICENSE +0 -0
  8. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/MANIFEST.in +0 -0
  9. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/README.md +0 -0
  10. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/pyproject.toml +0 -0
  11. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/setup.cfg +0 -0
  12. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/__main__.py +0 -0
  13. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/atomic_file.py +0 -0
  14. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/background_index.py +0 -0
  15. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/cli.py +0 -0
  16. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/codex_index.py +0 -0
  17. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/config.py +0 -0
  18. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/config_cli.py +0 -0
  19. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/diagnostic_contract.py +0 -0
  20. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/diagnostics.py +0 -0
  21. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/discovery.py +0 -0
  22. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/display_transport.py +0 -0
  23. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/entrypoint.py +0 -0
  24. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_client.py +0 -0
  25. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_history.py +0 -0
  26. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_input.py +0 -0
  27. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_protocol.py +0 -0
  28. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fast_display_server.py +0 -0
  29. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/favorites.py +0 -0
  30. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/fuzzy.py +0 -0
  31. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/help_workspace.py +0 -0
  32. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/image_paste.py +0 -0
  33. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/launcher.py +0 -0
  34. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/legacy_sessions.py +0 -0
  35. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/local_clipboard.py +0 -0
  36. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/local_open.py +0 -0
  37. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/models.py +0 -0
  38. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/modes.py +0 -0
  39. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/mouse_manager.py +0 -0
  40. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/orphan_marker.py +0 -0
  41. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/pane_surface.py +0 -0
  42. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/path_codec.py +0 -0
  43. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/preview_pager.py +0 -0
  44. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/project_favorites.py +0 -0
  45. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/provider_paths.py +0 -0
  46. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/release_version.py +0 -0
  47. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/remote_config.py +0 -0
  48. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/renames.py +0 -0
  49. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/restart_state.py +0 -0
  50. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/runtime_config.py +0 -0
  51. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/scroll_agent.py +0 -0
  52. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/scroll_manager.py +0 -0
  53. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/selection_isolation.py +0 -0
  54. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/self_update.py +0 -0
  55. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_cache.py +0 -0
  56. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_index.py +0 -0
  57. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/session_lease.py +0 -0
  58. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/setting_contracts.py +0 -0
  59. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/settings.py +0 -0
  60. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_args.py +0 -0
  61. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_compat.py +0 -0
  62. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_display_diagnostics.py +0 -0
  63. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_doctor.py +0 -0
  64. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ssh_preflight.py +0 -0
  65. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/system_deps.py +0 -0
  66. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/terminal_screen.py +0 -0
  67. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/terminal_status.py +0 -0
  68. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_binding_manager.py +0 -0
  69. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_capabilities.py +0 -0
  70. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_ctl.py +0 -0
  71. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_health.py +0 -0
  72. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tmux_server.py +0 -0
  73. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/tool_panes.py +0 -0
  74. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/__init__.py +0 -0
  75. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/_widgets.py +0 -0
  76. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/app.py +0 -0
  77. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/keymap.py +0 -0
  78. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/modals.py +0 -0
  79. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/projects_pane.py +0 -0
  80. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/running_pane.py +0 -0
  81. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/sessions_pane.py +0 -0
  82. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/sidebar.py +0 -0
  83. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/statusbar.py +0 -0
  84. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/ui/workspace.py +0 -0
  85. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_attach_relay.py +0 -0
  86. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_bootstrap.py +0 -0
  87. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_install_log.py +0 -0
  88. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_msys2.py +0 -0
  89. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_pacman.py +0 -0
  90. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_paths.py +0 -0
  91. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_tmux_lifecycle.py +0 -0
  92. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux/windows_ui_transition.py +0 -0
  93. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/SOURCES.txt +0 -0
  94. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/dependency_links.txt +0 -0
  95. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/entry_points.txt +0 -0
  96. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/requires.txt +0 -0
  97. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/src/railmux.egg-info/top_level.txt +0 -0
  98. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/app_test_harness.py +0 -0
  99. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_agent_workspace.py +0 -0
  100. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_codex_placeholder.py +0 -0
  101. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_quit.py +0 -0
  102. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_restart_restore.py +0 -0
  103. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_app_running_recovery.py +0 -0
  104. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_atomic_file.py +0 -0
  105. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_background_index.py +0 -0
  106. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_claude_continuation.py +0 -0
  107. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_cli.py +0 -0
  108. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_code_map.py +0 -0
  109. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_delete.py +0 -0
  110. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_index.py +0 -0
  111. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_lineage.py +0 -0
  112. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_codex_transcript.py +0 -0
  113. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_config.py +0 -0
  114. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_config_cli.py +0 -0
  115. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_denested_transport_benchmark.py +0 -0
  116. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_diagnostics.py +0 -0
  117. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_discovery.py +0 -0
  118. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_display_transport.py +0 -0
  119. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_bootstrap.py +0 -0
  120. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_history.py +0 -0
  121. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_protocol.py +0 -0
  122. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_selection.py +0 -0
  123. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_server.py +0 -0
  124. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fast_display_terminal.py +0 -0
  125. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_focus_highlight.py +0 -0
  126. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fullscreen_binding.py +0 -0
  127. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_fuzzy.py +0 -0
  128. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_help_agent.py +0 -0
  129. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_help_workspace.py +0 -0
  130. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_history_cleanup.py +0 -0
  131. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_image_paste.py +0 -0
  132. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_keymap.py +0 -0
  133. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_launcher.py +0 -0
  134. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_layout_profile.py +0 -0
  135. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_legacy_sessions.py +0 -0
  136. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_local_clipboard.py +0 -0
  137. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_local_open.py +0 -0
  138. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_modals.py +0 -0
  139. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_mode_selection.py +0 -0
  140. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_modes.py +0 -0
  141. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_mouse_manager.py +0 -0
  142. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_new_project.py +0 -0
  143. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_options.py +0 -0
  144. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_orphan_recovery.py +0 -0
  145. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_pane_surface.py +0 -0
  146. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_path_codec.py +0 -0
  147. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_preview_pager.py +0 -0
  148. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_project_favorites.py +0 -0
  149. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_projects_pane.py +0 -0
  150. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_provider_paths.py +0 -0
  151. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_notes.py +0 -0
  152. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_version.py +0 -0
  153. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_release_workflow.py +0 -0
  154. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_remote_config.py +0 -0
  155. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_renames.py +0 -0
  156. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_restart_state.py +0 -0
  157. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_running_pane.py +0 -0
  158. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_running_sort.py +0 -0
  159. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_runtime_config.py +0 -0
  160. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_scroll_agent.py +0 -0
  161. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_scroll_manager.py +0 -0
  162. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_selection_isolation.py +0 -0
  163. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_self_update.py +0 -0
  164. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_cache.py +0 -0
  165. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_index.py +0 -0
  166. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_session_lease.py +0 -0
  167. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_sessions_pane.py +0 -0
  168. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_setting_contracts.py +0 -0
  169. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_settings.py +0 -0
  170. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_sidebar.py +0 -0
  171. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_args.py +0 -0
  172. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_compat.py +0 -0
  173. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_display_benchmark.py +0 -0
  174. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_display_diagnostics.py +0 -0
  175. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_ssh_doctor.py +0 -0
  176. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_status.py +0 -0
  177. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_statusbar.py +0 -0
  178. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_system_deps.py +0 -0
  179. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_terminal_size.py +0 -0
  180. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_terminal_status.py +0 -0
  181. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_termux_local_touch.py +0 -0
  182. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_binding_manager.py +0 -0
  183. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_capabilities.py +0 -0
  184. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_ctl.py +0 -0
  185. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_health.py +0 -0
  186. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_integration.py +0 -0
  187. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_server.py +0 -0
  188. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tmux_status.py +0 -0
  189. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_tool_panes.py +0 -0
  190. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_utf8_state.py +0 -0
  191. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_web_demo_recorder.py +0 -0
  192. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_wheel_smoke.py +0 -0
  193. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_widgets.py +0 -0
  194. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_attach_relay.py +0 -0
  195. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_bootstrap.py +0 -0
  196. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_install_log.py +0 -0
  197. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_msys2.py +0 -0
  198. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_pacman.py +0 -0
  199. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_paths.py +0 -0
  200. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_synchronized_screen.py +0 -0
  201. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_tmux_lifecycle.py +0 -0
  202. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_ui_transition.py +0 -0
  203. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_windows_wrapper_contract.py +0 -0
  204. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tests/test_yolo_prompt.py +0 -0
  205. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/denested_transport_benchmark.py +0 -0
  206. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/release_notes.py +0 -0
  207. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/wheel_smoke.py +0 -0
  208. {railmux-0.4.2.dev6 → railmux-0.4.2.dev7}/tools/windows_archive_smoke.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: railmux
3
- Version: 0.4.2.dev6
3
+ Version: 0.4.2.dev7
4
4
  Summary: Terminal UI to navigate, resume, and start Claude Code and Codex sessions
5
5
  Author-email: Rightglow <zhang.taian@foxmail.com>
6
6
  License-Expression: MIT
@@ -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
- if (
309
- column + token_width > width
310
- and column > hang
311
- and token_width <= width - hang
312
- ):
313
- newline()
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
- available = width - 1 - 3 * count
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 [header, *body]))
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 italic spans like Claude's markdown view.
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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: railmux
3
- Version: 0.4.2.dev6
3
+ Version: 0.4.2.dev7
4
4
  Summary: Terminal UI to navigate, resume, and start Claude Code and Codex sessions
5
5
  Author-email: Rightglow <zhang.taian@foxmail.com>
6
6
  License-Expression: MIT
@@ -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