klaude-code 1.4.0__tar.gz → 1.4.2__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.0 → klaude_code-1.4.2}/PKG-INFO +1 -1
  2. {klaude_code-1.4.0 → klaude_code-1.4.2}/pyproject.toml +1 -1
  3. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/thinking_cmd.py +4 -1
  4. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/select_model.py +7 -7
  5. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/completers.py +65 -12
  6. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +25 -0
  7. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/selector.py +20 -10
  8. {klaude_code-1.4.0 → klaude_code-1.4.2}/README.md +0 -0
  9. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/__init__.py +0 -0
  10. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/__init__.py +0 -0
  11. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/codex/__init__.py +0 -0
  12. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/codex/exceptions.py +0 -0
  13. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  14. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/codex/oauth.py +0 -0
  15. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/auth/codex/token_manager.py +0 -0
  16. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/__init__.py +0 -0
  17. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/auth_cmd.py +0 -0
  18. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/config_cmd.py +0 -0
  19. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/debug.py +0 -0
  20. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/list_model.py +0 -0
  21. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/main.py +0 -0
  22. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/runtime.py +0 -0
  23. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/self_update.py +0 -0
  24. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/cli/session_cmd.py +0 -0
  25. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/__init__.py +0 -0
  26. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/clear_cmd.py +0 -0
  27. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/command_abc.py +0 -0
  28. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/debug_cmd.py +0 -0
  29. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/export_cmd.py +0 -0
  30. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/export_online_cmd.py +0 -0
  31. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/fork_session_cmd.py +0 -0
  32. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/help_cmd.py +0 -0
  33. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/model_cmd.py +0 -0
  34. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/prompt-init.md +0 -0
  35. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  36. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/prompt_command.py +0 -0
  37. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/refresh_cmd.py +0 -0
  38. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/registry.py +0 -0
  39. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/release_notes_cmd.py +0 -0
  40. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/resume_cmd.py +0 -0
  41. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/status_cmd.py +0 -0
  42. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  43. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/__init__.py +0 -0
  44. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/assets/__init__.py +0 -0
  45. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/assets/builtin_config.yaml +0 -0
  46. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/builtin_config.py +0 -0
  47. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/config/config.py +0 -0
  48. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/const.py +0 -0
  49. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/__init__.py +0 -0
  50. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/agent.py +0 -0
  51. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/executor.py +0 -0
  52. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/manager/__init__.py +0 -0
  53. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/manager/llm_clients.py +0 -0
  54. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/manager/llm_clients_builder.py +0 -0
  55. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  56. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompt.py +0 -0
  57. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  58. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  59. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  60. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  61. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  62. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  63. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  64. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  65. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  66. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  67. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/reminders.py +0 -0
  68. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/task.py +0 -0
  69. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/__init__.py +0 -0
  70. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/__init__.py +0 -0
  71. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/_utils.py +0 -0
  72. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  73. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  74. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  75. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  76. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  77. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/edit_tool.py +0 -0
  78. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/move_tool.md +0 -0
  79. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/move_tool.py +0 -0
  80. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  81. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  82. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  83. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/file/write_tool.py +0 -0
  84. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  85. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  86. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  87. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/shell/bash_tool.py +0 -0
  88. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  89. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  90. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  91. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  92. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  93. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  94. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  95. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  96. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  97. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  98. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  99. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/tool_abc.py +0 -0
  100. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/tool_context.py +0 -0
  101. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/tool_registry.py +0 -0
  102. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/tool_runner.py +0 -0
  103. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/truncation.py +0 -0
  104. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/__init__.py +0 -0
  105. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/mermaid_tool.md +0 -0
  106. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/mermaid_tool.py +0 -0
  107. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  108. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  109. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  110. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  111. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/core/turn.py +0 -0
  112. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/__init__.py +0 -0
  113. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  114. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/anthropic/client.py +0 -0
  115. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/anthropic/input.py +0 -0
  116. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/client.py +0 -0
  117. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/codex/__init__.py +0 -0
  118. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/codex/client.py +0 -0
  119. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/input_common.py +0 -0
  120. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  121. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  122. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  123. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openai_compatible/stream.py +0 -0
  124. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +0 -0
  125. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  126. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openrouter/client.py +0 -0
  127. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openrouter/input.py +0 -0
  128. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  129. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/registry.py +0 -0
  130. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/responses/__init__.py +0 -0
  131. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/responses/client.py +0 -0
  132. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/responses/input.py +0 -0
  133. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/llm/usage.py +0 -0
  134. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/__init__.py +0 -0
  135. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/commands.py +0 -0
  136. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/events.py +0 -0
  137. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/llm_param.py +0 -0
  138. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/model.py +0 -0
  139. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/op.py +0 -0
  140. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/op_handler.py +0 -0
  141. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  142. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  143. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  144. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  145. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  146. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/protocol/tools.py +0 -0
  147. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/__init__.py +0 -0
  148. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/codec.py +0 -0
  149. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/export.py +0 -0
  150. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/selector.py +0 -0
  151. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/session.py +0 -0
  152. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/store.py +0 -0
  153. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/templates/export_session.html +0 -0
  154. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/session/templates/mermaid_viewer.html +0 -0
  155. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/__init__.py +0 -0
  156. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  157. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  158. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  159. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  160. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  161. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/loader.py +0 -0
  162. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/manager.py +0 -0
  163. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/skill/system_skills.py +0 -0
  164. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/trace/__init__.py +0 -0
  165. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/trace/log.py +0 -0
  166. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/__init__.py +0 -0
  167. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/core/__init__.py +0 -0
  168. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/core/display.py +0 -0
  169. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/core/input.py +0 -0
  170. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/core/stage_manager.py +0 -0
  171. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/__init__.py +0 -0
  172. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  173. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/debug/display.py +0 -0
  174. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  175. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/exec/display.py +0 -0
  176. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/__init__.py +0 -0
  177. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  178. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/display.py +0 -0
  179. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/event_handler.py +0 -0
  180. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/key_bindings.py +0 -0
  181. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/modes/repl/renderer.py +0 -0
  182. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/__init__.py +0 -0
  183. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/assistant.py +0 -0
  184. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/bash_syntax.py +0 -0
  185. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/common.py +0 -0
  186. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/developer.py +0 -0
  187. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/diffs.py +0 -0
  188. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/errors.py +0 -0
  189. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/mermaid_viewer.py +0 -0
  190. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/metadata.py +0 -0
  191. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  192. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/thinking.py +0 -0
  193. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/tools.py +0 -0
  194. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/renderers/user_input.py +0 -0
  195. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/__init__.py +0 -0
  196. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  197. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/code_panel.py +0 -0
  198. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/live.py +0 -0
  199. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/markdown.py +0 -0
  200. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/quote.py +0 -0
  201. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  202. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/status.py +0 -0
  203. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/rich/theme.py +0 -0
  204. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/__init__.py +0 -0
  205. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/color.py +0 -0
  206. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/control.py +0 -0
  207. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/notifier.py +0 -0
  208. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  209. {klaude_code-1.4.0 → klaude_code-1.4.2}/src/klaude_code/ui/utils/__init__.py +0 -0
  210. {klaude_code-1.4.0 → klaude_code-1.4.2}/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.0
3
+ Version: 1.4.2
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.0"
7
+ version = "1.4.2"
8
8
  description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ from typing import Literal, cast
2
3
 
3
4
  from prompt_toolkit.styles import Style
4
5
 
@@ -6,6 +7,8 @@ from klaude_code.command.command_abc import Agent, CommandABC, CommandResult
6
7
  from klaude_code.protocol import commands, events, llm_param, model
7
8
  from klaude_code.ui.terminal.selector import SelectItem, select_one
8
9
 
10
+ ReasoningEffort = Literal["high", "medium", "low", "minimal", "none", "xhigh"]
11
+
9
12
  # Thinking level options for different protocols
10
13
  RESPONSES_LEVELS = ["low", "medium", "high"]
11
14
  RESPONSES_GPT51_LEVELS = ["none", "low", "medium", "high"]
@@ -148,7 +151,7 @@ def _select_responses_thinking_sync(model_name: str | None) -> llm_param.Thinkin
148
151
 
149
152
  if result is None:
150
153
  return None
151
- return llm_param.Thinking(reasoning_effort=result)
154
+ return llm_param.Thinking(reasoning_effort=cast(ReasoningEffort, result))
152
155
  except KeyboardInterrupt:
153
156
  return None
154
157
 
@@ -119,7 +119,7 @@ def select_model_from_config(preferred: str | None = None) -> str | None:
119
119
  if not thinking:
120
120
  return ""
121
121
  if thinking.reasoning_effort:
122
- return f"reasoning effort {thinking.reasoning_effort}"
122
+ return f"reasoning {thinking.reasoning_effort}"
123
123
  if thinking.budget_tokens:
124
124
  return f"thinking budget {thinking.budget_tokens}"
125
125
  return "thinking (configured)"
@@ -127,18 +127,18 @@ def select_model_from_config(preferred: str | None = None) -> str | None:
127
127
  items: list[SelectItem[str]] = []
128
128
  for m in filtered_models:
129
129
  model_id = m.model_params.model or "N/A"
130
- first_line_prefix = f"{m.model_name:<{max_model_name_length}} → "
130
+ first_line_prefix = f"{m.model_name:<{max_model_name_length}} → "
131
131
  thinking_info = _thinking_info(m)
132
- meta_parts = [m.provider]
132
+ meta_parts: list[str] = [m.provider]
133
133
  if thinking_info:
134
134
  meta_parts.append(thinking_info)
135
135
  if m.model_params.verbosity:
136
136
  meta_parts.append(f"verbosity {m.model_params.verbosity}")
137
- meta_line = " " + " · ".join(meta_parts)
137
+ meta_str = " · ".join(meta_parts)
138
138
  title = [
139
139
  ("class:msg", first_line_prefix),
140
- ("class:msg bold", f"{model_id}\n"),
141
- ("class:meta", f"{meta_line}\n\n"),
140
+ ("class:msg bold", model_id),
141
+ ("class:meta", f" {meta_str}\n"),
142
142
  ]
143
143
  search_text = f"{m.model_name} {model_id} {m.provider}"
144
144
  items.append(SelectItem(title=title, value=m.model_name, search_text=search_text))
@@ -158,7 +158,7 @@ def select_model_from_config(preferred: str | None = None) -> str | None:
158
158
  ("msg", ""),
159
159
  ("meta", "fg:ansibrightblack"),
160
160
  ("text", "ansibrightblack"),
161
- ("question", ""),
161
+ ("question", "bold"),
162
162
  ("search_prefix", "ansibrightblack"),
163
163
  # search filter colors at the bottom
164
164
  ("search_success", "noinherit fg:ansigreen"),
@@ -107,9 +107,9 @@ class _SlashCommandCompleter(Completer):
107
107
  label_len = len(cmd_name) + len(hint)
108
108
  padding = " " * (align_width - label_len)
109
109
 
110
- # Using HTML for formatting: bold command name, normal hint, gray summary
110
+ # Using HTML for formatting: default color command name, normal hint, gray summary
111
111
  display_text = HTML(
112
- f"<b>{cmd_name}</b>{hint}{padding}<style color='ansibrightblack'>{cmd_obj.summary}</style>" # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
112
+ f"<style color='ansidefault'>{cmd_name}</style>{hint}{padding}<style color='ansibrightblack'>{cmd_obj.summary}</style>" # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue]
113
113
  )
114
114
  completion_text = f"/{cmd_name} "
115
115
  yield Completion(
@@ -181,9 +181,9 @@ class _SkillCompleter(Completer):
181
181
  padding_name = " " * (align_width - len(name))
182
182
  location_tag = f"[{location}]".ljust(9)
183
183
 
184
- # Using HTML for formatting: bold skill name, cyan location tag, gray description
184
+ # Using HTML for formatting: default color skill name, cyan location tag, gray description
185
185
  display_text = HTML(
186
- f"<b>{name}</b>{padding_name}<style color='ansicyan'>{location_tag}</style> "
186
+ f"<style color='ansidefault'>{name}</style>{padding_name}<style color='ansicyan'>{location_tag}</style> "
187
187
  f"<style color='ansibrightblack'>{desc}</style>"
188
188
  )
189
189
  completion_text = f"${name} "
@@ -318,11 +318,14 @@ class _AtFilesCompleter(Completer):
318
318
  if not suggestions:
319
319
  return [] # type: ignore[reportUnknownVariableType]
320
320
  start_position = token_start_in_input - len(text_before)
321
- for s in suggestions[: self._max_results]:
321
+ visible_suggestions = suggestions[: self._max_results]
322
+ display_align = self._display_align_width(visible_suggestions)
323
+
324
+ for s in visible_suggestions:
322
325
  yield Completion(
323
326
  text=self._format_completion_text(s, is_quoted=is_quoted),
324
327
  start_position=start_position,
325
- display=s,
328
+ display=self._format_display_label(s, display_align),
326
329
  )
327
330
  return [] # type: ignore[reportUnknownVariableType]
328
331
 
@@ -333,12 +336,15 @@ class _AtFilesCompleter(Completer):
333
336
 
334
337
  # Prepare Completion objects. Replace from the '@' character.
335
338
  start_position = token_start_in_input - len(text_before) # negative
336
- for s in suggestions[: self._max_results]:
339
+ visible_suggestions = suggestions[: self._max_results]
340
+ display_align = self._display_align_width(visible_suggestions)
341
+
342
+ for s in visible_suggestions:
337
343
  # Insert formatted text (with quoting when needed) so that subsequent typing does not keep triggering
338
344
  yield Completion(
339
345
  text=self._format_completion_text(s, is_quoted=is_quoted),
340
346
  start_position=start_position,
341
- display=s,
347
+ display=self._format_display_label(s, display_align),
342
348
  )
343
349
 
344
350
  # ---- Core logic ----
@@ -457,11 +463,13 @@ class _AtFilesCompleter(Completer):
457
463
  keyword_norm: str,
458
464
  ) -> list[str]:
459
465
  # 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
466
+ # 1. Hidden files (starting with .) are deprioritized
467
+ # 2. Paths containing "test" are deprioritized
468
+ # 3. Directory depth (shallower first)
469
+ # 4. Basename hit first, then path hit position, then length
462
470
  # Since both fd and rg now search from current directory, all paths are relative to cwd
463
471
  kn = keyword_norm
464
- out: list[tuple[str, tuple[int, int, int, int, int]]] = []
472
+ out: list[tuple[str, tuple[int, int, int, int, int, int, int]]] = []
465
473
  for p in paths_from_root:
466
474
  pl = p.lower()
467
475
  if kn not in pl:
@@ -477,7 +485,15 @@ class _AtFilesCompleter(Completer):
477
485
  base_pos = base.find(kn)
478
486
  path_pos = pl.find(kn)
479
487
  depth = rel_to_cwd.rstrip("/").count("/")
488
+
489
+ # Deprioritize hidden files/directories (any path segment starting with .)
490
+ is_hidden = any(seg.startswith(".") for seg in rel_to_cwd.split("/") if seg)
491
+ # Deprioritize paths containing "test"
492
+ has_test = "test" in pl
493
+
480
494
  score = (
495
+ 1 if is_hidden else 0,
496
+ 1 if has_test else 0,
481
497
  depth,
482
498
  0 if base_pos != -1 else 1,
483
499
  base_pos if base_pos != -1 else 10_000,
@@ -523,6 +539,34 @@ class _AtFilesCompleter(Completer):
523
539
  return f'@"{suggestion}" '
524
540
  return f"@{suggestion} "
525
541
 
542
+ def _format_display_label(self, suggestion: str, align_width: int) -> HTML:
543
+ """Format visible label for a completion option.
544
+
545
+ Shows the basename (or directory name) aligned, followed by the full path in gray.
546
+ """
547
+
548
+ name = self._display_name(suggestion)
549
+ padding = " " * (max(align_width - len(name), 0) + 2)
550
+ return HTML(f"<style color='ansidefault'>{name}</style>{padding}<style color='ansibrightblack'>{suggestion}</style>")
551
+
552
+ def _display_align_width(self, suggestions: list[str]) -> int:
553
+ """Calculate alignment width for display labels."""
554
+
555
+ return max((len(self._display_name(s)) for s in suggestions), default=0)
556
+
557
+ def _display_name(self, suggestion: str) -> str:
558
+ """Return the basename (with trailing slash for directories) for display."""
559
+
560
+ if not suggestion:
561
+ return suggestion
562
+
563
+ is_dir = suggestion.endswith("/")
564
+ stripped = suggestion.rstrip("/")
565
+ base = stripped.split("/")[-1] if stripped else suggestion
566
+ if is_dir:
567
+ return f"{base}/"
568
+ return base
569
+
526
570
  def _same_scope(self, prev_key: str, cur_key: str) -> bool:
527
571
  # Consider same scope if they share the same base directory and one prefix startswith the other
528
572
  try:
@@ -677,11 +721,20 @@ class _AtFilesCompleter(Completer):
677
721
 
678
722
  Avoids running external tools; shows immediate directories first, then files.
679
723
  Filters out .git, .venv, and node_modules to reduce noise.
724
+ Hidden files and paths containing "test" are deprioritized.
680
725
  """
681
726
  excluded = {".git", ".venv", "node_modules"}
682
727
  items: list[str] = []
683
728
  try:
684
- for p in sorted(cwd.iterdir(), key=lambda x: (not x.is_dir(), x.name.lower())):
729
+ # Sort by: hidden files last, test paths last, directories first, then name
730
+ def sort_key(p: Path) -> tuple[int, int, int, str]:
731
+ name = p.name
732
+ is_hidden = name.startswith(".")
733
+ has_test = "test" in name.lower()
734
+ is_file = not p.is_dir()
735
+ return (1 if is_hidden else 0, 1 if has_test else 0, 1 if is_file else 0, name.lower())
736
+
737
+ for p in sorted(cwd.iterdir(), key=sort_key):
685
738
  name = p.name
686
739
  if name in excluded:
687
740
  continue
@@ -11,6 +11,8 @@ from prompt_toolkit.completion import ThreadedCompleter
11
11
  from prompt_toolkit.cursor_shapes import CursorShape
12
12
  from prompt_toolkit.formatted_text import FormattedText
13
13
  from prompt_toolkit.history import FileHistory
14
+ from prompt_toolkit.layout.containers import Container, FloatContainer
15
+ from prompt_toolkit.layout.menus import CompletionsMenu, MultiColumnCompletionsMenu
14
16
  from prompt_toolkit.patch_stdout import patch_stdout
15
17
  from prompt_toolkit.styles import Style
16
18
 
@@ -42,6 +44,25 @@ PLACEHOLDER_SYMBOL_STYLE_LIGHT_BG = "bg:#e6e6e6 fg:#7a7a7a"
42
44
  PLACEHOLDER_SYMBOL_STYLE_UNKNOWN_BG = "bg:#2a2a2a fg:#8a8a8a"
43
45
 
44
46
 
47
+ def _left_align_completion_menus(container: Container) -> None:
48
+ """Force completion menus to render at column 0.
49
+
50
+ prompt_toolkit's default completion menu floats are positioned relative to the
51
+ cursor (`xcursor=True`). That makes the popup indent as the caret moves.
52
+ We walk the layout tree and rewrite the Float positioning for completion menus
53
+ to keep them fixed at the left edge.
54
+ """
55
+
56
+ if isinstance(container, FloatContainer):
57
+ for flt in container.floats:
58
+ if isinstance(flt.content, (CompletionsMenu, MultiColumnCompletionsMenu)):
59
+ flt.xcursor = False
60
+ flt.left = 0
61
+
62
+ for child in container.get_children():
63
+ _left_align_completion_menus(child)
64
+
65
+
45
66
  class PromptToolkitInput(InputProviderABC):
46
67
  def __init__(
47
68
  self,
@@ -106,6 +127,10 @@ class PromptToolkitInput(InputProviderABC):
106
127
  ),
107
128
  )
108
129
 
130
+ # Keep completion popups left-aligned instead of shifting with the caret.
131
+ with contextlib.suppress(Exception):
132
+ _left_align_completion_menus(self._session.app.layout.container)
133
+
109
134
  def _select_first_completion_on_open(buf) -> None: # type: ignore[no-untyped-def]
110
135
  """Default to selecting the first completion without inserting it."""
111
136
 
@@ -9,11 +9,11 @@ from prompt_toolkit.application import Application
9
9
  from prompt_toolkit.application.current import get_app
10
10
  from prompt_toolkit.buffer import Buffer
11
11
  from prompt_toolkit.filters import Always, Condition
12
- from prompt_toolkit.key_binding import KeyBindings, merge_key_bindings
12
+ from prompt_toolkit.key_binding import KeyBindings, KeyPressEvent, merge_key_bindings
13
13
  from prompt_toolkit.key_binding.defaults import load_key_bindings
14
14
  from prompt_toolkit.keys import Keys
15
15
  from prompt_toolkit.layout import ConditionalContainer, Float, FloatContainer, HSplit, Layout, VSplit, Window
16
- from prompt_toolkit.layout.containers import ScrollOffsets
16
+ from prompt_toolkit.layout.containers import Container, ScrollOffsets
17
17
  from prompt_toolkit.layout.controls import BufferControl, FormattedTextControl
18
18
  from prompt_toolkit.styles import Style, merge_styles
19
19
 
@@ -118,23 +118,29 @@ def select_one[T](
118
118
 
119
119
  @kb.add(Keys.ControlC, eager=True)
120
120
  @kb.add(Keys.ControlQ, eager=True)
121
- def _cancel(event):
121
+ def _cancel(event: KeyPressEvent) -> None:
122
122
  event.app.exit(result=None)
123
123
 
124
+ _ = _cancel # registered via decorator
125
+
124
126
  @kb.add(Keys.Down, eager=True)
125
- def _down(event):
127
+ def _down(event: KeyPressEvent) -> None:
126
128
  nonlocal pointed_at
127
129
  pointed_at += 1
128
130
  event.app.invalidate()
129
131
 
132
+ _ = _down # registered via decorator
133
+
130
134
  @kb.add(Keys.Up, eager=True)
131
- def _up(event):
135
+ def _up(event: KeyPressEvent) -> None:
132
136
  nonlocal pointed_at
133
137
  pointed_at -= 1
134
138
  event.app.invalidate()
135
139
 
140
+ _ = _up # registered via decorator
141
+
136
142
  @kb.add(Keys.Enter, eager=True)
137
- def _enter(event):
143
+ def _enter(event: KeyPressEvent) -> None:
138
144
  indices, _ = visible_indices()
139
145
  if not indices:
140
146
  event.app.exit(result=None)
@@ -142,8 +148,10 @@ def select_one[T](
142
148
  idx = indices[pointed_at % len(indices)]
143
149
  event.app.exit(result=items[idx].value)
144
150
 
151
+ _ = _enter # registered via decorator
152
+
145
153
  @kb.add(Keys.Escape, eager=True)
146
- def _esc(event):
154
+ def _esc(event: KeyPressEvent) -> None:
147
155
  nonlocal pointed_at
148
156
  if use_search_filter and search_buffer is not None and search_buffer.text:
149
157
  search_buffer.reset(append_to_history=False)
@@ -152,6 +160,8 @@ def select_one[T](
152
160
  return
153
161
  event.app.exit(result=None)
154
162
 
163
+ _ = _esc # registered via decorator
164
+
155
165
  if use_search_filter and search_buffer is not None:
156
166
  search_buffer.on_text_changed += _on_search_changed
157
167
 
@@ -208,7 +218,7 @@ def select_one[T](
208
218
  dont_extend_height=Always(),
209
219
  always_hide_cursor=Always(),
210
220
  ),
211
- filter=Condition(lambda: search_buffer is not None and search_buffer.text == ""),
221
+ filter=Condition(lambda: search_buffer.text == ""),
212
222
  )
213
223
  search_input_window = input_window
214
224
  search_input_container = FloatContainer(
@@ -216,7 +226,7 @@ def select_one[T](
216
226
  floats=[Float(content=placeholder_window, top=0, left=0)],
217
227
  )
218
228
 
219
- def _rounded_frame(body) -> HSplit: # type: ignore[no-untyped-def]
229
+ def _rounded_frame(body: Container) -> HSplit:
220
230
  border = partial(Window, style="class:frame.border", height=1)
221
231
  top = VSplit(
222
232
  [
@@ -258,7 +268,7 @@ def select_one[T](
258
268
  )
259
269
  merged_style = merge_styles([base_style, style] if style is not None else [base_style])
260
270
 
261
- root_children = [header_window, spacer_window, list_window]
271
+ root_children: list[Container] = [header_window, spacer_window, list_window]
262
272
  if search_container is not None:
263
273
  root_children.append(search_container)
264
274
 
File without changes