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