comate-cli 0.7.0a3__tar.gz → 0.7.0a5__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 (159) hide show
  1. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/PKG-INFO +1 -1
  2. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/mention_completer.py +2 -0
  3. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/pyproject.toml +1 -1
  4. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_completion_context_activation.py +2 -2
  5. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_mention_completer.py +41 -9
  6. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/.gitignore +0 -0
  7. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/CHANGELOG.md +0 -0
  8. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/README.md +0 -0
  9. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/bash-exit-code-green-dot-bug.md +0 -0
  10. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/__init__.py +0 -0
  11. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/__main__.py +0 -0
  12. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/main.py +0 -0
  13. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/mcp_cli.py +0 -0
  14. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/__init__.py +0 -0
  15. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/animations.py +0 -0
  16. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/app.py +0 -0
  17. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/assistant_render.py +0 -0
  18. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/codenames.py +0 -0
  19. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/custom_slash_commands.py +0 -0
  20. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/env_utils.py +0 -0
  21. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/error_display.py +0 -0
  22. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/event_renderer.py +0 -0
  23. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/figures.py +0 -0
  24. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/fragment_utils.py +0 -0
  25. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/history_printer.py +0 -0
  26. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/input_geometry.py +0 -0
  27. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/layout_coordinator.py +0 -0
  28. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/logging_adapter.py +0 -0
  29. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/logo.py +0 -0
  30. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/markdown_render.py +0 -0
  31. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/message_style.py +0 -0
  32. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/models.py +0 -0
  33. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/path_context_hint.py +0 -0
  34. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/__init__.py +0 -0
  35. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/components/__init__.py +0 -0
  36. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/components/detail_view.py +0 -0
  37. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/components/plugin_list.py +0 -0
  38. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/components/search_box.py +0 -0
  39. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/components/tab_bar.py +0 -0
  40. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/marketplace_install_view.py +0 -0
  41. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/plugin_picker.py +0 -0
  42. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/tabs/__init__.py +0 -0
  43. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/tabs/discover_tab.py +0 -0
  44. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/tabs/errors_tab.py +0 -0
  45. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/tabs/installed_tab.py +0 -0
  46. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/plugins/tabs/marketplaces_tab.py +0 -0
  47. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/preflight.py +0 -0
  48. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/question_view.py +0 -0
  49. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/resume_picker.py +0 -0
  50. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/resume_preview.py +0 -0
  51. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/resume_selector.py +0 -0
  52. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/rpc_protocol.py +0 -0
  53. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/rpc_stdio.py +0 -0
  54. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/selection_menu.py +0 -0
  55. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/slash_commands.py +0 -0
  56. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/startup.py +0 -0
  57. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/status_bar.py +0 -0
  58. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/text_effects.py +0 -0
  59. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tips.py +0 -0
  60. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tool_result_formatters.py +0 -0
  61. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tool_result_store.py +0 -0
  62. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tool_result_viewer.py +0 -0
  63. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tool_view.py +0 -0
  64. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/transcript_viewer.py +0 -0
  65. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui.py +0 -0
  66. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/__init__.py +0 -0
  67. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/btw_view.py +0 -0
  68. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/commands.py +0 -0
  69. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/history_sync.py +0 -0
  70. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/input_behavior.py +0 -0
  71. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/key_bindings.py +0 -0
  72. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/mcp_connecting_view.py +0 -0
  73. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/render_panels.py +0 -0
  74. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/slash_command_registry.py +0 -0
  75. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/comate_cli/terminal_agent/tui_parts/ui_mode.py +0 -0
  76. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/docs/hooks.md +0 -0
  77. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/docs/superpowers/plans/2026-04-03-phrase-shuffle.md +0 -0
  78. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/docs/superpowers/specs/2026-04-01-conditional-diff-subtitle-design.md +0 -0
  79. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/docs/superpowers/specs/2026-04-03-phrase-shuffle-design.md +0 -0
  80. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/conftest.py +0 -0
  81. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_animator_shuffle.py +0 -0
  82. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_app_mcp_preload.py +0 -0
  83. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_app_preflight_gate.py +0 -0
  84. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_app_print_mode.py +0 -0
  85. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_app_shutdown.py +0 -0
  86. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_app_usage_line.py +0 -0
  87. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_btw_slash_command.py +0 -0
  88. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_cli_project_root.py +0 -0
  89. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_compact_command_semantics.py +0 -0
  90. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_completion_status_panel.py +0 -0
  91. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_context_command.py +0 -0
  92. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_custom_slash_commands.py +0 -0
  93. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_discover_tab.py +0 -0
  94. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_errors_tab.py +0 -0
  95. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer.py +0 -0
  96. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer_boundary.py +0 -0
  97. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer_e2e.py +0 -0
  98. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer_log_boundary.py +0 -0
  99. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer_log_queue.py +0 -0
  100. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_event_renderer_streaming.py +0 -0
  101. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_format_error.py +0 -0
  102. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_handle_error.py +0 -0
  103. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_history_printer.py +0 -0
  104. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_history_printer_log.py +0 -0
  105. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_history_sync.py +0 -0
  106. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_input_behavior.py +0 -0
  107. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_input_history.py +0 -0
  108. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_installed_tab.py +0 -0
  109. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_interrupt_exit_semantics.py +0 -0
  110. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_layout_coordinator.py +0 -0
  111. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_logging_adapter.py +0 -0
  112. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_logo.py +0 -0
  113. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_main_args.py +0 -0
  114. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_markdown_render.py +0 -0
  115. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_marketplaces_tab.py +0 -0
  116. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_mcp_cli.py +0 -0
  117. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_mcp_slash_command.py +0 -0
  118. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_path_context_hint.py +0 -0
  119. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_plugin_slash_commands.py +0 -0
  120. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_plugin_tui_components.py +0 -0
  121. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_preflight.py +0 -0
  122. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_preflight_copilot.py +0 -0
  123. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_question_key_bindings.py +0 -0
  124. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_question_view.py +0 -0
  125. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_resume_picker.py +0 -0
  126. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_resume_preview.py +0 -0
  127. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_resume_selector.py +0 -0
  128. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_rewind_command_semantics.py +0 -0
  129. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_rpc_protocol.py +0 -0
  130. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_rpc_stdio_bridge.py +0 -0
  131. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_selection_menu.py +0 -0
  132. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_session_query_token_summary.py +0 -0
  133. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_skills_slash_command.py +0 -0
  134. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_slash_argument_hint.py +0 -0
  135. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_slash_completer.py +0 -0
  136. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_slash_registry.py +0 -0
  137. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_status_bar.py +0 -0
  138. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_status_bar_transient.py +0 -0
  139. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_task_panel_format.py +0 -0
  140. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_task_panel_key_bindings.py +0 -0
  141. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_task_panel_rendering.py +0 -0
  142. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_task_poll.py +0 -0
  143. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tool_result_formatters.py +0 -0
  144. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tool_result_store.py +0 -0
  145. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tool_result_viewer.py +0 -0
  146. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tool_result_viewer_key_bindings.py +0 -0
  147. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tool_view.py +0 -0
  148. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_transcript_viewer.py +0 -0
  149. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_elapsed_status.py +0 -0
  150. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_esc_queue.py +0 -0
  151. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_mcp_init_gate.py +0 -0
  152. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_paste_placeholder.py +0 -0
  153. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_queue_preview.py +0 -0
  154. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_queue_sdk_source.py +0 -0
  155. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_split_invariance.py +0 -0
  156. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_team_messages.py +0 -0
  157. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_tui_tool_result_registry_lifecycle.py +0 -0
  158. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/tests/test_update_check.py +0 -0
  159. {comate_cli-0.7.0a3 → comate_cli-0.7.0a5}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: comate-cli
3
- Version: 0.7.0a3
3
+ Version: 0.7.0a5
4
4
  Summary: Comate terminal CLI built on comate-agent-sdk
5
5
  Project-URL: Homepage, https://github.com/AndyLee1024/agent-sdk
6
6
  Project-URL: Repository, https://github.com/AndyLee1024/agent-sdk
@@ -412,6 +412,8 @@ class LocalFileMentionCompleter(Completer):
412
412
  cwd=self._root,
413
413
  capture_output=True,
414
414
  text=True,
415
+ encoding="utf-8",
416
+ errors="replace",
415
417
  check=False,
416
418
  timeout=5,
417
419
  )
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "comate-cli"
7
- version = "0.7.0a3"
7
+ version = "0.7.0a5"
8
8
  description = "Comate terminal CLI built on comate-agent-sdk"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -73,7 +73,7 @@ class TestCompletionContextActivation(unittest.TestCase):
73
73
  def test_warmup_callback_does_not_cancel_in_flight_completion(self) -> None:
74
74
  class _FakeBuffer:
75
75
  def __init__(self) -> None:
76
- self.document = Document("@穆", cursor_position=2)
76
+ self.document = Document("@测", cursor_position=2)
77
77
  self.complete_state = SimpleNamespace(completions=[])
78
78
  self.start_calls = 0
79
79
 
@@ -95,7 +95,7 @@ class TestCompletionContextActivation(unittest.TestCase):
95
95
  def test_warmup_callback_restarts_when_no_completion_is_active(self) -> None:
96
96
  class _FakeBuffer:
97
97
  def __init__(self) -> None:
98
- self.document = Document("@穆", cursor_position=2)
98
+ self.document = Document("@测", cursor_position=2)
99
99
  self.complete_state = None
100
100
  self.start_calls = 0
101
101
 
@@ -443,7 +443,7 @@ class TestLocalFileMentionCompleter(unittest.TestCase):
443
443
  return_value=subprocess.CompletedProcess(
444
444
  args=["git"],
445
445
  returncode=0,
446
- stdout="Wukong/穆雨晨.pdf\n",
446
+ stdout="Wukong/测试用户.pdf\n",
447
447
  stderr="",
448
448
  ),
449
449
  ) as mock_run:
@@ -453,12 +453,12 @@ class TestLocalFileMentionCompleter(unittest.TestCase):
453
453
  self.assertTrue(started)
454
454
  self.assertTrue(completed.wait(timeout=2.0))
455
455
 
456
- result = completer.suggest("@穆", max_items=16)
456
+ result = completer.suggest("@测", max_items=16)
457
457
 
458
458
  self.assertIsNotNone(result)
459
459
  assert result is not None
460
460
  _, candidates = result
461
- self.assertIn("Wukong/穆雨晨.pdf", candidates)
461
+ self.assertIn("Wukong/测试用户.pdf", candidates)
462
462
  mock_run.assert_called_once()
463
463
 
464
464
  def test_deep_cache_warmup_coalesces_concurrent_requests(self) -> None:
@@ -481,7 +481,7 @@ class TestLocalFileMentionCompleter(unittest.TestCase):
481
481
  return subprocess.CompletedProcess(
482
482
  args=["git"],
483
483
  returncode=0,
484
- stdout="Wukong/穆雨晨.pdf\n",
484
+ stdout="Wukong/测试用户.pdf\n",
485
485
  stderr="",
486
486
  )
487
487
 
@@ -562,6 +562,38 @@ class TestLocalFileMentionCompleter(unittest.TestCase):
562
562
  quotepath_index = cmd.index("core.quotepath=false")
563
563
  self.assertLess(quotepath_index, ls_files_index)
564
564
 
565
+ def test_git_index_decodes_utf8_paths_without_windows_locale_loss(self) -> None:
566
+ """Windows 中文 locale 下 subprocess text 模式默认按 GBK 解码。
567
+
568
+ git 在 core.quotepath=false 时输出 UTF-8 路径;索引命令必须显式用
569
+ UTF-8 解码,不能依赖进程 locale。
570
+ """
571
+ payload = "docs/测.txt\n".encode("utf-8")
572
+
573
+ def _run_with_windows_locale_default(
574
+ args: list[str],
575
+ **kwargs: object,
576
+ ) -> subprocess.CompletedProcess[str]:
577
+ encoding = str(kwargs.get("encoding") or "gbk")
578
+ errors = str(kwargs.get("errors") or "replace")
579
+ return subprocess.CompletedProcess(
580
+ args=args,
581
+ returncode=0,
582
+ stdout=payload.decode(encoding, errors=errors),
583
+ stderr="",
584
+ )
585
+
586
+ with patch(
587
+ "comate_cli.terminal_agent.mention_completer.subprocess.run",
588
+ side_effect=_run_with_windows_locale_default,
589
+ ) as mock_run:
590
+ paths = self.completer._get_paths_from_git()
591
+
592
+ self.assertEqual(paths, ["docs/测.txt"])
593
+ _, kwargs = mock_run.call_args
594
+ self.assertEqual(kwargs.get("encoding"), "utf-8")
595
+ self.assertEqual(kwargs.get("errors"), "replace")
596
+
565
597
  @unittest.skipUnless(shutil.which("git"), "git not available")
566
598
  def test_git_index_handles_chinese_paths_with_default_quotepath(self) -> None:
567
599
  """Bug #1 端到端:在默认 git 配置下(core.quotepath=true),
@@ -609,24 +641,24 @@ class TestLocalFileMentionCompleter(unittest.TestCase):
609
641
  def test_cjk_person_name_prefixes_find_deep_file_from_first_character(self) -> None:
610
642
  """Claude Code 对齐:中文人名/文件名从第一个字符开始就应该进深度 fuzzy。
611
643
 
612
- 固定三字符闸门会让 `@穆`、`@穆雨` 只查顶层,从而漏掉
613
- `Wukong/穆雨晨.pdf`。这个测试锁住真实用户输入路径。
644
+ 固定三字符闸门会让 `@测`、`@测试` 只查顶层,从而漏掉
645
+ `Wukong/测试用户.pdf`。这个测试锁住真实用户输入路径。
614
646
  """
615
647
  with patch(
616
648
  "comate_cli.terminal_agent.mention_completer.subprocess.run",
617
649
  return_value=subprocess.CompletedProcess(
618
650
  args=["git"],
619
651
  returncode=0,
620
- stdout="Wukong/穆雨晨.pdf\n",
652
+ stdout="Wukong/测试用户.pdf\n",
621
653
  stderr="",
622
654
  ),
623
655
  ):
624
- for query in ("@穆", "@穆雨", "@穆雨晨"):
656
+ for query in ("@测", "@测试", "@测试用户"):
625
657
  result = self.completer.suggest(query, max_items=16)
626
658
  self.assertIsNotNone(result, f"suggest({query!r}) returned None")
627
659
  assert result is not None
628
660
  _, candidates = result
629
- self.assertIn("Wukong/穆雨晨.pdf", candidates)
661
+ self.assertIn("Wukong/测试用户.pdf", candidates)
630
662
 
631
663
  def test_short_ascii_query_still_restricted_to_top_level(self) -> None:
632
664
  """Bug #2 反向回归:纯 ASCII 短查询仍然走顶层,避免大仓库性能退化。
File without changes
File without changes
File without changes
File without changes
File without changes