klaude-code 0.1.0__tar.gz → 1.2.11__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.
- klaude_code-1.2.11/PKG-INFO +175 -0
- klaude_code-1.2.11/README.md +158 -0
- klaude_code-1.2.11/pyproject.toml +78 -0
- klaude_code-1.2.11/src/klaude_code/auth/__init__.py +24 -0
- klaude_code-1.2.11/src/klaude_code/auth/codex/__init__.py +20 -0
- klaude_code-1.2.11/src/klaude_code/auth/codex/exceptions.py +17 -0
- klaude_code-1.2.11/src/klaude_code/auth/codex/jwt_utils.py +45 -0
- klaude_code-1.2.11/src/klaude_code/auth/codex/oauth.py +229 -0
- klaude_code-1.2.11/src/klaude_code/auth/codex/token_manager.py +84 -0
- klaude_code-1.2.11/src/klaude_code/cli/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/cli/main.py +367 -0
- klaude_code-1.2.11/src/klaude_code/cli/runtime.py +331 -0
- klaude_code-1.2.11/src/klaude_code/cli/session_cmd.py +80 -0
- klaude_code-1.2.11/src/klaude_code/command/__init__.py +90 -0
- klaude_code-1.2.11/src/klaude_code/command/clear_cmd.py +24 -0
- klaude_code-1.2.11/src/klaude_code/command/command_abc.py +95 -0
- klaude_code-1.2.11/src/klaude_code/command/diff_cmd.py +141 -0
- klaude_code-1.2.11/src/klaude_code/command/export_cmd.py +89 -0
- klaude_code-1.2.11/src/klaude_code/command/help_cmd.py +55 -0
- klaude_code-1.2.11/src/klaude_code/command/model_cmd.py +46 -0
- klaude_code-1.2.11/src/klaude_code/command/prompt-deslop.md +14 -0
- klaude_code-1.2.11/src/klaude_code/command/prompt-dev-docs-update.md +56 -0
- klaude_code-1.2.11/src/klaude_code/command/prompt-dev-docs.md +46 -0
- klaude_code-1.2.11/src/klaude_code/command/prompt-init.md +45 -0
- klaude_code-1.2.11/src/klaude_code/command/prompt_command.py +74 -0
- klaude_code-1.2.11/src/klaude_code/command/refresh_cmd.py +47 -0
- klaude_code-1.2.11/src/klaude_code/command/registry.py +122 -0
- klaude_code-1.2.11/src/klaude_code/command/release_notes_cmd.py +89 -0
- klaude_code-1.2.11/src/klaude_code/command/status_cmd.py +161 -0
- klaude_code-1.2.11/src/klaude_code/command/terminal_setup_cmd.py +255 -0
- klaude_code-1.2.11/src/klaude_code/config/__init__.py +11 -0
- klaude_code-1.2.11/src/klaude_code/config/config.py +177 -0
- klaude_code-1.2.11/src/klaude_code/config/list_model.py +215 -0
- klaude_code-1.2.11/src/klaude_code/config/select_model.py +67 -0
- klaude_code-1.2.11/src/klaude_code/const/__init__.py +133 -0
- klaude_code-1.2.11/src/klaude_code/core/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/core/agent.py +212 -0
- klaude_code-1.2.11/src/klaude_code/core/executor.py +482 -0
- klaude_code-1.2.11/src/klaude_code/core/manager/__init__.py +19 -0
- klaude_code-1.2.11/src/klaude_code/core/manager/agent_manager.py +132 -0
- klaude_code-1.2.11/src/klaude_code/core/manager/llm_clients.py +67 -0
- klaude_code-1.2.11/src/klaude_code/core/manager/llm_clients_builder.py +58 -0
- klaude_code-1.2.11/src/klaude_code/core/manager/sub_agent_manager.py +90 -0
- klaude_code-1.2.11/src/klaude_code/core/prompt.py +95 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-claude-code.md +87 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +117 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-codex-gpt-5-1.md +331 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-gemini.md +43 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-minimal.md +12 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-subagent-explore.md +29 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-subagent-oracle.md +23 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-subagent-webfetch.md +46 -0
- klaude_code-1.2.11/src/klaude_code/core/prompts/prompt-subagent.md +8 -0
- klaude_code-1.2.11/src/klaude_code/core/reminders.py +451 -0
- klaude_code-1.2.11/src/klaude_code/core/task.py +257 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/__init__.py +77 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/_utils.py +30 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/apply_patch.py +492 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/apply_patch_tool.md +1 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/apply_patch_tool.py +204 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/edit_tool.md +9 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/edit_tool.py +249 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/multi_edit_tool.md +42 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/multi_edit_tool.py +174 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/read_tool.md +14 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/read_tool.py +314 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/write_tool.md +8 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/file/write_tool.py +121 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/__init__.py +5 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/memory_tool.md +20 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/memory_tool.py +462 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/skill_loader.py +246 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/skill_tool.md +24 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/memory/skill_tool.py +110 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/shell/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/shell/bash_tool.md +43 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/shell/bash_tool.py +123 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/shell/command_safety.py +363 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/sub_agent_tool.py +84 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/todo_write_tool.md +25 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/todo_write_tool.py +121 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/todo_write_tool_raw.md +182 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/update_plan_tool.md +3 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/todo/update_plan_tool.py +104 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/tool_abc.py +25 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/tool_context.py +123 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/tool_registry.py +77 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/tool_runner.py +249 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/truncation.py +174 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/web/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/web/mermaid_tool.md +21 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/web/mermaid_tool.py +73 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/web/web_fetch_tool.md +8 -0
- klaude_code-1.2.11/src/klaude_code/core/tool/web/web_fetch_tool.py +159 -0
- klaude_code-1.2.11/src/klaude_code/core/turn.py +248 -0
- klaude_code-1.2.11/src/klaude_code/llm/__init__.py +13 -0
- klaude_code-1.2.11/src/klaude_code/llm/anthropic/__init__.py +3 -0
- klaude_code-1.2.11/src/klaude_code/llm/anthropic/client.py +191 -0
- klaude_code-1.2.11/src/klaude_code/llm/anthropic/input.py +215 -0
- klaude_code-1.2.11/src/klaude_code/llm/client.py +49 -0
- klaude_code-1.2.11/src/klaude_code/llm/codex/__init__.py +5 -0
- klaude_code-1.2.11/src/klaude_code/llm/codex/client.py +130 -0
- klaude_code-1.2.11/src/klaude_code/llm/input_common.py +233 -0
- klaude_code-1.2.11/src/klaude_code/llm/openai_compatible/__init__.py +3 -0
- klaude_code-1.2.11/src/klaude_code/llm/openai_compatible/client.py +168 -0
- klaude_code-1.2.11/src/klaude_code/llm/openai_compatible/input.py +111 -0
- klaude_code-1.2.11/src/klaude_code/llm/openai_compatible/stream_processor.py +82 -0
- klaude_code-1.2.11/src/klaude_code/llm/openai_compatible/tool_call_accumulator.py +80 -0
- klaude_code-1.2.11/src/klaude_code/llm/openrouter/__init__.py +3 -0
- klaude_code-1.2.11/src/klaude_code/llm/openrouter/client.py +170 -0
- klaude_code-1.2.11/src/klaude_code/llm/openrouter/input.py +137 -0
- klaude_code-1.2.11/src/klaude_code/llm/openrouter/reasoning_handler.py +209 -0
- klaude_code-1.2.11/src/klaude_code/llm/registry.py +48 -0
- klaude_code-1.2.11/src/klaude_code/llm/responses/__init__.py +3 -0
- klaude_code-1.2.11/src/klaude_code/llm/responses/client.py +202 -0
- klaude_code-1.2.11/src/klaude_code/llm/responses/input.py +167 -0
- klaude_code-1.2.11/src/klaude_code/llm/usage.py +162 -0
- klaude_code-1.2.11/src/klaude_code/protocol/__init__.py +4 -0
- klaude_code-1.2.11/src/klaude_code/protocol/commands.py +22 -0
- klaude_code-1.2.11/src/klaude_code/protocol/events.py +173 -0
- klaude_code-1.2.11/src/klaude_code/protocol/llm_param.py +149 -0
- klaude_code-1.2.11/src/klaude_code/protocol/model.py +412 -0
- klaude_code-1.2.11/src/klaude_code/protocol/op.py +93 -0
- klaude_code-1.2.11/src/klaude_code/protocol/op_handler.py +28 -0
- klaude_code-1.2.11/src/klaude_code/protocol/sub_agent.py +354 -0
- klaude_code-1.2.11/src/klaude_code/protocol/tools.py +15 -0
- klaude_code-1.2.11/src/klaude_code/session/__init__.py +4 -0
- klaude_code-1.2.11/src/klaude_code/session/export.py +653 -0
- klaude_code-1.2.11/src/klaude_code/session/selector.py +76 -0
- klaude_code-1.2.11/src/klaude_code/session/session.py +497 -0
- klaude_code-1.2.11/src/klaude_code/session/templates/export_session.html +1597 -0
- klaude_code-1.2.11/src/klaude_code/trace/__init__.py +3 -0
- klaude_code-1.2.11/src/klaude_code/trace/log.py +168 -0
- klaude_code-1.2.11/src/klaude_code/ui/__init__.py +91 -0
- klaude_code-1.2.11/src/klaude_code/ui/core/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/core/display.py +103 -0
- klaude_code-1.2.11/src/klaude_code/ui/core/input.py +71 -0
- klaude_code-1.2.11/src/klaude_code/ui/core/stage_manager.py +55 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/debug/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/debug/display.py +36 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/exec/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/exec/display.py +63 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/__init__.py +47 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/clipboard.py +152 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/completers.py +462 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/display.py +60 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/event_handler.py +462 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/input_prompt_toolkit.py +167 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/key_bindings.py +170 -0
- klaude_code-1.2.11/src/klaude_code/ui/modes/repl/renderer.py +283 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/__init__.py +0 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/assistant.py +21 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/common.py +8 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/developer.py +169 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/diffs.py +215 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/errors.py +16 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/metadata.py +253 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/sub_agent.py +71 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/thinking.py +39 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/tools.py +528 -0
- klaude_code-1.2.11/src/klaude_code/ui/renderers/user_input.py +78 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/live.py +65 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/markdown.py +311 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/quote.py +34 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/searchable_text.py +71 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/status.py +240 -0
- klaude_code-1.2.11/src/klaude_code/ui/rich/theme.py +276 -0
- klaude_code-1.2.11/src/klaude_code/ui/terminal/__init__.py +56 -0
- klaude_code-1.2.11/src/klaude_code/ui/terminal/color.py +244 -0
- klaude_code-1.2.11/src/klaude_code/ui/terminal/control.py +147 -0
- klaude_code-1.2.11/src/klaude_code/ui/terminal/notifier.py +107 -0
- klaude_code-1.2.11/src/klaude_code/ui/terminal/progress_bar.py +87 -0
- klaude_code-1.2.11/src/klaude_code/ui/utils/__init__.py +1 -0
- klaude_code-1.2.11/src/klaude_code/ui/utils/common.py +108 -0
- klaude_code-1.2.11/src/klaude_code/ui/utils/debouncer.py +42 -0
- klaude_code-1.2.11/src/klaude_code/version.py +163 -0
- klaude_code-0.1.0/PKG-INFO +0 -235
- klaude_code-0.1.0/README.md +0 -210
- klaude_code-0.1.0/pyproject.toml +0 -49
- klaude_code-0.1.0/setup.cfg +0 -4
- klaude_code-0.1.0/src/klaude_code.egg-info/PKG-INFO +0 -235
- klaude_code-0.1.0/src/klaude_code.egg-info/SOURCES.txt +0 -56
- klaude_code-0.1.0/src/klaude_code.egg-info/dependency_links.txt +0 -1
- klaude_code-0.1.0/src/klaude_code.egg-info/entry_points.txt +0 -2
- klaude_code-0.1.0/src/klaude_code.egg-info/requires.txt +0 -10
- klaude_code-0.1.0/src/klaude_code.egg-info/top_level.txt +0 -1
- klaude_code-0.1.0/src/klaudecode/__init__.py +0 -3
- klaude_code-0.1.0/src/klaudecode/agent.py +0 -399
- klaude_code-0.1.0/src/klaudecode/cli.py +0 -191
- klaude_code-0.1.0/src/klaudecode/command/__init__.py +0 -47
- klaude_code-0.1.0/src/klaudecode/command/bash_input_mode.py +0 -173
- klaude_code-0.1.0/src/klaudecode/command/clear_command.py +0 -29
- klaude_code-0.1.0/src/klaudecode/command/compact_command.py +0 -29
- klaude_code-0.1.0/src/klaudecode/command/continue_command.py +0 -19
- klaude_code-0.1.0/src/klaudecode/command/cost_command.py +0 -9
- klaude_code-0.1.0/src/klaudecode/command/init_command.py +0 -19
- klaude_code-0.1.0/src/klaudecode/command/mac_setup_command.py +0 -131
- klaude_code-0.1.0/src/klaudecode/command/memory_input_mode.py +0 -98
- klaude_code-0.1.0/src/klaudecode/command/plan_input_mode.py +0 -33
- klaude_code-0.1.0/src/klaudecode/command/recent_command.py +0 -19
- klaude_code-0.1.0/src/klaudecode/command/rewrite_query_command.py +0 -21
- klaude_code-0.1.0/src/klaudecode/command/status_command.py +0 -35
- klaude_code-0.1.0/src/klaudecode/command/theme_command.py +0 -60
- klaude_code-0.1.0/src/klaudecode/command/today_command.py +0 -19
- klaude_code-0.1.0/src/klaudecode/config.py +0 -400
- klaude_code-0.1.0/src/klaudecode/llm.py +0 -574
- klaude_code-0.1.0/src/klaudecode/mcp/mcp_client.py +0 -124
- klaude_code-0.1.0/src/klaudecode/mcp/mcp_config.py +0 -114
- klaude_code-0.1.0/src/klaudecode/mcp/mcp_tool.py +0 -251
- klaude_code-0.1.0/src/klaudecode/message.py +0 -539
- klaude_code-0.1.0/src/klaudecode/prompt/commands.py +0 -231
- klaude_code-0.1.0/src/klaudecode/prompt/plan_mode.py +0 -17
- klaude_code-0.1.0/src/klaudecode/prompt/reminder.py +0 -66
- klaude_code-0.1.0/src/klaudecode/prompt/system.py +0 -272
- klaude_code-0.1.0/src/klaudecode/prompt/tools.py +0 -455
- klaude_code-0.1.0/src/klaudecode/session.py +0 -302
- klaude_code-0.1.0/src/klaudecode/tool.py +0 -318
- klaude_code-0.1.0/src/klaudecode/tools/__init__.py +0 -28
- klaude_code-0.1.0/src/klaudecode/tools/bash.py +0 -341
- klaude_code-0.1.0/src/klaudecode/tools/edit.py +0 -156
- klaude_code-0.1.0/src/klaudecode/tools/exit_plan_mode.py +0 -47
- klaude_code-0.1.0/src/klaudecode/tools/file_utils.py +0 -250
- klaude_code-0.1.0/src/klaudecode/tools/glob.py +0 -286
- klaude_code-0.1.0/src/klaudecode/tools/grep.py +0 -287
- klaude_code-0.1.0/src/klaudecode/tools/ls.py +0 -60
- klaude_code-0.1.0/src/klaudecode/tools/multi_edit.py +0 -337
- klaude_code-0.1.0/src/klaudecode/tools/read.py +0 -199
- klaude_code-0.1.0/src/klaudecode/tools/todo.py +0 -121
- klaude_code-0.1.0/src/klaudecode/tools/write.py +0 -137
- klaude_code-0.1.0/src/klaudecode/tui.py +0 -344
- klaude_code-0.1.0/src/klaudecode/user_input.py +0 -532
- klaude_code-0.1.0/src/klaudecode/user_questionary.py +0 -14
- klaude_code-0.1.0/src/klaudecode/utils.py +0 -233
- {klaude_code-0.1.0/src/klaudecode/mcp → klaude_code-1.2.11/src/klaude_code}/__init__.py +0 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
|
+
Name: klaude-code
|
|
3
|
+
Version: 1.2.11
|
|
4
|
+
Summary: Add your description here
|
|
5
|
+
Requires-Dist: anthropic>=0.66.0
|
|
6
|
+
Requires-Dist: openai>=1.102.0
|
|
7
|
+
Requires-Dist: pillow>=12.0.0
|
|
8
|
+
Requires-Dist: prompt-toolkit>=3.0.52
|
|
9
|
+
Requires-Dist: pydantic>=2.11.7
|
|
10
|
+
Requires-Dist: pyyaml>=6.0.2
|
|
11
|
+
Requires-Dist: questionary>=2.1.1
|
|
12
|
+
Requires-Dist: rich>=14.1.0
|
|
13
|
+
Requires-Dist: trafilatura>=2.0.0
|
|
14
|
+
Requires-Dist: typer>=0.17.3
|
|
15
|
+
Requires-Python: >=3.13
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
|
|
18
|
+
# Minimal Code Agent CLI (Klaude Code)
|
|
19
|
+
|
|
20
|
+
An minimal and opinionated code agent with multi-model support.
|
|
21
|
+
|
|
22
|
+
## Key Features
|
|
23
|
+
- **Adaptive Tooling**: Model-aware toolsets (Claude Code tools for Sonnet, Codex `apply_patch` for GPT-5.1/Codex).
|
|
24
|
+
- **Multi-Provider Support**: Compatible with `anthropic-messages-api`,`openai-responses-api`, and `openai-compatible-api`(`openrouter-api`), featuring interleaved thinking, OpenRouter's provider sorting etc.
|
|
25
|
+
- **Skill System**: Extensible support for loading Claude Skills.
|
|
26
|
+
- **Session Management**: Robust context preservation with resumable sessions (`--continue`).
|
|
27
|
+
- **Simple TUI**: Clean interface offering full visibility into model responses, reasoning and actions.
|
|
28
|
+
- **Core Utilities**: Slash commands, sub-agents, image pasting, terminal notifications, file mentioning, and auto-theming.
|
|
29
|
+
|
|
30
|
+
## Installation
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
uv tool install klaude-code
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
To update:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
uv tool upgrade klaude-code
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Usage
|
|
43
|
+
|
|
44
|
+
### Interactive Mode
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
klaude [--model <name>] [--select-model]
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Options:**
|
|
51
|
+
- `--version`/`-V`: Show version and exit.
|
|
52
|
+
- `--model`/`-m`: Select a model by logical name from config.
|
|
53
|
+
- `--select-model`/`-s`: Interactively choose a model at startup.
|
|
54
|
+
- `--continue`/`-c`: Resume the most recent session.
|
|
55
|
+
- `--resume`/`-r`: Select a session to resume for this project.
|
|
56
|
+
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
57
|
+
|
|
58
|
+
**Debug Options:**
|
|
59
|
+
- `--debug`/`-d`: Enable debug mode with verbose logging and LLM trace.
|
|
60
|
+
- `--debug-filter`: Filter debug output by type (comma-separated).
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### Configuration
|
|
64
|
+
|
|
65
|
+
An example config will be created in `~/.klaude/config.yaml` when first run.
|
|
66
|
+
|
|
67
|
+
Open the configuration file in editor:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
klaude config
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
An minimal example config yaml using OpenRouter's API Key:
|
|
74
|
+
|
|
75
|
+
```yaml
|
|
76
|
+
provider_list:
|
|
77
|
+
- provider_name: openrouter-work
|
|
78
|
+
protocol: openrouter # support <responses|openrouter|anthropic|openai>
|
|
79
|
+
api_key: <your-openrouter-api-key>
|
|
80
|
+
model_list:
|
|
81
|
+
- model_name: gpt-5.1-codex
|
|
82
|
+
provider: openrouter
|
|
83
|
+
model_params:
|
|
84
|
+
model: openai/gpt-5.1-codex
|
|
85
|
+
context_limit: 368000
|
|
86
|
+
thinking:
|
|
87
|
+
reasoning_effort: medium
|
|
88
|
+
- model_name: gpt-5.1-high
|
|
89
|
+
provider: openrouter
|
|
90
|
+
model_params:
|
|
91
|
+
model: openai/gpt-5.1
|
|
92
|
+
context_limit: 368000
|
|
93
|
+
thinking:
|
|
94
|
+
reasoning_effort: high
|
|
95
|
+
- model_name: sonnet
|
|
96
|
+
provider: openrouter
|
|
97
|
+
model_params:
|
|
98
|
+
model: anthropic/claude-4.5-sonnet
|
|
99
|
+
context_limit: 168000
|
|
100
|
+
provider_routing:
|
|
101
|
+
sort: throughput
|
|
102
|
+
- model_name: haiku
|
|
103
|
+
provider: openrouter
|
|
104
|
+
model_params:
|
|
105
|
+
model: anthropic/claude-haiku-4.5
|
|
106
|
+
context_limit: 168000
|
|
107
|
+
provider_routing:
|
|
108
|
+
sort: throughput
|
|
109
|
+
main_model: gpt-5.1-codex
|
|
110
|
+
subagent_models:
|
|
111
|
+
oracle: gpt-5.1-high
|
|
112
|
+
explore: haiku
|
|
113
|
+
task: sonnet
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
List configured providers and models:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
klaude list
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Session Management
|
|
123
|
+
|
|
124
|
+
Clean up sessions with few messages:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# Remove sessions with fewer than 5 messages (default)
|
|
128
|
+
klaude session clean
|
|
129
|
+
|
|
130
|
+
# Remove sessions with fewer than 10 messages
|
|
131
|
+
klaude session clean --min 10
|
|
132
|
+
|
|
133
|
+
# Remove all sessions for the current project
|
|
134
|
+
klaude session clean-all
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Slash Commands
|
|
138
|
+
|
|
139
|
+
Inside the interactive session (`klaude`), use these commands to streamline your workflow:
|
|
140
|
+
|
|
141
|
+
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
142
|
+
- `/export` - Export last assistant message to a temp Markdown file.
|
|
143
|
+
- `/init` - Bootstrap a new project structure or module.
|
|
144
|
+
- `/model` - Switch the active LLM during the session.
|
|
145
|
+
- `/clear` - Clear the current conversation context.
|
|
146
|
+
- `/diff` - Show local git diff changes.
|
|
147
|
+
- `/help` - List all available commands.
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
### Input Shortcuts
|
|
151
|
+
|
|
152
|
+
| Key | Action |
|
|
153
|
+
| -------------------- | ------------------------------------------- |
|
|
154
|
+
| `Enter` | Submit input |
|
|
155
|
+
| `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
|
|
156
|
+
| `Ctrl+J` | Insert newline |
|
|
157
|
+
| `Ctrl+V` | Paste image from clipboard |
|
|
158
|
+
| `Left/Right` | Move cursor (wraps across lines) |
|
|
159
|
+
| `Backspace` | Delete character or selected text |
|
|
160
|
+
| `c` (with selection) | Copy selected text to clipboard |
|
|
161
|
+
|
|
162
|
+
### Non-Interactive Headless Mode (exec)
|
|
163
|
+
|
|
164
|
+
Execute a single command without starting the interactive REPL:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Direct input
|
|
168
|
+
klaude exec "what is 2+2?"
|
|
169
|
+
|
|
170
|
+
# Pipe input
|
|
171
|
+
echo "hello world" | klaude exec
|
|
172
|
+
|
|
173
|
+
# With model selection
|
|
174
|
+
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
175
|
+
```
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Minimal Code Agent CLI (Klaude Code)
|
|
2
|
+
|
|
3
|
+
An minimal and opinionated code agent with multi-model support.
|
|
4
|
+
|
|
5
|
+
## Key Features
|
|
6
|
+
- **Adaptive Tooling**: Model-aware toolsets (Claude Code tools for Sonnet, Codex `apply_patch` for GPT-5.1/Codex).
|
|
7
|
+
- **Multi-Provider Support**: Compatible with `anthropic-messages-api`,`openai-responses-api`, and `openai-compatible-api`(`openrouter-api`), featuring interleaved thinking, OpenRouter's provider sorting etc.
|
|
8
|
+
- **Skill System**: Extensible support for loading Claude Skills.
|
|
9
|
+
- **Session Management**: Robust context preservation with resumable sessions (`--continue`).
|
|
10
|
+
- **Simple TUI**: Clean interface offering full visibility into model responses, reasoning and actions.
|
|
11
|
+
- **Core Utilities**: Slash commands, sub-agents, image pasting, terminal notifications, file mentioning, and auto-theming.
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
uv tool install klaude-code
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
To update:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv tool upgrade klaude-code
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Usage
|
|
26
|
+
|
|
27
|
+
### Interactive Mode
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
klaude [--model <name>] [--select-model]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Options:**
|
|
34
|
+
- `--version`/`-V`: Show version and exit.
|
|
35
|
+
- `--model`/`-m`: Select a model by logical name from config.
|
|
36
|
+
- `--select-model`/`-s`: Interactively choose a model at startup.
|
|
37
|
+
- `--continue`/`-c`: Resume the most recent session.
|
|
38
|
+
- `--resume`/`-r`: Select a session to resume for this project.
|
|
39
|
+
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
40
|
+
|
|
41
|
+
**Debug Options:**
|
|
42
|
+
- `--debug`/`-d`: Enable debug mode with verbose logging and LLM trace.
|
|
43
|
+
- `--debug-filter`: Filter debug output by type (comma-separated).
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### Configuration
|
|
47
|
+
|
|
48
|
+
An example config will be created in `~/.klaude/config.yaml` when first run.
|
|
49
|
+
|
|
50
|
+
Open the configuration file in editor:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
klaude config
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
An minimal example config yaml using OpenRouter's API Key:
|
|
57
|
+
|
|
58
|
+
```yaml
|
|
59
|
+
provider_list:
|
|
60
|
+
- provider_name: openrouter-work
|
|
61
|
+
protocol: openrouter # support <responses|openrouter|anthropic|openai>
|
|
62
|
+
api_key: <your-openrouter-api-key>
|
|
63
|
+
model_list:
|
|
64
|
+
- model_name: gpt-5.1-codex
|
|
65
|
+
provider: openrouter
|
|
66
|
+
model_params:
|
|
67
|
+
model: openai/gpt-5.1-codex
|
|
68
|
+
context_limit: 368000
|
|
69
|
+
thinking:
|
|
70
|
+
reasoning_effort: medium
|
|
71
|
+
- model_name: gpt-5.1-high
|
|
72
|
+
provider: openrouter
|
|
73
|
+
model_params:
|
|
74
|
+
model: openai/gpt-5.1
|
|
75
|
+
context_limit: 368000
|
|
76
|
+
thinking:
|
|
77
|
+
reasoning_effort: high
|
|
78
|
+
- model_name: sonnet
|
|
79
|
+
provider: openrouter
|
|
80
|
+
model_params:
|
|
81
|
+
model: anthropic/claude-4.5-sonnet
|
|
82
|
+
context_limit: 168000
|
|
83
|
+
provider_routing:
|
|
84
|
+
sort: throughput
|
|
85
|
+
- model_name: haiku
|
|
86
|
+
provider: openrouter
|
|
87
|
+
model_params:
|
|
88
|
+
model: anthropic/claude-haiku-4.5
|
|
89
|
+
context_limit: 168000
|
|
90
|
+
provider_routing:
|
|
91
|
+
sort: throughput
|
|
92
|
+
main_model: gpt-5.1-codex
|
|
93
|
+
subagent_models:
|
|
94
|
+
oracle: gpt-5.1-high
|
|
95
|
+
explore: haiku
|
|
96
|
+
task: sonnet
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
List configured providers and models:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
klaude list
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Session Management
|
|
106
|
+
|
|
107
|
+
Clean up sessions with few messages:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Remove sessions with fewer than 5 messages (default)
|
|
111
|
+
klaude session clean
|
|
112
|
+
|
|
113
|
+
# Remove sessions with fewer than 10 messages
|
|
114
|
+
klaude session clean --min 10
|
|
115
|
+
|
|
116
|
+
# Remove all sessions for the current project
|
|
117
|
+
klaude session clean-all
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Slash Commands
|
|
121
|
+
|
|
122
|
+
Inside the interactive session (`klaude`), use these commands to streamline your workflow:
|
|
123
|
+
|
|
124
|
+
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
125
|
+
- `/export` - Export last assistant message to a temp Markdown file.
|
|
126
|
+
- `/init` - Bootstrap a new project structure or module.
|
|
127
|
+
- `/model` - Switch the active LLM during the session.
|
|
128
|
+
- `/clear` - Clear the current conversation context.
|
|
129
|
+
- `/diff` - Show local git diff changes.
|
|
130
|
+
- `/help` - List all available commands.
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
### Input Shortcuts
|
|
134
|
+
|
|
135
|
+
| Key | Action |
|
|
136
|
+
| -------------------- | ------------------------------------------- |
|
|
137
|
+
| `Enter` | Submit input |
|
|
138
|
+
| `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
|
|
139
|
+
| `Ctrl+J` | Insert newline |
|
|
140
|
+
| `Ctrl+V` | Paste image from clipboard |
|
|
141
|
+
| `Left/Right` | Move cursor (wraps across lines) |
|
|
142
|
+
| `Backspace` | Delete character or selected text |
|
|
143
|
+
| `c` (with selection) | Copy selected text to clipboard |
|
|
144
|
+
|
|
145
|
+
### Non-Interactive Headless Mode (exec)
|
|
146
|
+
|
|
147
|
+
Execute a single command without starting the interactive REPL:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
# Direct input
|
|
151
|
+
klaude exec "what is 2+2?"
|
|
152
|
+
|
|
153
|
+
# Pipe input
|
|
154
|
+
echo "hello world" | klaude exec
|
|
155
|
+
|
|
156
|
+
# With model selection
|
|
157
|
+
echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
158
|
+
```
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["uv_build>=0.8.5,<0.9.0"]
|
|
3
|
+
build-backend = "uv_build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "klaude-code"
|
|
7
|
+
version = "1.2.11"
|
|
8
|
+
description = "Add your description here"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.13"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"anthropic>=0.66.0",
|
|
13
|
+
"openai>=1.102.0",
|
|
14
|
+
"pillow>=12.0.0",
|
|
15
|
+
"prompt-toolkit>=3.0.52",
|
|
16
|
+
"pydantic>=2.11.7",
|
|
17
|
+
"pyyaml>=6.0.2",
|
|
18
|
+
"questionary>=2.1.1",
|
|
19
|
+
"rich>=14.1.0",
|
|
20
|
+
"trafilatura>=2.0.0",
|
|
21
|
+
"typer>=0.17.3",
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
[project.scripts]
|
|
25
|
+
klaude = "klaude_code.cli.main:app"
|
|
26
|
+
|
|
27
|
+
[tool.uv.build-backend]
|
|
28
|
+
module-name = "klaude_code"
|
|
29
|
+
|
|
30
|
+
[dependency-groups]
|
|
31
|
+
dev = [
|
|
32
|
+
"import-linter>=2.6",
|
|
33
|
+
"isort>=6.0.1",
|
|
34
|
+
"pyright>=1.1.407",
|
|
35
|
+
"pytest>=8.4.1",
|
|
36
|
+
"pytest-cov>=7.0.0",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
[tool.pytest.ini_options]
|
|
42
|
+
markers = [
|
|
43
|
+
"network: marks tests as requiring network access (deselect with '-m \"not network\"')",
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
[tool.ruff]
|
|
47
|
+
line-length = 120
|
|
48
|
+
|
|
49
|
+
[tool.pyright]
|
|
50
|
+
typeCheckingMode = "strict"
|
|
51
|
+
pythonVersion = "3.13"
|
|
52
|
+
venvPath = "."
|
|
53
|
+
venv = ".venv"
|
|
54
|
+
extraPaths = ["src"]
|
|
55
|
+
reportMissingImports = "warning"
|
|
56
|
+
reportMissingModuleSource = "warning"
|
|
57
|
+
exclude = [".venv/"]
|
|
58
|
+
|
|
59
|
+
[[tool.pyright.executionEnvironments]]
|
|
60
|
+
root = "."
|
|
61
|
+
extraPaths = ["src"]
|
|
62
|
+
|
|
63
|
+
[tool.importlinter]
|
|
64
|
+
root_packages = ["klaude_code"]
|
|
65
|
+
include_external_packages = false
|
|
66
|
+
|
|
67
|
+
[[tool.importlinter.contracts]]
|
|
68
|
+
name = "Layered architecture"
|
|
69
|
+
type = "layers"
|
|
70
|
+
layers = [
|
|
71
|
+
"klaude_code.cli",
|
|
72
|
+
"klaude_code.core",
|
|
73
|
+
"klaude_code.session",
|
|
74
|
+
"klaude_code.config",
|
|
75
|
+
"klaude_code.llm",
|
|
76
|
+
"klaude_code.protocol",
|
|
77
|
+
"klaude_code.const",
|
|
78
|
+
]
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Authentication module.
|
|
2
|
+
|
|
3
|
+
Currently includes Codex OAuth helpers in ``klaude_code.auth.codex``.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from klaude_code.auth.codex import (
|
|
7
|
+
CodexAuthError,
|
|
8
|
+
CodexAuthState,
|
|
9
|
+
CodexNotLoggedInError,
|
|
10
|
+
CodexOAuth,
|
|
11
|
+
CodexOAuthError,
|
|
12
|
+
CodexTokenExpiredError,
|
|
13
|
+
CodexTokenManager,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"CodexAuthError",
|
|
18
|
+
"CodexAuthState",
|
|
19
|
+
"CodexNotLoggedInError",
|
|
20
|
+
"CodexOAuth",
|
|
21
|
+
"CodexOAuthError",
|
|
22
|
+
"CodexTokenExpiredError",
|
|
23
|
+
"CodexTokenManager",
|
|
24
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Codex authentication helpers."""
|
|
2
|
+
|
|
3
|
+
from klaude_code.auth.codex.exceptions import (
|
|
4
|
+
CodexAuthError,
|
|
5
|
+
CodexNotLoggedInError,
|
|
6
|
+
CodexOAuthError,
|
|
7
|
+
CodexTokenExpiredError,
|
|
8
|
+
)
|
|
9
|
+
from klaude_code.auth.codex.oauth import CodexOAuth
|
|
10
|
+
from klaude_code.auth.codex.token_manager import CodexAuthState, CodexTokenManager
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"CodexAuthError",
|
|
14
|
+
"CodexAuthState",
|
|
15
|
+
"CodexNotLoggedInError",
|
|
16
|
+
"CodexOAuth",
|
|
17
|
+
"CodexOAuthError",
|
|
18
|
+
"CodexTokenExpiredError",
|
|
19
|
+
"CodexTokenManager",
|
|
20
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Exceptions for Codex authentication."""
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class CodexAuthError(Exception):
|
|
5
|
+
"""Base exception for Codex authentication errors."""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class CodexNotLoggedInError(CodexAuthError):
|
|
9
|
+
"""User has not logged in to Codex."""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CodexTokenExpiredError(CodexAuthError):
|
|
13
|
+
"""Token expired and refresh failed."""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CodexOAuthError(CodexAuthError):
|
|
17
|
+
"""OAuth flow failed."""
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""JWT parsing utilities for Codex authentication."""
|
|
2
|
+
|
|
3
|
+
import base64
|
|
4
|
+
import json
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def decode_jwt_payload(token: str) -> dict[str, Any]:
|
|
9
|
+
"""Decode JWT payload without verification.
|
|
10
|
+
|
|
11
|
+
Args:
|
|
12
|
+
token: JWT token string
|
|
13
|
+
|
|
14
|
+
Returns:
|
|
15
|
+
Decoded payload as a dictionary
|
|
16
|
+
"""
|
|
17
|
+
parts = token.split(".")
|
|
18
|
+
if len(parts) != 3:
|
|
19
|
+
raise ValueError("Invalid JWT format")
|
|
20
|
+
|
|
21
|
+
payload = parts[1]
|
|
22
|
+
# Add padding if needed
|
|
23
|
+
padding = 4 - len(payload) % 4
|
|
24
|
+
if padding != 4:
|
|
25
|
+
payload += "=" * padding
|
|
26
|
+
|
|
27
|
+
decoded = base64.urlsafe_b64decode(payload)
|
|
28
|
+
return json.loads(decoded)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def extract_account_id(token: str) -> str:
|
|
32
|
+
"""Extract ChatGPT account ID from JWT token.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
token: JWT access token from OpenAI OAuth
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
The chatgpt_account_id from the token claims
|
|
39
|
+
"""
|
|
40
|
+
payload = decode_jwt_payload(token)
|
|
41
|
+
auth_claim = payload.get("https://api.openai.com/auth", {})
|
|
42
|
+
account_id = auth_claim.get("chatgpt_account_id")
|
|
43
|
+
if not account_id:
|
|
44
|
+
raise ValueError("chatgpt_account_id not found in token")
|
|
45
|
+
return account_id
|