code-puppy 0.0.237__tar.gz → 0.0.314__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.
- {code_puppy-0.0.237 → code_puppy-0.0.314}/.gitignore +4 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/PKG-INFO +106 -71
- {code_puppy-0.0.237 → code_puppy-0.0.314}/README.md +100 -59
- code_puppy-0.0.314/code_puppy/__init__.py +10 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_code_puppy.py +5 -1
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_creator_agent.py +43 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_manager.py +14 -4
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_planning.py +3 -3
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/base_agent.py +480 -130
- code_puppy-0.0.314/code_puppy/agents/prompt_reviewer.py +145 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/callbacks.py +28 -4
- code_puppy-0.0.314/code_puppy/chatgpt_codex_client.py +281 -0
- code_puppy-0.0.314/code_puppy/claude_cache_client.py +165 -0
- code_puppy-0.0.314/code_puppy/command_line/add_model_menu.py +1065 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/attachments.py +10 -5
- code_puppy-0.0.314/code_puppy/command_line/autosave_menu.py +606 -0
- code_puppy-0.0.314/code_puppy/command_line/command_handler.py +282 -0
- code_puppy-0.0.314/code_puppy/command_line/command_registry.py +150 -0
- code_puppy-0.0.314/code_puppy/command_line/config_commands.py +661 -0
- code_puppy-0.0.314/code_puppy/command_line/core_commands.py +730 -0
- code_puppy-0.0.314/code_puppy/command_line/diff_menu.py +858 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/load_context_completion.py +15 -22
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/add_command.py +3 -16
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/base.py +0 -3
- code_puppy-0.0.314/code_puppy/command_line/mcp/catalog_server_installer.py +176 -0
- code_puppy-0.0.314/code_puppy/command_line/mcp/custom_server_form.py +649 -0
- code_puppy-0.0.314/code_puppy/command_line/mcp/custom_server_installer.py +196 -0
- code_puppy-0.0.314/code_puppy/command_line/mcp/edit_command.py +148 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/handler.py +9 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/help_command.py +7 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/install_command.py +15 -26
- code_puppy-0.0.314/code_puppy/command_line/mcp/install_menu.py +681 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/list_command.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/logs_command.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/remove_command.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/restart_command.py +12 -4
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/search_command.py +16 -10
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/start_all_command.py +18 -6
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/start_command.py +14 -10
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/status_command.py +4 -5
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/stop_all_command.py +7 -1
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/stop_command.py +8 -4
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/test_command.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/wizard_utils.py +20 -16
- code_puppy-0.0.314/code_puppy/command_line/mcp_completion.py +174 -0
- code_puppy-0.0.314/code_puppy/command_line/model_picker_completion.py +179 -0
- code_puppy-0.0.314/code_puppy/command_line/model_settings_menu.py +827 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/motd.py +5 -5
- code_puppy-0.0.314/code_puppy/command_line/pin_command_completion.py +329 -0
- code_puppy-0.0.314/code_puppy/command_line/prompt_toolkit_completion.py +701 -0
- code_puppy-0.0.314/code_puppy/command_line/session_commands.py +296 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/config.py +633 -134
- code_puppy-0.0.314/code_puppy/error_logging.py +118 -0
- code_puppy-0.0.314/code_puppy/gemini_code_assist.py +385 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/http_utils.py +142 -5
- code_puppy-0.0.314/code_puppy/keymap.py +120 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/main.py +275 -227
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/blocking_startup.py +9 -11
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/captured_stdio_server.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/config_wizard.py +4 -4
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/dashboard.py +15 -6
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/managed_server.py +3 -21
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/registry.py +6 -6
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/server_registry_catalog.py +24 -5
- code_puppy-0.0.314/code_puppy/messaging/__init__.py +223 -0
- code_puppy-0.0.314/code_puppy/messaging/bus.py +610 -0
- code_puppy-0.0.314/code_puppy/messaging/commands.py +167 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/message_queue.py +10 -29
- code_puppy-0.0.314/code_puppy/messaging/messages.py +470 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/queue_console.py +0 -23
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/renderers.py +43 -146
- code_puppy-0.0.314/code_puppy/messaging/rich_renderer.py +877 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/__init__.py +1 -3
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/console_spinner.py +80 -51
- code_puppy-0.0.314/code_puppy/model_factory.py +744 -0
- code_puppy-0.0.314/code_puppy/model_utils.py +113 -0
- code_puppy-0.0.314/code_puppy/models.json +118 -0
- code_puppy-0.0.314/code_puppy/models_dev_api.json +1 -0
- code_puppy-0.0.314/code_puppy/models_dev_parser.py +592 -0
- code_puppy-0.0.314/code_puppy/plugins/__init__.py +174 -0
- code_puppy-0.0.314/code_puppy/plugins/chatgpt_oauth/config.py +52 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +12 -8
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +3 -3
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +30 -13
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/utils.py +191 -9
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/config.py +15 -11
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +47 -9
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/test_plugin.py +1 -1
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/utils.py +113 -7
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -3
- code_puppy-0.0.314/code_puppy/plugins/example_custom_command/README.md +280 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/example_custom_command/register_callbacks.py +2 -2
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/file_permission_handler/register_callbacks.py +168 -112
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/oauth_puppy_html.py +3 -0
- code_puppy-0.0.314/code_puppy/plugins/shell_safety/__init__.py +6 -0
- code_puppy-0.0.314/code_puppy/plugins/shell_safety/agent_shell_safety.py +186 -0
- code_puppy-0.0.314/code_puppy/plugins/shell_safety/command_cache.py +156 -0
- code_puppy-0.0.314/code_puppy/plugins/shell_safety/register_callbacks.py +161 -0
- code_puppy-0.0.314/code_puppy/prompts/codex_system_prompt.md +310 -0
- code_puppy-0.0.314/code_puppy/pydantic_patches.py +131 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/round_robin_model.py +9 -12
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/session_storage.py +2 -1
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/status_display.py +17 -4
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/summarization_agent.py +41 -13
- code_puppy-0.0.314/code_puppy/tools/agent_tools.py +568 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_control.py +13 -17
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_interactions.py +20 -28
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_locators.py +27 -29
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_navigation.py +9 -9
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_screenshot.py +12 -14
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_scripts.py +17 -29
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_workflows.py +44 -27
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/camoufox_manager.py +30 -31
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/vqa_agent.py +24 -4
- code_puppy-0.0.314/code_puppy/tools/command_runner.py +1206 -0
- code_puppy-0.0.314/code_puppy/tools/common.py +1414 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/file_modifications.py +166 -253
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/file_operations.py +226 -154
- code_puppy-0.0.314/code_puppy/version_checker.py +54 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/pyproject.toml +13 -12
- code_puppy-0.0.237/code_puppy/__init__.py +0 -8
- code_puppy-0.0.237/code_puppy/command_line/command_handler.py +0 -1141
- code_puppy-0.0.237/code_puppy/command_line/model_picker_completion.py +0 -129
- code_puppy-0.0.237/code_puppy/command_line/prompt_toolkit_completion.py +0 -420
- code_puppy-0.0.237/code_puppy/messaging/__init__.py +0 -50
- code_puppy-0.0.237/code_puppy/messaging/spinner/textual_spinner.py +0 -106
- code_puppy-0.0.237/code_puppy/model_factory.py +0 -402
- code_puppy-0.0.237/code_puppy/models.json +0 -126
- code_puppy-0.0.237/code_puppy/plugins/__init__.py +0 -32
- code_puppy-0.0.237/code_puppy/plugins/chatgpt_oauth/config.py +0 -44
- code_puppy-0.0.237/code_puppy/tools/agent_tools.py +0 -205
- code_puppy-0.0.237/code_puppy/tools/command_runner.py +0 -630
- code_puppy-0.0.237/code_puppy/tools/common.py +0 -475
- code_puppy-0.0.237/code_puppy/tui/__init__.py +0 -10
- code_puppy-0.0.237/code_puppy/tui/app.py +0 -1129
- code_puppy-0.0.237/code_puppy/tui/components/__init__.py +0 -21
- code_puppy-0.0.237/code_puppy/tui/components/chat_view.py +0 -551
- code_puppy-0.0.237/code_puppy/tui/components/command_history_modal.py +0 -218
- code_puppy-0.0.237/code_puppy/tui/components/copy_button.py +0 -139
- code_puppy-0.0.237/code_puppy/tui/components/custom_widgets.py +0 -63
- code_puppy-0.0.237/code_puppy/tui/components/human_input_modal.py +0 -175
- code_puppy-0.0.237/code_puppy/tui/components/input_area.py +0 -167
- code_puppy-0.0.237/code_puppy/tui/components/sidebar.py +0 -309
- code_puppy-0.0.237/code_puppy/tui/components/status_bar.py +0 -185
- code_puppy-0.0.237/code_puppy/tui/messages.py +0 -27
- code_puppy-0.0.237/code_puppy/tui/models/__init__.py +0 -8
- code_puppy-0.0.237/code_puppy/tui/models/chat_message.py +0 -25
- code_puppy-0.0.237/code_puppy/tui/models/command_history.py +0 -89
- code_puppy-0.0.237/code_puppy/tui/models/enums.py +0 -24
- code_puppy-0.0.237/code_puppy/tui/screens/__init__.py +0 -19
- code_puppy-0.0.237/code_puppy/tui/screens/autosave_picker.py +0 -175
- code_puppy-0.0.237/code_puppy/tui/screens/help.py +0 -130
- code_puppy-0.0.237/code_puppy/tui/screens/mcp_install_wizard.py +0 -803
- code_puppy-0.0.237/code_puppy/tui/screens/model_picker.py +0 -125
- code_puppy-0.0.237/code_puppy/tui/screens/settings.py +0 -306
- code_puppy-0.0.237/code_puppy/tui/screens/tools.py +0 -74
- code_puppy-0.0.237/code_puppy/tui_state.py +0 -55
- code_puppy-0.0.237/code_puppy/version_checker.py +0 -35
- {code_puppy-0.0.237 → code_puppy-0.0.314}/LICENSE +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/__main__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_c_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_code_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_golang_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_python_programmer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_python_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_qa_expert.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_qa_kitten.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_security_auditor.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/json_agent.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/file_path_completion.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/utils.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/utils.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/async_lifecycle.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/circuit_breaker.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/error_isolation.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/examples/retry_example.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/health_monitor.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/manager.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/retry_manager.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/status_tracker.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/system_tools.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/spinner_base.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/reopenable_async_client.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/__init__.py +0 -0
- {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/tools_content.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-puppy
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.314
|
|
4
4
|
Summary: Code generation agent
|
|
5
5
|
Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
|
|
6
6
|
Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
|
|
@@ -15,21 +15,18 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.13
|
|
16
16
|
Classifier: Topic :: Software Development :: Code Generators
|
|
17
17
|
Requires-Python: <3.14,>=3.11
|
|
18
|
-
Requires-Dist: bs4>=0.0.2
|
|
19
18
|
Requires-Dist: camoufox>=0.4.11
|
|
20
|
-
Requires-Dist: dbos>=2.
|
|
21
|
-
Requires-Dist: fastapi>=0.
|
|
22
|
-
Requires-Dist: httpx-limiter>=0.3.0
|
|
19
|
+
Requires-Dist: dbos>=2.5.0
|
|
20
|
+
Requires-Dist: fastapi>=0.111.0
|
|
23
21
|
Requires-Dist: httpx[http2]>=0.24.1
|
|
24
22
|
Requires-Dist: json-repair>=0.46.2
|
|
25
23
|
Requires-Dist: logfire>=0.7.1
|
|
26
24
|
Requires-Dist: openai>=1.99.1
|
|
27
|
-
Requires-Dist: pathspec>=0.11.0
|
|
28
25
|
Requires-Dist: playwright>=1.40.0
|
|
29
26
|
Requires-Dist: prompt-toolkit>=3.0.52
|
|
30
|
-
Requires-Dist: pydantic-ai==1.0
|
|
27
|
+
Requires-Dist: pydantic-ai==1.25.0
|
|
31
28
|
Requires-Dist: pydantic>=2.4.0
|
|
32
|
-
Requires-Dist:
|
|
29
|
+
Requires-Dist: pyfiglet>=0.8.post1
|
|
33
30
|
Requires-Dist: pytest-cov>=6.1.1
|
|
34
31
|
Requires-Dist: python-dotenv>=1.0.0
|
|
35
32
|
Requires-Dist: rapidfuzz>=3.13.0
|
|
@@ -37,19 +34,48 @@ Requires-Dist: rich>=13.4.2
|
|
|
37
34
|
Requires-Dist: ripgrep==14.1.0
|
|
38
35
|
Requires-Dist: ruff>=0.11.11
|
|
39
36
|
Requires-Dist: tenacity>=8.2.0
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist: textual-dev>=1.7.0
|
|
42
|
-
Requires-Dist: textual>=5.0.0
|
|
43
|
-
Requires-Dist: uvicorn>=0.29.0
|
|
37
|
+
Requires-Dist: uvicorn>=0.30.0
|
|
44
38
|
Description-Content-Type: text/markdown
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-

|
|
43
|
+
|
|
44
|
+
**🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
|
|
45
|
+
|
|
46
|
+
[](https://pypi.org/project/code-puppy/)
|
|
47
|
+
[](https://pypi.org/project/code-puppy/)
|
|
48
|
+
[](https://python.org)
|
|
49
|
+
[](LICENSE)
|
|
50
|
+
[](https://github.com/mpfaffenberger/code_puppy/actions)
|
|
51
|
+
[](https://github.com/mpfaffenberger/code_puppy)
|
|
52
|
+
[](https://github.com/psf/black)
|
|
53
|
+
[](https://github.com/mpfaffenberger/code_puppy/tests)
|
|
54
|
+
|
|
55
|
+
[](https://openai.com)
|
|
56
|
+
[](https://ai.google.dev/)
|
|
57
|
+
[](https://anthropic.com)
|
|
58
|
+
[](https://cerebras.ai)
|
|
59
|
+
[](https://z.ai/)
|
|
60
|
+
[](https://synthetic.new)
|
|
61
|
+
|
|
62
|
+
[](https://github.com/mpfaffenberger/code_puppy)
|
|
63
|
+
[](https://github.com/pydantic/pydantic-ai)
|
|
64
|
+
|
|
65
|
+
[](https://github.com/mpfaffenberger/code_puppy/blob/main/README.md#code-puppy-privacy-commitment)
|
|
66
|
+
|
|
67
|
+
[](https://github.com/mpfaffenberger/code_puppy/stargazers)
|
|
68
|
+
[](https://github.com/mpfaffenberger/code_puppy/network)
|
|
69
|
+
|
|
70
|
+
**[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
|
|
71
|
+
|
|
72
|
+
*"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
|
|
73
|
+
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
51
78
|
|
|
52
|
-
*"Who needs an IDE?"* - someone, probably.
|
|
53
79
|
|
|
54
80
|
## Overview
|
|
55
81
|
|
|
@@ -63,33 +89,12 @@ Description-Content-Type: text/markdown
|
|
|
63
89
|
|
|
64
90
|
Code Puppy is an AI-powered code generation agent, designed to understand programming tasks, generate high-quality code, and explain its reasoning similar to tools like Windsurf and Cursor.
|
|
65
91
|
|
|
92
|
+
|
|
66
93
|
## Quick start
|
|
67
94
|
|
|
68
95
|
```bash
|
|
69
96
|
uvx code-puppy -i
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
## Features
|
|
74
|
-
|
|
75
|
-
### Session Autosave & Contexts
|
|
76
|
-
- Autosaves live in `~/.code_puppy/autosaves` and include a `.pkl` and `_meta.json` per session.
|
|
77
|
-
- On startup, you’ll be prompted to optionally load a recent autosave (with message counts and timestamps).
|
|
78
|
-
- Autosaves use a stable session ID per interactive run so subsequent prompts overwrite the same session (not N new files). Rotate via `/session new` when you want a fresh session.
|
|
79
|
-
- Loading an autosave makes it the active autosave target (future autosaves overwrite that loaded session).
|
|
80
|
-
- Loading a manual context with `/load_context <name>` automatically rotates the autosave ID to avoid overwriting anything.
|
|
81
|
-
- Helpers:
|
|
82
|
-
- `/session id` shows the current autosave ID and file prefix
|
|
83
|
-
- `/session new` rotates the autosave ID
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- **Multi-language support**: Capable of generating code in various programming languages.
|
|
87
|
-
- **Interactive CLI**: A command-line interface for interactive use.
|
|
88
|
-
- **Detailed explanations**: Provides insights into generated code to understand its logic and structure.
|
|
89
|
-
|
|
90
|
-
## Command Line Animation
|
|
91
|
-
|
|
92
|
-

|
|
97
|
+
````
|
|
93
98
|
|
|
94
99
|
## Installation
|
|
95
100
|
|
|
@@ -155,36 +160,51 @@ Please review this code for security issues." > .claude/commands/review.md
|
|
|
155
160
|
/review with focus on authentication
|
|
156
161
|
```
|
|
157
162
|
|
|
163
|
+
### Adding Models from models.dev 🆕
|
|
164
|
+
|
|
165
|
+
While there are several models configured right out of the box from providers like Synthetic, Cerebras, OpenAI, Google, and Anthropic, Code Puppy integrates with [models.dev](https://models.dev) to let you browse and add models from **65+ providers** with a single command:
|
|
166
|
+
|
|
158
167
|
```bash
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
export CEREBRAS_API_KEY=<your_cerebras_api_key> # for Cerebras models
|
|
162
|
-
export SYN_API_KEY=<your https://dev.synthetic.new api key> # for Synthetic provider
|
|
163
|
-
# or ...
|
|
168
|
+
/add_model
|
|
169
|
+
```
|
|
164
170
|
|
|
165
|
-
|
|
166
|
-
|
|
171
|
+
This opens an interactive TUI where you can:
|
|
172
|
+
- **Browse providers** - See all available AI providers (OpenAI, Anthropic, Groq, Mistral, xAI, Cohere, Perplexity, DeepInfra, and many more)
|
|
173
|
+
- **Preview model details** - View capabilities, pricing, context length, and features
|
|
174
|
+
- **One-click add** - Automatically configures the model with correct endpoints and API keys
|
|
167
175
|
|
|
168
|
-
|
|
176
|
+
#### Live API with Offline Fallback
|
|
177
|
+
|
|
178
|
+
The `/add_model` command fetches the latest model data from models.dev in real-time. If the API is unavailable, it falls back to a bundled database:
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
📡 Fetched latest models from models.dev # Live API
|
|
182
|
+
📦 Using bundled models database # Offline fallback
|
|
169
183
|
```
|
|
170
184
|
|
|
171
|
-
|
|
185
|
+
#### Supported Providers
|
|
172
186
|
|
|
173
|
-
Code Puppy
|
|
187
|
+
Code Puppy integrates with https://models.dev giving you access to 65 providers and >1000 different model offerings.
|
|
174
188
|
|
|
175
|
-
|
|
176
|
-
- `synthetic-Kimi-K2-Instruct-0905` (256K context)
|
|
177
|
-
- `synthetic-Qwen3-Coder-480B-A35B-Instruct` (256K context)
|
|
178
|
-
- `synthetic-GLM-4.6` (200K context)
|
|
189
|
+
There are **39+ additional providers** that already have OpenAI-compatible APIs configured in models.dev!
|
|
179
190
|
|
|
180
|
-
These
|
|
191
|
+
These providers are automatically configured with correct OpenAI-compatible endpoints, but have **not** been tested thoroughly:
|
|
181
192
|
|
|
182
|
-
|
|
193
|
+
| Provider | Endpoint | API Key Env Var |
|
|
194
|
+
|----------|----------|----------------|
|
|
195
|
+
| **xAI** (Grok) | `https://api.x.ai/v1` | `XAI_API_KEY` |
|
|
196
|
+
| **Groq** | `https://api.groq.com/openai/v1` | `GROQ_API_KEY` |
|
|
197
|
+
| **Mistral** | `https://api.mistral.ai/v1` | `MISTRAL_API_KEY` |
|
|
198
|
+
| **Together AI** | `https://api.together.xyz/v1` | `TOGETHER_API_KEY` |
|
|
199
|
+
| **Perplexity** | `https://api.perplexity.ai` | `PERPLEXITY_API_KEY` |
|
|
200
|
+
| **DeepInfra** | `https://api.deepinfra.com/v1/openai` | `DEEPINFRA_API_KEY` |
|
|
201
|
+
| **Cohere** | `https://api.cohere.com/compatibility/v1` | `COHERE_API_KEY` |
|
|
202
|
+
| **AIHubMix** | `https://aihubmix.com/v1` | `AIHUBMIX_API_KEY` |
|
|
183
203
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
204
|
+
#### Smart Warnings
|
|
205
|
+
|
|
206
|
+
- **⚠️ Unsupported Providers** - Providers like Amazon Bedrock and Google Vertex that require special authentication are clearly marked
|
|
207
|
+
- **⚠️ No Tool Calling** - Models without tool calling support show a big warning since they can't use Code Puppy's file/shell tools
|
|
188
208
|
|
|
189
209
|
### Durable Execution
|
|
190
210
|
|
|
@@ -203,8 +223,9 @@ Config takes precedence if set; otherwise the environment variable is used.
|
|
|
203
223
|
|
|
204
224
|
The following environment variables control DBOS behavior:
|
|
205
225
|
- `DBOS_CONDUCTOR_KEY`: If set, Code Puppy connects to the [DBOS Management Console](https://console.dbos.dev/). Make sure you first register an app named `dbos-code-puppy` on the console to generate a Conductor key. Default: `None`.
|
|
206
|
-
- `DBOS_LOG_LEVEL`: Logging verbosity: `ERROR`, `WARNING`, `INFO`, or `DEBUG`. Default: `ERROR`.
|
|
226
|
+
- `DBOS_LOG_LEVEL`: Logging verbosity: `CRITICAL`, `ERROR`, `WARNING`, `INFO`, or `DEBUG`. Default: `ERROR`.
|
|
207
227
|
- `DBOS_SYSTEM_DATABASE_URL`: Database URL used by DBOS. Can point to a local SQLite file or a Postgres instance. Example: `postgresql://postgres:dbos@localhost:5432/postgres`. Default: `dbos_store.sqlite` file in the config directory.
|
|
228
|
+
- `DBOS_APP_VERSION`: If set, Code Puppy uses it as the [DBOS application version](https://docs.dbos.dev/architecture#application-and-workflow-versions) and automatically tries to recover pending workflows for this version. Default: Code Puppy version + Unix timestamp in millisecond (disable automatic recovery).
|
|
208
229
|
|
|
209
230
|
|
|
210
231
|
## Requirements
|
|
@@ -216,10 +237,6 @@ The following environment variables control DBOS behavior:
|
|
|
216
237
|
- Anthropic key (for Claude models)
|
|
217
238
|
- Ollama endpoint available
|
|
218
239
|
|
|
219
|
-
## License
|
|
220
|
-
|
|
221
|
-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
222
|
-
|
|
223
240
|
## Agent Rules
|
|
224
241
|
We support AGENT.md files for defining coding standards and styles that your code should comply with. These rules can cover various aspects such as formatting, naming conventions, and even design guidelines.
|
|
225
242
|
|
|
@@ -229,8 +246,6 @@ For examples and more information about agent rules, visit [https://agent.md](ht
|
|
|
229
246
|
|
|
230
247
|
Use the `/mcp` command to manage MCP (list, start, stop, status, etc.)
|
|
231
248
|
|
|
232
|
-
In the TUI you can click on MCP settings on the footer and interact with a mini-marketplace.
|
|
233
|
-
|
|
234
249
|
Watch this video for examples! https://www.youtube.com/watch?v=1t1zEetOqlo
|
|
235
250
|
|
|
236
251
|
|
|
@@ -742,8 +757,28 @@ Consider contributing agent templates for:
|
|
|
742
757
|
|
|
743
758
|
---
|
|
744
759
|
|
|
745
|
-
|
|
760
|
+
# Code Puppy Privacy Commitment
|
|
761
|
+
|
|
762
|
+
**Zero-compromise privacy policy. Always.**
|
|
763
|
+
|
|
764
|
+
Unlike other Agentic Coding software, there is no corporate or investor backing for this project, which means **zero pressure to compromise our principles for profit**. This isn't just a nice-to-have feature – it's fundamental to the project's DNA.
|
|
765
|
+
|
|
766
|
+
### What Code Puppy _absolutely does not_ collect:
|
|
767
|
+
- ❌ **Zero telemetry** – no usage analytics, crash reports, or behavioral tracking
|
|
768
|
+
- ❌ **Zero prompt logging** – your code, conversations, or project details are never stored
|
|
769
|
+
- ❌ **Zero behavioral profiling** – we don't track what you build, how you code, or when you use the tool
|
|
770
|
+
- ❌ **Zero third-party data sharing** – your information is never sold, traded, or given away
|
|
746
771
|
|
|
772
|
+
### What data flows where:
|
|
773
|
+
- **LLM Provider Communication**: Your prompts are sent directly to whichever LLM provider you've configured (OpenAI, Anthropic, local models, etc.) – this is unavoidable for AI functionality
|
|
774
|
+
- **Complete Local Option**: Run your own VLLM/SGLang/Llama.cpp server locally → **zero data leaves your network**. Configure this with `~/.code_puppy/extra_models.json`
|
|
775
|
+
- **Direct Developer Contact**: All feature requests, bug reports, and discussions happen directly with me – no middleman analytics platforms or customer data harvesting tools
|
|
747
776
|
|
|
748
|
-
|
|
749
|
-
|
|
777
|
+
### Our privacy-first architecture:
|
|
778
|
+
Code Puppy is designed with privacy-by-design principles. Every feature has been evaluated through a privacy lens, and every integration respects user data sovereignty. When you use Code Puppy, you're not the product – you're just a developer getting things done.
|
|
779
|
+
|
|
780
|
+
**This commitment is enforceable because it's structurally impossible to violate it.** No external pressures, no investor demands, no quarterly earnings targets to hit. Just solid code that respects your privacy.
|
|
781
|
+
|
|
782
|
+
## License
|
|
783
|
+
|
|
784
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -1,10 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-

|
|
4
|
+
|
|
5
|
+
**🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
|
|
6
|
+
|
|
7
|
+
[](https://pypi.org/project/code-puppy/)
|
|
8
|
+
[](https://pypi.org/project/code-puppy/)
|
|
9
|
+
[](https://python.org)
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://github.com/mpfaffenberger/code_puppy/actions)
|
|
12
|
+
[](https://github.com/mpfaffenberger/code_puppy)
|
|
13
|
+
[](https://github.com/psf/black)
|
|
14
|
+
[](https://github.com/mpfaffenberger/code_puppy/tests)
|
|
15
|
+
|
|
16
|
+
[](https://openai.com)
|
|
17
|
+
[](https://ai.google.dev/)
|
|
18
|
+
[](https://anthropic.com)
|
|
19
|
+
[](https://cerebras.ai)
|
|
20
|
+
[](https://z.ai/)
|
|
21
|
+
[](https://synthetic.new)
|
|
22
|
+
|
|
23
|
+
[](https://github.com/mpfaffenberger/code_puppy)
|
|
24
|
+
[](https://github.com/pydantic/pydantic-ai)
|
|
25
|
+
|
|
26
|
+
[](https://github.com/mpfaffenberger/code_puppy/blob/main/README.md#code-puppy-privacy-commitment)
|
|
27
|
+
|
|
28
|
+
[](https://github.com/mpfaffenberger/code_puppy/stargazers)
|
|
29
|
+
[](https://github.com/mpfaffenberger/code_puppy/network)
|
|
30
|
+
|
|
31
|
+
**[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
|
|
32
|
+
|
|
33
|
+
*"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
|
|
34
|
+
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
6
39
|
|
|
7
|
-
*"Who needs an IDE?"* - someone, probably.
|
|
8
40
|
|
|
9
41
|
## Overview
|
|
10
42
|
|
|
@@ -18,33 +50,12 @@
|
|
|
18
50
|
|
|
19
51
|
Code Puppy is an AI-powered code generation agent, designed to understand programming tasks, generate high-quality code, and explain its reasoning similar to tools like Windsurf and Cursor.
|
|
20
52
|
|
|
53
|
+
|
|
21
54
|
## Quick start
|
|
22
55
|
|
|
23
56
|
```bash
|
|
24
57
|
uvx code-puppy -i
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
## Features
|
|
29
|
-
|
|
30
|
-
### Session Autosave & Contexts
|
|
31
|
-
- Autosaves live in `~/.code_puppy/autosaves` and include a `.pkl` and `_meta.json` per session.
|
|
32
|
-
- On startup, you’ll be prompted to optionally load a recent autosave (with message counts and timestamps).
|
|
33
|
-
- Autosaves use a stable session ID per interactive run so subsequent prompts overwrite the same session (not N new files). Rotate via `/session new` when you want a fresh session.
|
|
34
|
-
- Loading an autosave makes it the active autosave target (future autosaves overwrite that loaded session).
|
|
35
|
-
- Loading a manual context with `/load_context <name>` automatically rotates the autosave ID to avoid overwriting anything.
|
|
36
|
-
- Helpers:
|
|
37
|
-
- `/session id` shows the current autosave ID and file prefix
|
|
38
|
-
- `/session new` rotates the autosave ID
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
- **Multi-language support**: Capable of generating code in various programming languages.
|
|
42
|
-
- **Interactive CLI**: A command-line interface for interactive use.
|
|
43
|
-
- **Detailed explanations**: Provides insights into generated code to understand its logic and structure.
|
|
44
|
-
|
|
45
|
-
## Command Line Animation
|
|
46
|
-
|
|
47
|
-

|
|
58
|
+
````
|
|
48
59
|
|
|
49
60
|
## Installation
|
|
50
61
|
|
|
@@ -110,36 +121,51 @@ Please review this code for security issues." > .claude/commands/review.md
|
|
|
110
121
|
/review with focus on authentication
|
|
111
122
|
```
|
|
112
123
|
|
|
124
|
+
### Adding Models from models.dev 🆕
|
|
125
|
+
|
|
126
|
+
While there are several models configured right out of the box from providers like Synthetic, Cerebras, OpenAI, Google, and Anthropic, Code Puppy integrates with [models.dev](https://models.dev) to let you browse and add models from **65+ providers** with a single command:
|
|
127
|
+
|
|
113
128
|
```bash
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
export CEREBRAS_API_KEY=<your_cerebras_api_key> # for Cerebras models
|
|
117
|
-
export SYN_API_KEY=<your https://dev.synthetic.new api key> # for Synthetic provider
|
|
118
|
-
# or ...
|
|
129
|
+
/add_model
|
|
130
|
+
```
|
|
119
131
|
|
|
120
|
-
|
|
121
|
-
|
|
132
|
+
This opens an interactive TUI where you can:
|
|
133
|
+
- **Browse providers** - See all available AI providers (OpenAI, Anthropic, Groq, Mistral, xAI, Cohere, Perplexity, DeepInfra, and many more)
|
|
134
|
+
- **Preview model details** - View capabilities, pricing, context length, and features
|
|
135
|
+
- **One-click add** - Automatically configures the model with correct endpoints and API keys
|
|
122
136
|
|
|
123
|
-
|
|
137
|
+
#### Live API with Offline Fallback
|
|
138
|
+
|
|
139
|
+
The `/add_model` command fetches the latest model data from models.dev in real-time. If the API is unavailable, it falls back to a bundled database:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
📡 Fetched latest models from models.dev # Live API
|
|
143
|
+
📦 Using bundled models database # Offline fallback
|
|
124
144
|
```
|
|
125
145
|
|
|
126
|
-
|
|
146
|
+
#### Supported Providers
|
|
127
147
|
|
|
128
|
-
Code Puppy
|
|
148
|
+
Code Puppy integrates with https://models.dev giving you access to 65 providers and >1000 different model offerings.
|
|
129
149
|
|
|
130
|
-
|
|
131
|
-
- `synthetic-Kimi-K2-Instruct-0905` (256K context)
|
|
132
|
-
- `synthetic-Qwen3-Coder-480B-A35B-Instruct` (256K context)
|
|
133
|
-
- `synthetic-GLM-4.6` (200K context)
|
|
150
|
+
There are **39+ additional providers** that already have OpenAI-compatible APIs configured in models.dev!
|
|
134
151
|
|
|
135
|
-
These
|
|
152
|
+
These providers are automatically configured with correct OpenAI-compatible endpoints, but have **not** been tested thoroughly:
|
|
136
153
|
|
|
137
|
-
|
|
154
|
+
| Provider | Endpoint | API Key Env Var |
|
|
155
|
+
|----------|----------|----------------|
|
|
156
|
+
| **xAI** (Grok) | `https://api.x.ai/v1` | `XAI_API_KEY` |
|
|
157
|
+
| **Groq** | `https://api.groq.com/openai/v1` | `GROQ_API_KEY` |
|
|
158
|
+
| **Mistral** | `https://api.mistral.ai/v1` | `MISTRAL_API_KEY` |
|
|
159
|
+
| **Together AI** | `https://api.together.xyz/v1` | `TOGETHER_API_KEY` |
|
|
160
|
+
| **Perplexity** | `https://api.perplexity.ai` | `PERPLEXITY_API_KEY` |
|
|
161
|
+
| **DeepInfra** | `https://api.deepinfra.com/v1/openai` | `DEEPINFRA_API_KEY` |
|
|
162
|
+
| **Cohere** | `https://api.cohere.com/compatibility/v1` | `COHERE_API_KEY` |
|
|
163
|
+
| **AIHubMix** | `https://aihubmix.com/v1` | `AIHUBMIX_API_KEY` |
|
|
138
164
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
165
|
+
#### Smart Warnings
|
|
166
|
+
|
|
167
|
+
- **⚠️ Unsupported Providers** - Providers like Amazon Bedrock and Google Vertex that require special authentication are clearly marked
|
|
168
|
+
- **⚠️ No Tool Calling** - Models without tool calling support show a big warning since they can't use Code Puppy's file/shell tools
|
|
143
169
|
|
|
144
170
|
### Durable Execution
|
|
145
171
|
|
|
@@ -158,8 +184,9 @@ Config takes precedence if set; otherwise the environment variable is used.
|
|
|
158
184
|
|
|
159
185
|
The following environment variables control DBOS behavior:
|
|
160
186
|
- `DBOS_CONDUCTOR_KEY`: If set, Code Puppy connects to the [DBOS Management Console](https://console.dbos.dev/). Make sure you first register an app named `dbos-code-puppy` on the console to generate a Conductor key. Default: `None`.
|
|
161
|
-
- `DBOS_LOG_LEVEL`: Logging verbosity: `ERROR`, `WARNING`, `INFO`, or `DEBUG`. Default: `ERROR`.
|
|
187
|
+
- `DBOS_LOG_LEVEL`: Logging verbosity: `CRITICAL`, `ERROR`, `WARNING`, `INFO`, or `DEBUG`. Default: `ERROR`.
|
|
162
188
|
- `DBOS_SYSTEM_DATABASE_URL`: Database URL used by DBOS. Can point to a local SQLite file or a Postgres instance. Example: `postgresql://postgres:dbos@localhost:5432/postgres`. Default: `dbos_store.sqlite` file in the config directory.
|
|
189
|
+
- `DBOS_APP_VERSION`: If set, Code Puppy uses it as the [DBOS application version](https://docs.dbos.dev/architecture#application-and-workflow-versions) and automatically tries to recover pending workflows for this version. Default: Code Puppy version + Unix timestamp in millisecond (disable automatic recovery).
|
|
163
190
|
|
|
164
191
|
|
|
165
192
|
## Requirements
|
|
@@ -171,10 +198,6 @@ The following environment variables control DBOS behavior:
|
|
|
171
198
|
- Anthropic key (for Claude models)
|
|
172
199
|
- Ollama endpoint available
|
|
173
200
|
|
|
174
|
-
## License
|
|
175
|
-
|
|
176
|
-
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
177
|
-
|
|
178
201
|
## Agent Rules
|
|
179
202
|
We support AGENT.md files for defining coding standards and styles that your code should comply with. These rules can cover various aspects such as formatting, naming conventions, and even design guidelines.
|
|
180
203
|
|
|
@@ -184,8 +207,6 @@ For examples and more information about agent rules, visit [https://agent.md](ht
|
|
|
184
207
|
|
|
185
208
|
Use the `/mcp` command to manage MCP (list, start, stop, status, etc.)
|
|
186
209
|
|
|
187
|
-
In the TUI you can click on MCP settings on the footer and interact with a mini-marketplace.
|
|
188
|
-
|
|
189
210
|
Watch this video for examples! https://www.youtube.com/watch?v=1t1zEetOqlo
|
|
190
211
|
|
|
191
212
|
|
|
@@ -697,8 +718,28 @@ Consider contributing agent templates for:
|
|
|
697
718
|
|
|
698
719
|
---
|
|
699
720
|
|
|
700
|
-
|
|
721
|
+
# Code Puppy Privacy Commitment
|
|
722
|
+
|
|
723
|
+
**Zero-compromise privacy policy. Always.**
|
|
724
|
+
|
|
725
|
+
Unlike other Agentic Coding software, there is no corporate or investor backing for this project, which means **zero pressure to compromise our principles for profit**. This isn't just a nice-to-have feature – it's fundamental to the project's DNA.
|
|
726
|
+
|
|
727
|
+
### What Code Puppy _absolutely does not_ collect:
|
|
728
|
+
- ❌ **Zero telemetry** – no usage analytics, crash reports, or behavioral tracking
|
|
729
|
+
- ❌ **Zero prompt logging** – your code, conversations, or project details are never stored
|
|
730
|
+
- ❌ **Zero behavioral profiling** – we don't track what you build, how you code, or when you use the tool
|
|
731
|
+
- ❌ **Zero third-party data sharing** – your information is never sold, traded, or given away
|
|
701
732
|
|
|
733
|
+
### What data flows where:
|
|
734
|
+
- **LLM Provider Communication**: Your prompts are sent directly to whichever LLM provider you've configured (OpenAI, Anthropic, local models, etc.) – this is unavoidable for AI functionality
|
|
735
|
+
- **Complete Local Option**: Run your own VLLM/SGLang/Llama.cpp server locally → **zero data leaves your network**. Configure this with `~/.code_puppy/extra_models.json`
|
|
736
|
+
- **Direct Developer Contact**: All feature requests, bug reports, and discussions happen directly with me – no middleman analytics platforms or customer data harvesting tools
|
|
702
737
|
|
|
703
|
-
|
|
704
|
-
|
|
738
|
+
### Our privacy-first architecture:
|
|
739
|
+
Code Puppy is designed with privacy-by-design principles. Every feature has been evaluated through a privacy lens, and every integration respects user data sovereignty. When you use Code Puppy, you're not the product – you're just a developer getting things done.
|
|
740
|
+
|
|
741
|
+
**This commitment is enforceable because it's structurally impossible to violate it.** No external pressures, no investor demands, no quarterly earnings targets to hit. Just solid code that respects your privacy.
|
|
742
|
+
|
|
743
|
+
## License
|
|
744
|
+
|
|
745
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import importlib.metadata
|
|
2
|
+
|
|
3
|
+
# Biscuit was here! 🐶
|
|
4
|
+
try:
|
|
5
|
+
_detected_version = importlib.metadata.version("code-puppy")
|
|
6
|
+
# Ensure we never end up with None or empty string
|
|
7
|
+
__version__ = _detected_version if _detected_version else "0.0.0-dev"
|
|
8
|
+
except Exception:
|
|
9
|
+
# Fallback for dev environments where metadata might not be available
|
|
10
|
+
__version__ = "0.0.0-dev"
|
|
@@ -128,7 +128,11 @@ Reasoning & Explanation:
|
|
|
128
128
|
|
|
129
129
|
Agent Management:
|
|
130
130
|
- list_agents(): Use this to list all available sub-agents that can be invoked
|
|
131
|
-
- invoke_agent(agent_name: str, prompt: str): Use this to invoke a specific sub-agent with a given prompt
|
|
131
|
+
- invoke_agent(agent_name: str, prompt: str, session_id: str | None = None): Use this to invoke a specific sub-agent with a given prompt.
|
|
132
|
+
Returns: {{response, agent_name, session_id, error}} - The session_id in the response is the FULL ID to use for continuation!
|
|
133
|
+
- For NEW sessions: provide a base name like "review-auth" - a SHA1 hash suffix is automatically appended
|
|
134
|
+
- To CONTINUE a session: use the session_id from the previous invocation's response
|
|
135
|
+
- For one-off tasks: leave session_id as None (auto-generates)
|
|
132
136
|
|
|
133
137
|
Important rules:
|
|
134
138
|
- You MUST use tools to accomplish tasks - DO NOT just output code or descriptions
|
|
@@ -216,16 +216,52 @@ Use this to explicitly share your thought process and planned next steps
|
|
|
216
216
|
#### `list_agents()`
|
|
217
217
|
Use this to list all available sub-agents that can be invoked
|
|
218
218
|
|
|
219
|
-
#### `invoke_agent(agent_name: str, user_prompt: str)`
|
|
219
|
+
#### `invoke_agent(agent_name: str, user_prompt: str, session_id: str | None = None)`
|
|
220
220
|
Use this to invoke another agent with a specific prompt. This allows agents to delegate tasks to specialized sub-agents.
|
|
221
221
|
|
|
222
222
|
Arguments:
|
|
223
223
|
- agent_name (required): Name of the agent to invoke
|
|
224
224
|
- user_prompt (required): The prompt to send to the invoked agent
|
|
225
|
+
- session_id (optional): Kebab-case session identifier for conversation memory
|
|
226
|
+
- Format: lowercase, numbers, hyphens only (e.g., "implement-oauth", "review-auth")
|
|
227
|
+
- For NEW sessions: provide a base name - a SHA1 hash suffix is automatically appended for uniqueness
|
|
228
|
+
- To CONTINUE a session: use the session_id from the previous invocation's response
|
|
229
|
+
- If None (default): Auto-generates a unique session like "agent-name-session-a3f2b1"
|
|
230
|
+
|
|
231
|
+
Returns: `{{response, agent_name, session_id, error}}`
|
|
232
|
+
- **session_id in the response is the FULL ID** - use this to continue the conversation!
|
|
225
233
|
|
|
226
234
|
Example usage:
|
|
227
235
|
```python
|
|
228
|
-
|
|
236
|
+
# Common case: one-off invocation (no memory needed)
|
|
237
|
+
result = invoke_agent(
|
|
238
|
+
agent_name="python-tutor",
|
|
239
|
+
user_prompt="Explain how to use list comprehensions"
|
|
240
|
+
)
|
|
241
|
+
# result.session_id contains the auto-generated full ID
|
|
242
|
+
|
|
243
|
+
# Multi-turn conversation: start with a base session_id
|
|
244
|
+
result1 = invoke_agent(
|
|
245
|
+
agent_name="code-reviewer",
|
|
246
|
+
user_prompt="Review this authentication code",
|
|
247
|
+
session_id="auth-code-review" # Hash suffix auto-appended
|
|
248
|
+
)
|
|
249
|
+
# result1.session_id is now "auth-code-review-a3f2b1" (or similar)
|
|
250
|
+
|
|
251
|
+
# Continue the SAME conversation using session_id from the response
|
|
252
|
+
result2 = invoke_agent(
|
|
253
|
+
agent_name="code-reviewer",
|
|
254
|
+
user_prompt="Can you also check the authorization logic?",
|
|
255
|
+
session_id=result1.session_id # Use session_id from previous response!
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Independent task (different base name = different session)
|
|
259
|
+
result3 = invoke_agent(
|
|
260
|
+
agent_name="code-reviewer",
|
|
261
|
+
user_prompt="Review the payment processing code",
|
|
262
|
+
session_id="payment-review" # Gets its own unique hash suffix
|
|
263
|
+
)
|
|
264
|
+
# result3.session_id is different from result1.session_id
|
|
229
265
|
```
|
|
230
266
|
|
|
231
267
|
Best-practice guidelines for `invoke_agent`:
|
|
@@ -233,6 +269,11 @@ Best-practice guidelines for `invoke_agent`:
|
|
|
233
269
|
• Clearly specify what you want the invoked agent to do
|
|
234
270
|
• Be specific in your prompts to get better results
|
|
235
271
|
• Avoid circular dependencies (don't invoke yourself!)
|
|
272
|
+
• **Session management:**
|
|
273
|
+
- Default behavior (session_id=None): Each invocation is independent with no memory
|
|
274
|
+
- For NEW sessions: provide a human-readable base name like "review-oauth" - hash suffix is auto-appended
|
|
275
|
+
- To CONTINUE: use the session_id from the previous response (it contains the full ID with hash)
|
|
276
|
+
- Most tasks don't need conversational memory - let it auto-generate!
|
|
236
277
|
|
|
237
278
|
### Important Rules for Agent Creation:
|
|
238
279
|
- You MUST use tools to accomplish tasks - DO NOT just output code or descriptions
|
|
@@ -28,9 +28,9 @@ _SESSION_FILE_LOADED: bool = False
|
|
|
28
28
|
# Session persistence file path
|
|
29
29
|
def _get_session_file_path() -> Path:
|
|
30
30
|
"""Get the path to the terminal sessions file."""
|
|
31
|
-
from ..config import
|
|
31
|
+
from ..config import STATE_DIR
|
|
32
32
|
|
|
33
|
-
return Path(
|
|
33
|
+
return Path(STATE_DIR) / "terminal_sessions.json"
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
def get_terminal_session_id() -> str:
|
|
@@ -268,11 +268,21 @@ def get_current_agent_name() -> str:
|
|
|
268
268
|
"""Get the name of the currently active agent for this terminal session.
|
|
269
269
|
|
|
270
270
|
Returns:
|
|
271
|
-
The name of the current agent for this session
|
|
271
|
+
The name of the current agent for this session.
|
|
272
|
+
Priority: session agent > config default > 'code-puppy'.
|
|
272
273
|
"""
|
|
273
274
|
_ensure_session_cache_loaded()
|
|
274
275
|
session_id = get_terminal_session_id()
|
|
275
|
-
|
|
276
|
+
|
|
277
|
+
# First check for session-specific agent
|
|
278
|
+
session_agent = _SESSION_AGENTS_CACHE.get(session_id)
|
|
279
|
+
if session_agent:
|
|
280
|
+
return session_agent
|
|
281
|
+
|
|
282
|
+
# Fall back to config default
|
|
283
|
+
from ..config import get_default_agent
|
|
284
|
+
|
|
285
|
+
return get_default_agent()
|
|
276
286
|
|
|
277
287
|
|
|
278
288
|
def set_current_agent(agent_name: str) -> bool:
|