klaude-code 1.2.26__tar.gz → 1.2.28__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. {klaude_code-1.2.26 → klaude_code-1.2.28}/PKG-INFO +121 -127
  2. {klaude_code-1.2.26 → klaude_code-1.2.28}/README.md +119 -125
  3. {klaude_code-1.2.26 → klaude_code-1.2.28}/pyproject.toml +3 -2
  4. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/config_cmd.py +1 -5
  5. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/debug.py +9 -1
  6. klaude_code-1.2.28/src/klaude_code/cli/list_model.py +256 -0
  7. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/main.py +76 -19
  8. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/runtime.py +15 -11
  9. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/self_update.py +2 -1
  10. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/session_cmd.py +1 -1
  11. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/__init__.py +3 -0
  12. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/export_online_cmd.py +15 -12
  13. klaude_code-1.2.28/src/klaude_code/command/fork_session_cmd.py +42 -0
  14. klaude_code-1.2.28/src/klaude_code/config/__init__.py +9 -0
  15. klaude_code-1.2.28/src/klaude_code/config/assets/__init__.py +1 -0
  16. klaude_code-1.2.28/src/klaude_code/config/assets/builtin_config.yaml +233 -0
  17. klaude_code-1.2.28/src/klaude_code/config/builtin_config.py +37 -0
  18. klaude_code-1.2.28/src/klaude_code/config/config.py +423 -0
  19. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/config/select_model.py +46 -8
  20. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/executor.py +6 -3
  21. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/manager/llm_clients_builder.py +4 -1
  22. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/reminders.py +52 -16
  23. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/edit_tool.py +4 -4
  24. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/write_tool.py +4 -4
  25. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/shell/bash_tool.py +2 -2
  26. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/mermaid_tool.md +17 -0
  27. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/mermaid_tool.py +2 -2
  28. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openai_compatible/stream.py +2 -1
  29. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +17 -1
  30. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/commands.py +1 -0
  31. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/model.py +1 -0
  32. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/export.py +52 -7
  33. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/selector.py +2 -2
  34. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/session.py +26 -4
  35. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/trace/log.py +7 -1
  36. klaude_code-1.2.28/src/klaude_code/ui/modes/repl/__init__.py +6 -0
  37. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/completers.py +39 -7
  38. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/event_handler.py +8 -6
  39. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +33 -66
  40. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/key_bindings.py +4 -4
  41. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/renderer.py +1 -6
  42. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/common.py +11 -4
  43. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/developer.py +17 -0
  44. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/diffs.py +1 -1
  45. klaude_code-1.2.28/src/klaude_code/ui/renderers/errors.py +21 -0
  46. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/metadata.py +2 -2
  47. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/tools.py +8 -4
  48. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/markdown.py +5 -5
  49. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/theme.py +7 -3
  50. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/terminal/color.py +1 -1
  51. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/terminal/control.py +4 -4
  52. klaude_code-1.2.26/src/klaude_code/cli/list_model.py +0 -215
  53. klaude_code-1.2.26/src/klaude_code/config/__init__.py +0 -7
  54. klaude_code-1.2.26/src/klaude_code/config/config.py +0 -203
  55. klaude_code-1.2.26/src/klaude_code/ui/modes/repl/__init__.py +0 -47
  56. klaude_code-1.2.26/src/klaude_code/ui/renderers/errors.py +0 -16
  57. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/__init__.py +0 -0
  58. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/__init__.py +0 -0
  59. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/codex/__init__.py +0 -0
  60. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/codex/exceptions.py +0 -0
  61. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/codex/jwt_utils.py +0 -0
  62. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/codex/oauth.py +0 -0
  63. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/auth/codex/token_manager.py +0 -0
  64. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/__init__.py +0 -0
  65. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/cli/auth_cmd.py +0 -0
  66. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/clear_cmd.py +0 -0
  67. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/command_abc.py +0 -0
  68. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/debug_cmd.py +0 -0
  69. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/export_cmd.py +0 -0
  70. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/help_cmd.py +0 -0
  71. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/model_cmd.py +0 -0
  72. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/prompt-init.md +0 -0
  73. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/prompt-jj-describe.md +0 -0
  74. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/prompt_command.py +0 -0
  75. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/refresh_cmd.py +0 -0
  76. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/registry.py +0 -0
  77. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/release_notes_cmd.py +0 -0
  78. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/status_cmd.py +0 -0
  79. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/terminal_setup_cmd.py +0 -0
  80. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/command/thinking_cmd.py +0 -0
  81. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/const.py +0 -0
  82. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/__init__.py +0 -0
  83. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/agent.py +0 -0
  84. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/manager/__init__.py +0 -0
  85. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/manager/llm_clients.py +0 -0
  86. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/manager/sub_agent_manager.py +0 -0
  87. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompt.py +0 -0
  88. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-claude-code.md +0 -0
  89. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +0 -0
  90. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-codex-gpt-5-2-codex.md +0 -0
  91. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-codex.md +0 -0
  92. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-gemini.md +0 -0
  93. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-minimal.md +0 -0
  94. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-sub-agent-explore.md +0 -0
  95. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-sub-agent-oracle.md +0 -0
  96. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-sub-agent-web.md +0 -0
  97. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/prompts/prompt-sub-agent.md +0 -0
  98. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/task.py +0 -0
  99. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/__init__.py +0 -0
  100. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/__init__.py +0 -0
  101. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/_utils.py +0 -0
  102. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/apply_patch.py +0 -0
  103. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/apply_patch_tool.md +0 -0
  104. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/apply_patch_tool.py +0 -0
  105. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/diff_builder.py +0 -0
  106. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/edit_tool.md +0 -0
  107. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/read_tool.md +0 -0
  108. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/read_tool.py +0 -0
  109. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/file/write_tool.md +0 -0
  110. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/report_back_tool.py +0 -0
  111. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/shell/__init__.py +0 -0
  112. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/shell/bash_tool.md +0 -0
  113. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/shell/command_safety.py +0 -0
  114. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/skill/__init__.py +0 -0
  115. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/skill/skill_tool.md +0 -0
  116. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/skill/skill_tool.py +0 -0
  117. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/sub_agent_tool.py +0 -0
  118. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/__init__.py +0 -0
  119. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/todo_write_tool.md +0 -0
  120. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/todo_write_tool.py +0 -0
  121. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +0 -0
  122. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/update_plan_tool.md +0 -0
  123. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/todo/update_plan_tool.py +0 -0
  124. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/tool_abc.py +0 -0
  125. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/tool_context.py +0 -0
  126. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/tool_registry.py +0 -0
  127. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/tool_runner.py +0 -0
  128. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/truncation.py +0 -0
  129. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/__init__.py +0 -0
  130. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/web_fetch_tool.md +0 -0
  131. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/web_fetch_tool.py +0 -0
  132. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/web_search_tool.md +0 -0
  133. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/tool/web/web_search_tool.py +0 -0
  134. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/core/turn.py +0 -0
  135. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/__init__.py +0 -0
  136. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/anthropic/__init__.py +0 -0
  137. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/anthropic/client.py +0 -0
  138. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/anthropic/input.py +0 -0
  139. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/client.py +0 -0
  140. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/codex/__init__.py +0 -0
  141. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/codex/client.py +0 -0
  142. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/input_common.py +0 -0
  143. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openai_compatible/__init__.py +0 -0
  144. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openai_compatible/client.py +0 -0
  145. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openai_compatible/input.py +0 -0
  146. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openrouter/__init__.py +0 -0
  147. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openrouter/client.py +0 -0
  148. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openrouter/input.py +0 -0
  149. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/openrouter/reasoning.py +0 -0
  150. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/registry.py +0 -0
  151. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/responses/__init__.py +0 -0
  152. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/responses/client.py +0 -0
  153. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/responses/input.py +0 -0
  154. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/llm/usage.py +0 -0
  155. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/__init__.py +0 -0
  156. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/events.py +0 -0
  157. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/llm_param.py +0 -0
  158. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/op.py +0 -0
  159. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/op_handler.py +0 -0
  160. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/sub_agent/__init__.py +0 -0
  161. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/sub_agent/explore.py +0 -0
  162. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/sub_agent/oracle.py +0 -0
  163. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/sub_agent/task.py +0 -0
  164. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/sub_agent/web.py +0 -0
  165. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/protocol/tools.py +0 -0
  166. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/__init__.py +0 -0
  167. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/codec.py +0 -0
  168. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/store.py +0 -0
  169. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/session/templates/export_session.html +0 -0
  170. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/__init__.py +0 -0
  171. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/assets/deslop/SKILL.md +0 -0
  172. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/assets/dev-docs/SKILL.md +0 -0
  173. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/assets/handoff/SKILL.md +0 -0
  174. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/assets/jj-workspace/SKILL.md +0 -0
  175. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/assets/skill-creator/SKILL.md +0 -0
  176. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/loader.py +0 -0
  177. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/manager.py +0 -0
  178. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/skill/system_skills.py +0 -0
  179. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/trace/__init__.py +0 -0
  180. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/__init__.py +0 -0
  181. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/core/__init__.py +0 -0
  182. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/core/display.py +0 -0
  183. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/core/input.py +0 -0
  184. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/core/stage_manager.py +0 -0
  185. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/__init__.py +0 -0
  186. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/debug/__init__.py +0 -0
  187. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/debug/display.py +0 -0
  188. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/exec/__init__.py +0 -0
  189. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/exec/display.py +0 -0
  190. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/clipboard.py +0 -0
  191. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/modes/repl/display.py +0 -0
  192. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/__init__.py +0 -0
  193. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/assistant.py +0 -0
  194. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/sub_agent.py +0 -0
  195. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/thinking.py +0 -0
  196. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/renderers/user_input.py +0 -0
  197. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/__init__.py +0 -0
  198. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/cjk_wrap.py +0 -0
  199. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/code_panel.py +0 -0
  200. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/live.py +0 -0
  201. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/quote.py +0 -0
  202. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/searchable_text.py +0 -0
  203. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/rich/status.py +0 -0
  204. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/terminal/__init__.py +0 -0
  205. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/terminal/notifier.py +0 -0
  206. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/terminal/progress_bar.py +0 -0
  207. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/utils/__init__.py +0 -0
  208. {klaude_code-1.2.26 → klaude_code-1.2.28}/src/klaude_code/ui/utils/common.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 1.2.26
4
- Summary: Add your description here
3
+ Version: 1.2.28
4
+ Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
7
7
  Requires-Dist: ddgs>=9.9.3
@@ -21,7 +21,7 @@ Description-Content-Type: text/markdown
21
21
 
22
22
  # Klaude Code
23
23
 
24
- Multi-model code agent CLI.
24
+ Minimal code agent CLI.
25
25
 
26
26
  ## Features
27
27
  - **Multi-provider**: Anthropic, OpenAI Responses API, OpenRouter
@@ -92,147 +92,141 @@ klaude [--model <name>] [--select-model]
92
92
 
93
93
  ### Configuration
94
94
 
95
- An example config will be created in `~/.klaude/klaude-config.yaml` when first run.
95
+ #### Quick Start (Zero Config)
96
96
 
97
- Open the configuration file in editor:
97
+ Klaude comes with built-in provider configurations. Just set an API key environment variable and start using it:
98
+
99
+ ```bash
100
+ # Pick one (or more) of these:
101
+ export ANTHROPIC_API_KEY=sk-ant-xxx # Claude models
102
+ export OPENAI_API_KEY=sk-xxx # GPT models
103
+ export OPENROUTER_API_KEY=sk-or-xxx # OpenRouter (multi-provider)
104
+ export DEEPSEEK_API_KEY=sk-xxx # DeepSeek models
105
+ export MOONSHOT_API_KEY=sk-xxx # Moonshot/Kimi models
106
+
107
+ # Then just run:
108
+ klaude
109
+ ```
110
+
111
+ On first run, you'll be prompted to select a model. Your choice is saved as `main_model`.
112
+
113
+ #### Built-in Providers
114
+
115
+ | Provider | Env Variable | Models |
116
+ |-------------|-----------------------|-------------------------------------------------------------------------------|
117
+ | anthropic | `ANTHROPIC_API_KEY` | sonnet, opus |
118
+ | openai | `OPENAI_API_KEY` | gpt-5.2 |
119
+ | openrouter | `OPENROUTER_API_KEY` | gpt-5.2, gpt-5.2-fast, gpt-5.1-codex-max, sonnet, opus, haiku, kimi, gemini-* |
120
+ | deepseek | `DEEPSEEK_API_KEY` | deepseek |
121
+ | moonshot | `MOONSHOT_API_KEY` | kimi@moonshot |
122
+ | codex | N/A (OAuth) | gpt-5.2-codex |
123
+
124
+ List all configured providers and models:
125
+
126
+ ```bash
127
+ klaude list
128
+ ```
129
+
130
+ Models from providers without a valid API key are shown as dimmed/unavailable.
131
+
132
+ #### Custom Configuration
133
+
134
+ User config file: `~/.klaude/klaude-config.yaml`
135
+
136
+ Open in editor:
98
137
 
99
138
  ```bash
100
139
  klaude config
101
140
  ```
102
141
 
103
- An example config yaml:
142
+ ##### Adding Models to Built-in Providers
143
+
144
+ You can add custom models to existing providers without redefining the entire provider:
104
145
 
105
146
  ```yaml
147
+ # Just specify provider_name and your new models - no need for protocol/api_key
106
148
  provider_list:
107
- - provider_name: openrouter
108
- protocol: openrouter # support <responses|openrouter|anthropic|openai>
109
- api_key: <your-openrouter-api-key>
110
-
111
- - provider_name: openai-responses
112
- protocol: responses
113
- api_key: <your-openai-api-key>
114
-
115
- - provider_name: anthropic
116
- protocol: anthropic
117
- api_key: <your-anthropic-api-key>
118
-
119
- - provider_name: moonshot
120
- protocol: anthropic
121
- base_url: https://api.moonshot.cn/anthropic
122
- api_key: <your-api-key>
123
-
124
- - provider_name: deepseek
125
- protocol: anthropic
126
- base_url: https://api.deepseek.com/anthropic
127
- api_key: <your-api-key>
128
-
129
- model_list:
130
-
131
- - model_name: deepseek
132
- provider: deepseek
133
- model_params:
134
- model: deepseek-reasoner
135
- context_limit: 128000
136
- thinking:
137
- type: enabled
138
- budget_tokens: 8192
139
- cost:
140
- currency: CNY
141
- input: 2
142
- output: 3
143
- cache_read: 0.2
144
-
145
- - model_name: codex-max
146
- provider: openai-responses
147
- model_params:
148
- model: gpt-5.1-codex-max
149
- thinking:
150
- reasoning_effort: medium
151
- context_limit: 400000
152
- max_tokens: 128000
153
- cost:
154
- input: 1.25
155
- output: 10
156
- cache_read: 0.13
157
-
158
- - model_name: gpt-5.1
159
- provider: openrouter
160
- model_params:
161
- model: openai/gpt-5.1
162
- context_limit: 400000
163
- max_tokens: 128000
164
- verbosity: high
165
- thinking:
166
- reasoning_effort: high
167
- cost:
168
- input: 1.25
169
- output: 10
170
- cache_read: 0.13
171
-
172
- - model_name: kimi@moonshot
173
- provider: moonshot
174
- model_params:
175
- model: kimi-k2-thinking
176
- context_limit: 262144
177
- thinking:
178
- type: enabled
179
- budget_tokens: 8192
180
- cost:
181
- currency: CNY
182
- input: 4
183
- output: 16
184
- cache_read: 1
185
-
186
- - model_name: opus
187
- provider: openrouter
188
- model_params:
189
- model: anthropic/claude-4.5-opus
190
- context_limit: 200000
191
- provider_routing:
192
- only: [ google-vertex ]
193
- verbosity: high
194
- thinking:
195
- type: enabled
196
- budget_tokens: 31999
197
- cost:
198
- input: 5
199
- output: 25
200
- cache_read: 0.5
201
- cache_write: 6.25
202
-
203
- - model_name: gemini
204
- provider: openrouter
205
- model_params:
206
- model: google/gemini-3-pro-preview
207
- context_limit: 1048576
208
- thinking:
209
- reasoning_effort: medium
210
- cost:
211
- input: 2
212
- output: 12
213
- cache_read: 0.2
214
-
215
- - model_name: haiku
216
- provider: anthropic
217
- model_params:
218
- model: claude-haiku-4-5-20251001
219
- context_limit: 200000
220
- cost:
221
- input: 1
222
- output: 5
223
- cache_read: 0.1
224
- cache_write: 1.25
149
+ - provider_name: openrouter
150
+ model_list:
151
+ - model_name: my-custom-model
152
+ model_params:
153
+ model: some-provider/some-model-id
154
+ context_limit: 200000
155
+ ```
156
+
157
+ Your models are merged with built-in models. To override a built-in model, use the same `model_name`.
225
158
 
159
+ ##### Overriding Provider Settings
160
+
161
+ Override provider-level settings (like api_key) while keeping built-in models:
162
+
163
+ ```yaml
164
+ provider_list:
165
+ - provider_name: anthropic
166
+ api_key: sk-my-custom-key # Override the default ${ANTHROPIC_API_KEY}
167
+ # Built-in models (sonnet, opus) are still available
168
+ ```
169
+
170
+ ##### Adding New Providers
171
+
172
+ For providers not in the built-in list, you must specify `protocol`:
173
+
174
+ ```yaml
175
+ provider_list:
176
+ - provider_name: my-azure-openai
177
+ protocol: openai
178
+ api_key: ${AZURE_OPENAI_KEY}
179
+ base_url: https://my-instance.openai.azure.com/
180
+ is_azure: true
181
+ azure_api_version: "2024-02-15-preview"
182
+ model_list:
183
+ - model_name: gpt-4-azure
184
+ model_params:
185
+ model: gpt-4
186
+ context_limit: 128000
187
+ ```
188
+
189
+ ##### Full Example
190
+
191
+ ```yaml
192
+ # User configuration - merged with built-in config
226
193
  main_model: opus
227
194
 
228
195
  sub_agent_models:
229
- oracle: gpt-5.1
230
- explore: haiku
196
+ oracle: gpt-4.1
197
+ explore: sonnet
231
198
  task: opus
232
- webagent: haiku
199
+ webagent: sonnet
233
200
 
201
+ provider_list:
202
+ # Add models to built-in openrouter
203
+ - provider_name: openrouter
204
+ model_list:
205
+ - model_name: qwen-coder
206
+ model_params:
207
+ model: qwen/qwen-2.5-coder-32b-instruct
208
+ context_limit: 131072
209
+
210
+ # Add a completely new provider
211
+ - provider_name: local-ollama
212
+ protocol: openai
213
+ base_url: http://localhost:11434/v1
214
+ api_key: ollama
215
+ model_list:
216
+ - model_name: local-llama
217
+ model_params:
218
+ model: llama3.2
219
+ context_limit: 8192
234
220
  ```
235
221
 
222
+ ##### Supported Protocols
223
+
224
+ - `anthropic` - Anthropic Claude API
225
+ - `openai` - OpenAI-compatible API
226
+ - `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
227
+ - `openrouter` - OpenRouter API
228
+ - `codex` - OpenAI Codex CLI (OAuth-based)
229
+
236
230
  List configured providers and models:
237
231
 
238
232
  ```bash
@@ -1,6 +1,6 @@
1
1
  # Klaude Code
2
2
 
3
- Multi-model code agent CLI.
3
+ Minimal code agent CLI.
4
4
 
5
5
  ## Features
6
6
  - **Multi-provider**: Anthropic, OpenAI Responses API, OpenRouter
@@ -71,147 +71,141 @@ klaude [--model <name>] [--select-model]
71
71
 
72
72
  ### Configuration
73
73
 
74
- An example config will be created in `~/.klaude/klaude-config.yaml` when first run.
74
+ #### Quick Start (Zero Config)
75
75
 
76
- Open the configuration file in editor:
76
+ Klaude comes with built-in provider configurations. Just set an API key environment variable and start using it:
77
+
78
+ ```bash
79
+ # Pick one (or more) of these:
80
+ export ANTHROPIC_API_KEY=sk-ant-xxx # Claude models
81
+ export OPENAI_API_KEY=sk-xxx # GPT models
82
+ export OPENROUTER_API_KEY=sk-or-xxx # OpenRouter (multi-provider)
83
+ export DEEPSEEK_API_KEY=sk-xxx # DeepSeek models
84
+ export MOONSHOT_API_KEY=sk-xxx # Moonshot/Kimi models
85
+
86
+ # Then just run:
87
+ klaude
88
+ ```
89
+
90
+ On first run, you'll be prompted to select a model. Your choice is saved as `main_model`.
91
+
92
+ #### Built-in Providers
93
+
94
+ | Provider | Env Variable | Models |
95
+ |-------------|-----------------------|-------------------------------------------------------------------------------|
96
+ | anthropic | `ANTHROPIC_API_KEY` | sonnet, opus |
97
+ | openai | `OPENAI_API_KEY` | gpt-5.2 |
98
+ | openrouter | `OPENROUTER_API_KEY` | gpt-5.2, gpt-5.2-fast, gpt-5.1-codex-max, sonnet, opus, haiku, kimi, gemini-* |
99
+ | deepseek | `DEEPSEEK_API_KEY` | deepseek |
100
+ | moonshot | `MOONSHOT_API_KEY` | kimi@moonshot |
101
+ | codex | N/A (OAuth) | gpt-5.2-codex |
102
+
103
+ List all configured providers and models:
104
+
105
+ ```bash
106
+ klaude list
107
+ ```
108
+
109
+ Models from providers without a valid API key are shown as dimmed/unavailable.
110
+
111
+ #### Custom Configuration
112
+
113
+ User config file: `~/.klaude/klaude-config.yaml`
114
+
115
+ Open in editor:
77
116
 
78
117
  ```bash
79
118
  klaude config
80
119
  ```
81
120
 
82
- An example config yaml:
121
+ ##### Adding Models to Built-in Providers
122
+
123
+ You can add custom models to existing providers without redefining the entire provider:
83
124
 
84
125
  ```yaml
126
+ # Just specify provider_name and your new models - no need for protocol/api_key
85
127
  provider_list:
86
- - provider_name: openrouter
87
- protocol: openrouter # support <responses|openrouter|anthropic|openai>
88
- api_key: <your-openrouter-api-key>
89
-
90
- - provider_name: openai-responses
91
- protocol: responses
92
- api_key: <your-openai-api-key>
93
-
94
- - provider_name: anthropic
95
- protocol: anthropic
96
- api_key: <your-anthropic-api-key>
97
-
98
- - provider_name: moonshot
99
- protocol: anthropic
100
- base_url: https://api.moonshot.cn/anthropic
101
- api_key: <your-api-key>
102
-
103
- - provider_name: deepseek
104
- protocol: anthropic
105
- base_url: https://api.deepseek.com/anthropic
106
- api_key: <your-api-key>
107
-
108
- model_list:
109
-
110
- - model_name: deepseek
111
- provider: deepseek
112
- model_params:
113
- model: deepseek-reasoner
114
- context_limit: 128000
115
- thinking:
116
- type: enabled
117
- budget_tokens: 8192
118
- cost:
119
- currency: CNY
120
- input: 2
121
- output: 3
122
- cache_read: 0.2
123
-
124
- - model_name: codex-max
125
- provider: openai-responses
126
- model_params:
127
- model: gpt-5.1-codex-max
128
- thinking:
129
- reasoning_effort: medium
130
- context_limit: 400000
131
- max_tokens: 128000
132
- cost:
133
- input: 1.25
134
- output: 10
135
- cache_read: 0.13
136
-
137
- - model_name: gpt-5.1
138
- provider: openrouter
139
- model_params:
140
- model: openai/gpt-5.1
141
- context_limit: 400000
142
- max_tokens: 128000
143
- verbosity: high
144
- thinking:
145
- reasoning_effort: high
146
- cost:
147
- input: 1.25
148
- output: 10
149
- cache_read: 0.13
150
-
151
- - model_name: kimi@moonshot
152
- provider: moonshot
153
- model_params:
154
- model: kimi-k2-thinking
155
- context_limit: 262144
156
- thinking:
157
- type: enabled
158
- budget_tokens: 8192
159
- cost:
160
- currency: CNY
161
- input: 4
162
- output: 16
163
- cache_read: 1
164
-
165
- - model_name: opus
166
- provider: openrouter
167
- model_params:
168
- model: anthropic/claude-4.5-opus
169
- context_limit: 200000
170
- provider_routing:
171
- only: [ google-vertex ]
172
- verbosity: high
173
- thinking:
174
- type: enabled
175
- budget_tokens: 31999
176
- cost:
177
- input: 5
178
- output: 25
179
- cache_read: 0.5
180
- cache_write: 6.25
181
-
182
- - model_name: gemini
183
- provider: openrouter
184
- model_params:
185
- model: google/gemini-3-pro-preview
186
- context_limit: 1048576
187
- thinking:
188
- reasoning_effort: medium
189
- cost:
190
- input: 2
191
- output: 12
192
- cache_read: 0.2
193
-
194
- - model_name: haiku
195
- provider: anthropic
196
- model_params:
197
- model: claude-haiku-4-5-20251001
198
- context_limit: 200000
199
- cost:
200
- input: 1
201
- output: 5
202
- cache_read: 0.1
203
- cache_write: 1.25
128
+ - provider_name: openrouter
129
+ model_list:
130
+ - model_name: my-custom-model
131
+ model_params:
132
+ model: some-provider/some-model-id
133
+ context_limit: 200000
134
+ ```
135
+
136
+ Your models are merged with built-in models. To override a built-in model, use the same `model_name`.
204
137
 
138
+ ##### Overriding Provider Settings
139
+
140
+ Override provider-level settings (like api_key) while keeping built-in models:
141
+
142
+ ```yaml
143
+ provider_list:
144
+ - provider_name: anthropic
145
+ api_key: sk-my-custom-key # Override the default ${ANTHROPIC_API_KEY}
146
+ # Built-in models (sonnet, opus) are still available
147
+ ```
148
+
149
+ ##### Adding New Providers
150
+
151
+ For providers not in the built-in list, you must specify `protocol`:
152
+
153
+ ```yaml
154
+ provider_list:
155
+ - provider_name: my-azure-openai
156
+ protocol: openai
157
+ api_key: ${AZURE_OPENAI_KEY}
158
+ base_url: https://my-instance.openai.azure.com/
159
+ is_azure: true
160
+ azure_api_version: "2024-02-15-preview"
161
+ model_list:
162
+ - model_name: gpt-4-azure
163
+ model_params:
164
+ model: gpt-4
165
+ context_limit: 128000
166
+ ```
167
+
168
+ ##### Full Example
169
+
170
+ ```yaml
171
+ # User configuration - merged with built-in config
205
172
  main_model: opus
206
173
 
207
174
  sub_agent_models:
208
- oracle: gpt-5.1
209
- explore: haiku
175
+ oracle: gpt-4.1
176
+ explore: sonnet
210
177
  task: opus
211
- webagent: haiku
178
+ webagent: sonnet
212
179
 
180
+ provider_list:
181
+ # Add models to built-in openrouter
182
+ - provider_name: openrouter
183
+ model_list:
184
+ - model_name: qwen-coder
185
+ model_params:
186
+ model: qwen/qwen-2.5-coder-32b-instruct
187
+ context_limit: 131072
188
+
189
+ # Add a completely new provider
190
+ - provider_name: local-ollama
191
+ protocol: openai
192
+ base_url: http://localhost:11434/v1
193
+ api_key: ollama
194
+ model_list:
195
+ - model_name: local-llama
196
+ model_params:
197
+ model: llama3.2
198
+ context_limit: 8192
213
199
  ```
214
200
 
201
+ ##### Supported Protocols
202
+
203
+ - `anthropic` - Anthropic Claude API
204
+ - `openai` - OpenAI-compatible API
205
+ - `responses` - OpenAI Responses API (for o-series, GPT-5, Codex)
206
+ - `openrouter` - OpenRouter API
207
+ - `codex` - OpenAI Codex CLI (OAuth-based)
208
+
215
209
  List configured providers and models:
216
210
 
217
211
  ```bash
@@ -4,8 +4,8 @@ build-backend = "uv_build"
4
4
 
5
5
  [project]
6
6
  name = "klaude-code"
7
- version = "1.2.26"
8
- description = "Add your description here"
7
+ version = "1.2.28"
8
+ description = "Minimal code agent CLI"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.13"
11
11
  dependencies = [
@@ -27,6 +27,7 @@ dependencies = [
27
27
 
28
28
  [project.scripts]
29
29
  klaude = "klaude_code.cli.main:app"
30
+ klaude-code = "klaude_code.cli.main:app"
30
31
 
31
32
  [tool.uv.build-backend]
32
33
  module-name = "klaude_code"
@@ -16,8 +16,6 @@ def list_models() -> None:
16
16
  from klaude_code.ui.terminal.color import is_light_terminal_background
17
17
 
18
18
  config = load_config()
19
- if config is None:
20
- raise typer.Exit(1)
21
19
 
22
20
  # Auto-detect theme when not explicitly set in config, to match other CLI entrypoints.
23
21
  if config.theme is None:
@@ -60,9 +58,7 @@ def edit_config() -> None:
60
58
  editor = "xdg-open"
61
59
 
62
60
  # Ensure config file exists
63
- config = load_config()
64
- if config is None:
65
- raise typer.Exit(1)
61
+ load_config()
66
62
 
67
63
  try:
68
64
  if editor == "open -a TextEdit":
@@ -63,7 +63,15 @@ def open_log_file_in_editor(path: Path) -> None:
63
63
  editor = "xdg-open"
64
64
 
65
65
  try:
66
- subprocess.Popen([editor, str(path)], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
66
+ # Detach stdin to prevent the editor from interfering with terminal input state.
67
+ # Without this, the spawned process inherits the parent's TTY and can disrupt
68
+ # prompt_toolkit's keyboard handling (e.g., history navigation with up/down keys).
69
+ subprocess.Popen(
70
+ [editor, str(path)],
71
+ stdin=subprocess.DEVNULL,
72
+ stdout=subprocess.DEVNULL,
73
+ stderr=subprocess.DEVNULL,
74
+ )
67
75
  except FileNotFoundError:
68
76
  log((f"Error: Editor '{editor}' not found", "red"))
69
77
  except Exception as exc: # pragma: no cover - best effort