klaude-code 1.4.1__tar.gz → 1.4.3__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 (210) hide show
  1. {klaude_code-1.4.1 → klaude_code-1.4.3}/PKG-INFO +1 -1
  2. {klaude_code-1.4.1 → klaude_code-1.4.3}/pyproject.toml +1 -1
  3. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/completers.py +68 -37
  4. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +145 -8
  5. {klaude_code-1.4.1 → klaude_code-1.4.3}/README.md +0 -0
  6. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/__init__.py +0 -0
  7. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/__init__.py +0 -0
  8. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/codex/__init__.py +0 -0
  9. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/codex/exceptions.py +0 -0
  10. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  11. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/codex/oauth.py +0 -0
  12. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/auth/codex/token_manager.py +0 -0
  13. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/__init__.py +0 -0
  14. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/auth_cmd.py +0 -0
  15. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/config_cmd.py +0 -0
  16. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/debug.py +0 -0
  17. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/list_model.py +0 -0
  18. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/main.py +0 -0
  19. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/runtime.py +0 -0
  20. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/self_update.py +0 -0
  21. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/cli/session_cmd.py +0 -0
  22. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/__init__.py +0 -0
  23. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/clear_cmd.py +0 -0
  24. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/command_abc.py +0 -0
  25. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/debug_cmd.py +0 -0
  26. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/export_cmd.py +0 -0
  27. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/export_online_cmd.py +0 -0
  28. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/fork_session_cmd.py +0 -0
  29. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/help_cmd.py +0 -0
  30. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/model_cmd.py +0 -0
  31. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/prompt-init.md +0 -0
  32. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  33. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/prompt_command.py +0 -0
  34. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/refresh_cmd.py +0 -0
  35. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/registry.py +0 -0
  36. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/release_notes_cmd.py +0 -0
  37. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/resume_cmd.py +0 -0
  38. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/status_cmd.py +0 -0
  39. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  40. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/command/thinking_cmd.py +0 -0
  41. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/__init__.py +0 -0
  42. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/assets/__init__.py +0 -0
  43. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
  44. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/builtin_config.py +0 -0
  45. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/config.py +0 -0
  46. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/config/select_model.py +0 -0
  47. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/const.py +0 -0
  48. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/__init__.py +0 -0
  49. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/agent.py +0 -0
  50. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/executor.py +0 -0
  51. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/manager/__init__.py +0 -0
  52. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/manager/llm_clients.py +0 -0
  53. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  54. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  55. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompt.py +0 -0
  56. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  57. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  58. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  59. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  60. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  61. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  62. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  63. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  64. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  65. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  66. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/reminders.py +0 -0
  67. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/task.py +0 -0
  68. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/__init__.py +0 -0
  69. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/__init__.py +0 -0
  70. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/_utils.py +0 -0
  71. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  72. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  73. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  74. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  75. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  76. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  77. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/move_tool.md +0 -0
  78. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/move_tool.py +0 -0
  79. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  80. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  81. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  82. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  83. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  84. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  85. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  86. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  87. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  88. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  89. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  90. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  91. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  92. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  93. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  94. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  95. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  96. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  97. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  98. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_abc.py +0 -0
  99. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_context.py +0 -0
  100. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_registry.py +0 -0
  101. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/tool_runner.py +0 -0
  102. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/truncation.py +0 -0
  103. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/__init__.py +0 -0
  104. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  105. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  106. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  107. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  108. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  109. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  110. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/core/turn.py +0 -0
  111. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/__init__.py +0 -0
  112. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  113. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/client.py +0 -0
  114. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/anthropic/input.py +0 -0
  115. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/client.py +0 -0
  116. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/codex/__init__.py +0 -0
  117. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/codex/client.py +0 -0
  118. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/input_common.py +0 -0
  119. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  120. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  121. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  122. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  123. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  124. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  125. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/client.py +0 -0
  126. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/input.py +0 -0
  127. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  128. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/registry.py +0 -0
  129. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/responses/__init__.py +0 -0
  130. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/responses/client.py +0 -0
  131. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/responses/input.py +0 -0
  132. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/llm/usage.py +0 -0
  133. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/__init__.py +0 -0
  134. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/commands.py +0 -0
  135. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/events.py +0 -0
  136. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/llm_param.py +0 -0
  137. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/model.py +0 -0
  138. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/op.py +0 -0
  139. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/op_handler.py +0 -0
  140. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  141. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  142. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  143. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  144. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  145. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/protocol/tools.py +0 -0
  146. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/__init__.py +0 -0
  147. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/codec.py +0 -0
  148. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/export.py +0 -0
  149. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/selector.py +0 -0
  150. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/session.py +0 -0
  151. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/store.py +0 -0
  152. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/templates/export_session.html +0 -0
  153. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  154. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/__init__.py +0 -0
  155. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  156. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  157. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  158. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  159. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  160. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/loader.py +0 -0
  161. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/manager.py +0 -0
  162. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/skill/system_skills.py +0 -0
  163. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/trace/__init__.py +0 -0
  164. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/trace/log.py +0 -0
  165. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/__init__.py +0 -0
  166. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/core/__init__.py +0 -0
  167. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/core/display.py +0 -0
  168. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/core/input.py +0 -0
  169. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/core/stage_manager.py +0 -0
  170. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/__init__.py +0 -0
  171. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  172. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/debug/display.py +0 -0
  173. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  174. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/exec/display.py +0 -0
  175. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  176. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  177. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/display.py +0 -0
  178. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
  179. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
  180. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
  181. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/__init__.py +0 -0
  182. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/assistant.py +0 -0
  183. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/bash_syntax.py +0 -0
  184. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/common.py +0 -0
  185. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/developer.py +0 -0
  186. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/diffs.py +0 -0
  187. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/errors.py +0 -0
  188. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
  189. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/metadata.py +0 -0
  190. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  191. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/thinking.py +0 -0
  192. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/tools.py +0 -0
  193. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/renderers/user_input.py +0 -0
  194. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/__init__.py +0 -0
  195. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  196. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/code_panel.py +0 -0
  197. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/live.py +0 -0
  198. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/markdown.py +0 -0
  199. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/quote.py +0 -0
  200. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  201. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/status.py +0 -0
  202. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/rich/theme.py +0 -0
  203. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/__init__.py +0 -0
  204. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/color.py +0 -0
  205. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/control.py +0 -0
  206. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/notifier.py +0 -0
  207. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  208. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/terminal/selector.py +0 -0
  209. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/utils/__init__.py +0 -0
  210. {klaude_code-1.4.1 → klaude_code-1.4.3}/src/klaude_code/ui/utils/common.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 1.4.1
3
+ Version: 1.4.3
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -4,7 +4,7 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "1.4.1"
7
+ version = "1.4.3"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -25,9 +25,9 @@ from typing import NamedTuple
25
25
 
26
26
  from prompt_toolkit.completion import Completer, Completion
27
27
  from prompt_toolkit.document import Document
28
- from prompt_toolkit.formatted_text import HTML
28
+ from prompt_toolkit.formatted_text import FormattedText
29
29
 
30
- from klaude_code.command import get_commands
30
+ from klaude_code.command import CommandABC, get_commands
31
31
  from klaude_code.trace.log import DebugType, log_debug
32
32
 
33
33
  # Pattern to match @token for completion refresh (used by key bindings).
@@ -88,7 +88,7 @@ class _SlashCommandCompleter(Completer):
88
88
  commands = get_commands()
89
89
 
90
90
  # Filter commands that match the fragment (preserve registration order)
91
- matched: list[tuple[str, object, str]] = []
91
+ matched: list[tuple[str, CommandABC, str]] = []
92
92
  for cmd_name, cmd_obj in commands.items():
93
93
  if cmd_name.startswith(frag):
94
94
  hint = f" [{cmd_obj.placeholder}]" if cmd_obj.support_addition_params else ""
@@ -97,25 +97,15 @@ class _SlashCommandCompleter(Completer):
97
97
  if not matched:
98
98
  return
99
99
 
100
- # Calculate max width for alignment
101
- # Find the longest command+hint length
102
- max_len = max(len(name) + len(hint) for name, _, hint in matched)
103
- # Set a minimum width (e.g. 20) and add some padding
104
- align_width = max(max_len, 20) + 2
105
-
106
100
  for cmd_name, cmd_obj, hint in matched:
107
- label_len = len(cmd_name) + len(hint)
108
- padding = " " * (align_width - label_len)
109
-
110
- # Using HTML for formatting: bold command name, normal hint, gray summary
111
- display_text = HTML(
112
- f"<b>{cmd_name}</b>{hint}{padding}<style color='ansibrightblack'>{cmd_obj.summary}</style>" # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
113
- )
114
101
  completion_text = f"/{cmd_name} "
102
+ # Use FormattedText to style the hint (placeholder) in bright black
103
+ display = FormattedText([("", cmd_name), ("ansibrightblack", hint)]) if hint else cmd_name
115
104
  yield Completion(
116
105
  text=completion_text,
117
106
  start_position=start_position,
118
- display=display_text,
107
+ display=display,
108
+ display_meta=str(cmd_obj.summary),
119
109
  )
120
110
 
121
111
  def is_slash_command_context(self, document: Document) -> bool:
@@ -171,26 +161,18 @@ class _SkillCompleter(Completer):
171
161
  if not matched:
172
162
  return
173
163
 
174
- # Calculate max width for alignment
175
- max_name_len = max(len(name) for name, _, _ in matched)
176
- align_width = max(max_name_len, 20) + 2
164
+ # Calculate max location length for alignment
165
+ max_loc_len = max(len(loc) for _, _, loc in matched)
177
166
 
178
167
  for name, desc, location in matched:
179
- # Format: name [location] description
180
- # Align location tags (max length is "project" = 7, plus brackets = 9)
181
- padding_name = " " * (align_width - len(name))
182
- location_tag = f"[{location}]".ljust(9)
183
-
184
- # Using HTML for formatting: bold skill name, cyan location tag, gray description
185
- display_text = HTML(
186
- f"<b>{name}</b>{padding_name}<style color='ansicyan'>{location_tag}</style> "
187
- f"<style color='ansibrightblack'>{desc}</style>"
188
- )
189
168
  completion_text = f"${name} "
169
+ # Pad location to align descriptions
170
+ padded_location = f"[{location}]".ljust(max_loc_len + 2) # +2 for brackets
190
171
  yield Completion(
191
172
  text=completion_text,
192
173
  start_position=start_position,
193
- display=display_text,
174
+ display=name,
175
+ display_meta=f"{padded_location} {desc}",
194
176
  )
195
177
 
196
178
  def _get_available_skills(self) -> list[tuple[str, str, str]]:
@@ -322,7 +304,8 @@ class _AtFilesCompleter(Completer):
322
304
  yield Completion(
323
305
  text=self._format_completion_text(s, is_quoted=is_quoted),
324
306
  start_position=start_position,
325
- display=s,
307
+ display=self._format_display_label(s, 0),
308
+ display_meta=s,
326
309
  )
327
310
  return [] # type: ignore[reportUnknownVariableType]
328
311
 
@@ -338,7 +321,8 @@ class _AtFilesCompleter(Completer):
338
321
  yield Completion(
339
322
  text=self._format_completion_text(s, is_quoted=is_quoted),
340
323
  start_position=start_position,
341
- display=s,
324
+ display=self._format_display_label(s, 0),
325
+ display_meta=s,
342
326
  )
343
327
 
344
328
  # ---- Core logic ----
@@ -457,11 +441,13 @@ class _AtFilesCompleter(Completer):
457
441
  keyword_norm: str,
458
442
  ) -> list[str]:
459
443
  # Filter to keyword (case-insensitive) and rank by:
460
- # 1. Directory depth (shallower first)
461
- # 2. Basename hit first, then path hit position, then length
444
+ # 1. Hidden files (starting with .) are deprioritized
445
+ # 2. Paths containing "test" are deprioritized
446
+ # 3. Directory depth (shallower first)
447
+ # 4. Basename hit first, then path hit position, then length
462
448
  # Since both fd and rg now search from current directory, all paths are relative to cwd
463
449
  kn = keyword_norm
464
- out: list[tuple[str, tuple[int, int, int, int, int]]] = []
450
+ out: list[tuple[str, tuple[int, int, int, int, int, int, int]]] = []
465
451
  for p in paths_from_root:
466
452
  pl = p.lower()
467
453
  if kn not in pl:
@@ -477,7 +463,15 @@ class _AtFilesCompleter(Completer):
477
463
  base_pos = base.find(kn)
478
464
  path_pos = pl.find(kn)
479
465
  depth = rel_to_cwd.rstrip("/").count("/")
466
+
467
+ # Deprioritize hidden files/directories (any path segment starting with .)
468
+ is_hidden = any(seg.startswith(".") for seg in rel_to_cwd.split("/") if seg)
469
+ # Deprioritize paths containing "test"
470
+ has_test = "test" in pl
471
+
480
472
  score = (
473
+ 1 if is_hidden else 0,
474
+ 1 if has_test else 0,
481
475
  depth,
482
476
  0 if base_pos != -1 else 1,
483
477
  base_pos if base_pos != -1 else 10_000,
@@ -523,6 +517,34 @@ class _AtFilesCompleter(Completer):
523
517
  return f'@"{suggestion}" '
524
518
  return f"@{suggestion} "
525
519
 
520
+ def _format_display_label(self, suggestion: str, align_width: int) -> str:
521
+ """Format visible label for a completion option.
522
+
523
+ Keep this unstyled so that the completion menu's selection style can
524
+ fully override the selected row.
525
+ """
526
+
527
+ _ = align_width
528
+ return self._display_name(suggestion)
529
+
530
+ def _display_align_width(self, suggestions: list[str]) -> int:
531
+ """Calculate alignment width for display labels."""
532
+
533
+ return max((len(self._display_name(s)) for s in suggestions), default=0)
534
+
535
+ def _display_name(self, suggestion: str) -> str:
536
+ """Return the basename (with trailing slash for directories) for display."""
537
+
538
+ if not suggestion:
539
+ return suggestion
540
+
541
+ is_dir = suggestion.endswith("/")
542
+ stripped = suggestion.rstrip("/")
543
+ base = stripped.split("/")[-1] if stripped else suggestion
544
+ if is_dir:
545
+ return f"{base}/"
546
+ return base
547
+
526
548
  def _same_scope(self, prev_key: str, cur_key: str) -> bool:
527
549
  # Consider same scope if they share the same base directory and one prefix startswith the other
528
550
  try:
@@ -677,11 +699,20 @@ class _AtFilesCompleter(Completer):
677
699
 
678
700
  Avoids running external tools; shows immediate directories first, then files.
679
701
  Filters out .git, .venv, and node_modules to reduce noise.
702
+ Hidden files and paths containing "test" are deprioritized.
680
703
  """
681
704
  excluded = {".git", ".venv", "node_modules"}
682
705
  items: list[str] = []
683
706
  try:
684
- for p in sorted(cwd.iterdir(), key=lambda x: (not x.is_dir(), x.name.lower())):
707
+ # Sort by: hidden files last, test paths last, directories first, then name
708
+ def sort_key(p: Path) -> tuple[int, int, int, str]:
709
+ name = p.name
710
+ is_hidden = name.startswith(".")
711
+ has_test = "test" in name.lower()
712
+ is_file = not p.is_dir()
713
+ return (1 if is_hidden else 0, 1 if has_test else 0, 1 if is_file else 0, name.lower())
714
+
715
+ for p in sorted(cwd.iterdir(), key=sort_key):
685
716
  name = p.name
686
717
  if name in excluded:
687
718
  continue
@@ -6,13 +6,20 @@ from collections.abc import AsyncIterator, Callable
6
6
  from pathlib import Path
7
7
  from typing import NamedTuple, override
8
8
 
9
+ import prompt_toolkit.layout.menus as pt_menus
9
10
  from prompt_toolkit import PromptSession
10
- from prompt_toolkit.completion import ThreadedCompleter
11
+ from prompt_toolkit.application.current import get_app
12
+ from prompt_toolkit.completion import Completion, ThreadedCompleter
11
13
  from prompt_toolkit.cursor_shapes import CursorShape
12
- from prompt_toolkit.formatted_text import FormattedText
14
+ from prompt_toolkit.data_structures import Point
15
+ from prompt_toolkit.formatted_text import FormattedText, StyleAndTextTuples, to_formatted_text
13
16
  from prompt_toolkit.history import FileHistory
17
+ from prompt_toolkit.layout.containers import Container, FloatContainer, Window
18
+ from prompt_toolkit.layout.controls import UIContent
19
+ from prompt_toolkit.layout.menus import CompletionsMenu, MultiColumnCompletionsMenu
14
20
  from prompt_toolkit.patch_stdout import patch_stdout
15
21
  from prompt_toolkit.styles import Style
22
+ from prompt_toolkit.utils import get_cwidth
16
23
 
17
24
  from klaude_code.protocol.model import UserInputPayload
18
25
  from klaude_code.ui.core.input import InputProviderABC
@@ -29,9 +36,9 @@ class REPLStatusSnapshot(NamedTuple):
29
36
  update_message: str | None = None
30
37
 
31
38
 
32
- COMPLETION_SELECTED_DARK_BG = "#8b9bff"
33
- COMPLETION_SELECTED_LIGHT_BG = "#5869f7"
34
- COMPLETION_SELECTED_UNKNOWN_BG = "#7080f0"
39
+ COMPLETION_SELECTED_DARK_BG = "ansigreen"
40
+ COMPLETION_SELECTED_LIGHT_BG = "ansigreen"
41
+ COMPLETION_SELECTED_UNKNOWN_BG = "ansigreen"
35
42
  COMPLETION_MENU = "ansibrightblack"
36
43
  INPUT_PROMPT_STYLE = "ansimagenta bold"
37
44
  PLACEHOLDER_TEXT_STYLE_DARK_BG = "fg:#5a5a5a italic"
@@ -42,6 +49,128 @@ PLACEHOLDER_SYMBOL_STYLE_LIGHT_BG = "bg:#e6e6e6 fg:#7a7a7a"
42
49
  PLACEHOLDER_SYMBOL_STYLE_UNKNOWN_BG = "bg:#2a2a2a fg:#8a8a8a"
43
50
 
44
51
 
52
+ def _left_align_completion_menus(container: Container) -> None:
53
+ """Force completion menus to render at column 0.
54
+
55
+ prompt_toolkit's default completion menu floats are positioned relative to the
56
+ cursor (`xcursor=True`). That makes the popup indent as the caret moves.
57
+ We walk the layout tree and rewrite the Float positioning for completion menus
58
+ to keep them fixed at the left edge.
59
+ """
60
+
61
+ if isinstance(container, FloatContainer):
62
+ for flt in container.floats:
63
+ if isinstance(flt.content, (CompletionsMenu, MultiColumnCompletionsMenu)):
64
+ flt.xcursor = False
65
+ flt.left = 0
66
+
67
+ for child in container.get_children():
68
+ _left_align_completion_menus(child)
69
+
70
+
71
+ class _KlaudeCompletionsMenuControl(pt_menus.CompletionsMenuControl):
72
+ """CompletionsMenuControl with stable 2-char left prefix.
73
+
74
+ Requirements:
75
+ - Add a 2-character prefix for every row.
76
+ - Render "→ " for the selected row, and " " for non-selected rows.
77
+
78
+ Keep completion text unstyled so that the menu's current-row style can
79
+ override it entirely.
80
+ """
81
+
82
+ _PREFIX_WIDTH = 2
83
+
84
+ def _get_menu_width(self, max_width: int, complete_state: pt_menus.CompletionState) -> int: # pyright: ignore[reportPrivateImportUsage]
85
+ """Return the width of the main column.
86
+
87
+ This is prompt_toolkit's default implementation, except we reserve one
88
+ extra character for the 2-char prefix ("→ "/" ").
89
+ """
90
+
91
+ return min(
92
+ max_width,
93
+ max(
94
+ self.MIN_WIDTH,
95
+ max(get_cwidth(c.display_text) for c in complete_state.completions) + 3,
96
+ ),
97
+ )
98
+
99
+ def create_content(self, width: int, height: int) -> UIContent:
100
+ complete_state = get_app().current_buffer.complete_state
101
+ if complete_state:
102
+ completions = complete_state.completions
103
+ index = complete_state.complete_index
104
+
105
+ menu_width = self._get_menu_width(width, complete_state)
106
+ menu_meta_width = self._get_menu_meta_width(width - menu_width, complete_state)
107
+ show_meta = self._show_meta(complete_state)
108
+
109
+ def get_line(i: int) -> StyleAndTextTuples:
110
+ completion = completions[i]
111
+ is_current_completion = i == index
112
+
113
+ result = self._get_menu_item_fragments_with_cursor(
114
+ completion,
115
+ is_current_completion,
116
+ menu_width,
117
+ space_after=True,
118
+ )
119
+ if show_meta:
120
+ result += self._get_menu_item_meta_fragments(
121
+ completion,
122
+ is_current_completion,
123
+ menu_meta_width,
124
+ )
125
+ return result
126
+
127
+ return UIContent(
128
+ get_line=get_line,
129
+ cursor_position=Point(x=0, y=index or 0),
130
+ line_count=len(completions),
131
+ )
132
+
133
+ return UIContent()
134
+
135
+ def _get_menu_item_fragments_with_cursor(
136
+ self,
137
+ completion: Completion,
138
+ is_current_completion: bool,
139
+ width: int,
140
+ *,
141
+ space_after: bool = False,
142
+ ) -> StyleAndTextTuples:
143
+ if is_current_completion:
144
+ style_str = f"class:completion-menu.completion.current {completion.style} {completion.selected_style}"
145
+ prefix = "→ "
146
+ else:
147
+ style_str = "class:completion-menu.completion " + completion.style
148
+ prefix = " "
149
+
150
+ max_text_width = width - self._PREFIX_WIDTH - (1 if space_after else 0)
151
+ text, text_width = pt_menus._trim_formatted_text(completion.display, max_text_width) # pyright: ignore[reportPrivateUsage]
152
+ padding = " " * (width - self._PREFIX_WIDTH - text_width)
153
+
154
+ return to_formatted_text(
155
+ [("", prefix), *text, ("", padding)],
156
+ style=style_str,
157
+ )
158
+
159
+
160
+ def _patch_completion_menu_controls(container: Container) -> None:
161
+ """Replace prompt_toolkit completion menu controls with customized versions."""
162
+
163
+ if isinstance(container, Window):
164
+ content = container.content
165
+ if isinstance(content, pt_menus.CompletionsMenuControl) and not isinstance(
166
+ content, _KlaudeCompletionsMenuControl
167
+ ):
168
+ container.content = _KlaudeCompletionsMenuControl()
169
+
170
+ for child in container.get_children():
171
+ _patch_completion_menu_controls(child)
172
+
173
+
45
174
  class PromptToolkitInput(InputProviderABC):
46
175
  def __init__(
47
176
  self,
@@ -98,14 +227,22 @@ class PromptToolkitInput(InputProviderABC):
98
227
  "completion-menu.border": "bg:default",
99
228
  "scrollbar.background": "bg:default",
100
229
  "scrollbar.button": "bg:default",
101
- "completion-menu.completion": f"bg:default fg:{COMPLETION_MENU}",
230
+ "completion-menu.completion": "bg:default fg:default",
102
231
  "completion-menu.meta.completion": f"bg:default fg:{COMPLETION_MENU}",
103
- "completion-menu.completion.current": f"noreverse bg:default fg:{completion_selected} bold",
104
- "completion-menu.meta.completion.current": f"bg:default fg:{completion_selected} bold",
232
+ "completion-menu.completion.current": f"noreverse bg:default fg:{completion_selected}",
233
+ "completion-menu.meta.completion.current": f"bg:default fg:{completion_selected}",
105
234
  }
106
235
  ),
107
236
  )
108
237
 
238
+ # Keep completion popups left-aligned instead of shifting with the caret.
239
+ with contextlib.suppress(Exception):
240
+ _left_align_completion_menus(self._session.app.layout.container)
241
+
242
+ # Customize completion rendering (2-space indent + selected arrow prefix).
243
+ with contextlib.suppress(Exception):
244
+ _patch_completion_menu_controls(self._session.app.layout.container)
245
+
109
246
  def _select_first_completion_on_open(buf) -> None: # type: ignore[no-untyped-def]
110
247
  """Default to selecting the first completion without inserting it."""
111
248
 
File without changes