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.
Files changed (199) hide show
  1. {code_puppy-0.0.237 → code_puppy-0.0.314}/.gitignore +4 -0
  2. {code_puppy-0.0.237 → code_puppy-0.0.314}/PKG-INFO +106 -71
  3. {code_puppy-0.0.237 → code_puppy-0.0.314}/README.md +100 -59
  4. code_puppy-0.0.314/code_puppy/__init__.py +10 -0
  5. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_code_puppy.py +5 -1
  6. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_creator_agent.py +43 -2
  7. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_manager.py +14 -4
  8. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_planning.py +3 -3
  9. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/base_agent.py +480 -130
  10. code_puppy-0.0.314/code_puppy/agents/prompt_reviewer.py +145 -0
  11. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/callbacks.py +28 -4
  12. code_puppy-0.0.314/code_puppy/chatgpt_codex_client.py +281 -0
  13. code_puppy-0.0.314/code_puppy/claude_cache_client.py +165 -0
  14. code_puppy-0.0.314/code_puppy/command_line/add_model_menu.py +1065 -0
  15. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/attachments.py +10 -5
  16. code_puppy-0.0.314/code_puppy/command_line/autosave_menu.py +606 -0
  17. code_puppy-0.0.314/code_puppy/command_line/command_handler.py +282 -0
  18. code_puppy-0.0.314/code_puppy/command_line/command_registry.py +150 -0
  19. code_puppy-0.0.314/code_puppy/command_line/config_commands.py +661 -0
  20. code_puppy-0.0.314/code_puppy/command_line/core_commands.py +730 -0
  21. code_puppy-0.0.314/code_puppy/command_line/diff_menu.py +858 -0
  22. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/load_context_completion.py +15 -22
  23. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/add_command.py +3 -16
  24. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/base.py +0 -3
  25. code_puppy-0.0.314/code_puppy/command_line/mcp/catalog_server_installer.py +176 -0
  26. code_puppy-0.0.314/code_puppy/command_line/mcp/custom_server_form.py +649 -0
  27. code_puppy-0.0.314/code_puppy/command_line/mcp/custom_server_installer.py +196 -0
  28. code_puppy-0.0.314/code_puppy/command_line/mcp/edit_command.py +148 -0
  29. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/handler.py +9 -2
  30. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/help_command.py +7 -2
  31. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/install_command.py +15 -26
  32. code_puppy-0.0.314/code_puppy/command_line/mcp/install_menu.py +681 -0
  33. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/list_command.py +2 -2
  34. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/logs_command.py +2 -2
  35. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/remove_command.py +2 -2
  36. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/restart_command.py +12 -4
  37. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/search_command.py +16 -10
  38. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/start_all_command.py +18 -6
  39. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/start_command.py +14 -10
  40. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/status_command.py +4 -5
  41. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/stop_all_command.py +7 -1
  42. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/stop_command.py +8 -4
  43. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/test_command.py +2 -2
  44. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/wizard_utils.py +20 -16
  45. code_puppy-0.0.314/code_puppy/command_line/mcp_completion.py +174 -0
  46. code_puppy-0.0.314/code_puppy/command_line/model_picker_completion.py +179 -0
  47. code_puppy-0.0.314/code_puppy/command_line/model_settings_menu.py +827 -0
  48. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/motd.py +5 -5
  49. code_puppy-0.0.314/code_puppy/command_line/pin_command_completion.py +329 -0
  50. code_puppy-0.0.314/code_puppy/command_line/prompt_toolkit_completion.py +701 -0
  51. code_puppy-0.0.314/code_puppy/command_line/session_commands.py +296 -0
  52. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/config.py +633 -134
  53. code_puppy-0.0.314/code_puppy/error_logging.py +118 -0
  54. code_puppy-0.0.314/code_puppy/gemini_code_assist.py +385 -0
  55. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/http_utils.py +142 -5
  56. code_puppy-0.0.314/code_puppy/keymap.py +120 -0
  57. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/main.py +275 -227
  58. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/blocking_startup.py +9 -11
  59. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/captured_stdio_server.py +2 -2
  60. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/config_wizard.py +4 -4
  61. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/dashboard.py +15 -6
  62. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/managed_server.py +3 -21
  63. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/registry.py +6 -6
  64. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/server_registry_catalog.py +24 -5
  65. code_puppy-0.0.314/code_puppy/messaging/__init__.py +223 -0
  66. code_puppy-0.0.314/code_puppy/messaging/bus.py +610 -0
  67. code_puppy-0.0.314/code_puppy/messaging/commands.py +167 -0
  68. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/message_queue.py +10 -29
  69. code_puppy-0.0.314/code_puppy/messaging/messages.py +470 -0
  70. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/queue_console.py +0 -23
  71. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/renderers.py +43 -146
  72. code_puppy-0.0.314/code_puppy/messaging/rich_renderer.py +877 -0
  73. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/__init__.py +1 -3
  74. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/console_spinner.py +80 -51
  75. code_puppy-0.0.314/code_puppy/model_factory.py +744 -0
  76. code_puppy-0.0.314/code_puppy/model_utils.py +113 -0
  77. code_puppy-0.0.314/code_puppy/models.json +118 -0
  78. code_puppy-0.0.314/code_puppy/models_dev_api.json +1 -0
  79. code_puppy-0.0.314/code_puppy/models_dev_parser.py +592 -0
  80. code_puppy-0.0.314/code_puppy/plugins/__init__.py +174 -0
  81. code_puppy-0.0.314/code_puppy/plugins/chatgpt_oauth/config.py +52 -0
  82. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +12 -8
  83. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +3 -3
  84. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +30 -13
  85. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/utils.py +191 -9
  86. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/config.py +15 -11
  87. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +47 -9
  88. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/test_plugin.py +1 -1
  89. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/utils.py +113 -7
  90. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -3
  91. code_puppy-0.0.314/code_puppy/plugins/example_custom_command/README.md +280 -0
  92. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/example_custom_command/register_callbacks.py +2 -2
  93. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/file_permission_handler/register_callbacks.py +168 -112
  94. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/oauth_puppy_html.py +3 -0
  95. code_puppy-0.0.314/code_puppy/plugins/shell_safety/__init__.py +6 -0
  96. code_puppy-0.0.314/code_puppy/plugins/shell_safety/agent_shell_safety.py +186 -0
  97. code_puppy-0.0.314/code_puppy/plugins/shell_safety/command_cache.py +156 -0
  98. code_puppy-0.0.314/code_puppy/plugins/shell_safety/register_callbacks.py +161 -0
  99. code_puppy-0.0.314/code_puppy/prompts/codex_system_prompt.md +310 -0
  100. code_puppy-0.0.314/code_puppy/pydantic_patches.py +131 -0
  101. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/round_robin_model.py +9 -12
  102. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/session_storage.py +2 -1
  103. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/status_display.py +17 -4
  104. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/summarization_agent.py +41 -13
  105. code_puppy-0.0.314/code_puppy/tools/agent_tools.py +568 -0
  106. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_control.py +13 -17
  107. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_interactions.py +20 -28
  108. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_locators.py +27 -29
  109. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_navigation.py +9 -9
  110. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_screenshot.py +12 -14
  111. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_scripts.py +17 -29
  112. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/browser_workflows.py +44 -27
  113. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/camoufox_manager.py +30 -31
  114. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/vqa_agent.py +24 -4
  115. code_puppy-0.0.314/code_puppy/tools/command_runner.py +1206 -0
  116. code_puppy-0.0.314/code_puppy/tools/common.py +1414 -0
  117. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/file_modifications.py +166 -253
  118. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/file_operations.py +226 -154
  119. code_puppy-0.0.314/code_puppy/version_checker.py +54 -0
  120. {code_puppy-0.0.237 → code_puppy-0.0.314}/pyproject.toml +13 -12
  121. code_puppy-0.0.237/code_puppy/__init__.py +0 -8
  122. code_puppy-0.0.237/code_puppy/command_line/command_handler.py +0 -1141
  123. code_puppy-0.0.237/code_puppy/command_line/model_picker_completion.py +0 -129
  124. code_puppy-0.0.237/code_puppy/command_line/prompt_toolkit_completion.py +0 -420
  125. code_puppy-0.0.237/code_puppy/messaging/__init__.py +0 -50
  126. code_puppy-0.0.237/code_puppy/messaging/spinner/textual_spinner.py +0 -106
  127. code_puppy-0.0.237/code_puppy/model_factory.py +0 -402
  128. code_puppy-0.0.237/code_puppy/models.json +0 -126
  129. code_puppy-0.0.237/code_puppy/plugins/__init__.py +0 -32
  130. code_puppy-0.0.237/code_puppy/plugins/chatgpt_oauth/config.py +0 -44
  131. code_puppy-0.0.237/code_puppy/tools/agent_tools.py +0 -205
  132. code_puppy-0.0.237/code_puppy/tools/command_runner.py +0 -630
  133. code_puppy-0.0.237/code_puppy/tools/common.py +0 -475
  134. code_puppy-0.0.237/code_puppy/tui/__init__.py +0 -10
  135. code_puppy-0.0.237/code_puppy/tui/app.py +0 -1129
  136. code_puppy-0.0.237/code_puppy/tui/components/__init__.py +0 -21
  137. code_puppy-0.0.237/code_puppy/tui/components/chat_view.py +0 -551
  138. code_puppy-0.0.237/code_puppy/tui/components/command_history_modal.py +0 -218
  139. code_puppy-0.0.237/code_puppy/tui/components/copy_button.py +0 -139
  140. code_puppy-0.0.237/code_puppy/tui/components/custom_widgets.py +0 -63
  141. code_puppy-0.0.237/code_puppy/tui/components/human_input_modal.py +0 -175
  142. code_puppy-0.0.237/code_puppy/tui/components/input_area.py +0 -167
  143. code_puppy-0.0.237/code_puppy/tui/components/sidebar.py +0 -309
  144. code_puppy-0.0.237/code_puppy/tui/components/status_bar.py +0 -185
  145. code_puppy-0.0.237/code_puppy/tui/messages.py +0 -27
  146. code_puppy-0.0.237/code_puppy/tui/models/__init__.py +0 -8
  147. code_puppy-0.0.237/code_puppy/tui/models/chat_message.py +0 -25
  148. code_puppy-0.0.237/code_puppy/tui/models/command_history.py +0 -89
  149. code_puppy-0.0.237/code_puppy/tui/models/enums.py +0 -24
  150. code_puppy-0.0.237/code_puppy/tui/screens/__init__.py +0 -19
  151. code_puppy-0.0.237/code_puppy/tui/screens/autosave_picker.py +0 -175
  152. code_puppy-0.0.237/code_puppy/tui/screens/help.py +0 -130
  153. code_puppy-0.0.237/code_puppy/tui/screens/mcp_install_wizard.py +0 -803
  154. code_puppy-0.0.237/code_puppy/tui/screens/model_picker.py +0 -125
  155. code_puppy-0.0.237/code_puppy/tui/screens/settings.py +0 -306
  156. code_puppy-0.0.237/code_puppy/tui/screens/tools.py +0 -74
  157. code_puppy-0.0.237/code_puppy/tui_state.py +0 -55
  158. code_puppy-0.0.237/code_puppy/version_checker.py +0 -35
  159. {code_puppy-0.0.237 → code_puppy-0.0.314}/LICENSE +0 -0
  160. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/__main__.py +0 -0
  161. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/__init__.py +0 -0
  162. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_c_reviewer.py +0 -0
  163. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_code_reviewer.py +0 -0
  164. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  165. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  166. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  167. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_python_programmer.py +0 -0
  168. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_python_reviewer.py +0 -0
  169. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_qa_expert.py +0 -0
  170. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_qa_kitten.py +0 -0
  171. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_security_auditor.py +0 -0
  172. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  173. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/agents/json_agent.py +0 -0
  174. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/__init__.py +0 -0
  175. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/file_path_completion.py +0 -0
  176. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/__init__.py +0 -0
  177. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/mcp/utils.py +0 -0
  178. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/command_line/utils.py +0 -0
  179. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/__init__.py +0 -0
  180. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/async_lifecycle.py +0 -0
  181. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/circuit_breaker.py +0 -0
  182. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/error_isolation.py +0 -0
  183. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/examples/retry_example.py +0 -0
  184. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/health_monitor.py +0 -0
  185. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/manager.py +0 -0
  186. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/retry_manager.py +0 -0
  187. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/status_tracker.py +0 -0
  188. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/mcp_/system_tools.py +0 -0
  189. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  190. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  191. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  192. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  193. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  194. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  195. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  196. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/reopenable_async_client.py +0 -0
  197. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/__init__.py +0 -0
  198. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/browser/__init__.py +0 -0
  199. {code_puppy-0.0.237 → code_puppy-0.0.314}/code_puppy/tools/tools_content.py +0 -0
@@ -20,3 +20,7 @@ wheels/
20
20
  dummy_path
21
21
 
22
22
  .idea/
23
+
24
+ .DS_Store
25
+ .env
26
+ .serena/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.237
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.0.0
21
- Requires-Dist: fastapi>=0.110.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.5
27
+ Requires-Dist: pydantic-ai==1.25.0
31
28
  Requires-Dist: pydantic>=2.4.0
32
- Requires-Dist: pyjwt>=2.8.0
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: termcolor>=3.1.0
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
- # 🐶 Code Puppy 🐶
47
- ![Build Status](https://img.shields.io/badge/build-passing-brightgreen)
48
- ![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)
49
- <a href="https://github.com/mpfaffenberger/code_puppy"><img src="https://img.shields.io/pypi/pyversions/pydantic-ai.svg" alt="versions"></a>
50
- <a href="https://github.com/mpfaffenberger/code_puppy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/pydantic/pydantic-ai.svg?v" alt="license"></a>
40
+ <div align="center">
41
+
42
+ ![Code Puppy Logo](code_puppy.png)
43
+
44
+ **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
45
+
46
+ [![Version](https://img.shields.io/pypi/v/code-puppy?style=for-the-badge&logo=python&label=Version&color=purple)](https://pypi.org/project/code-puppy/)
47
+ [![Downloads](https://img.shields.io/badge/Downloads-100k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
48
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
49
+ [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
50
+ [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/actions)
51
+ [![Coverage](https://img.shields.io/badge/Coverage-95%25-brightgreen?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
52
+ [![Code Style](https://img.shields.io/badge/Code%20Style-Black-black?style=for-the-badge)](https://github.com/psf/black)
53
+ [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
54
+
55
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
56
+ [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
57
+ [![Anthropic](https://img.shields.io/badge/Anthropic-Claude-orange?style=flat-square&logo=anthropic)](https://anthropic.com)
58
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.6-red?style=flat-square)](https://cerebras.ai)
59
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.6-purple?style=flat-square)](https://z.ai/)
60
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2-green?style=flat-square)](https://synthetic.new)
61
+
62
+ [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
63
+ [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
64
+
65
+ [![100% privacy](https://img.shields.io/badge/FULL-Privacy%20commitment-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy/blob/main/README.md#code-puppy-privacy-commitment)
66
+
67
+ [![GitHub stars](https://img.shields.io/github/stars/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/stargazers)
68
+ [![GitHub forks](https://img.shields.io/github/forks/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](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
- ![Code Puppy](code_puppy.gif)
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
- export MODEL_NAME=gpt-5 # or gemini-2.5-flash-preview-05-20 as an example for Google Gemini models
160
- export OPENAI_API_KEY=<your_openai_api_key> # or GEMINI_API_KEY for Google Gemini models
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
- export AZURE_OPENAI_API_KEY=...
166
- export AZURE_OPENAI_ENDPOINT=...
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
- code-puppy --interactive
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
- ### Synthetic Provider
185
+ #### Supported Providers
172
186
 
173
- Code Puppy supports the **Synthetic provider**, which gives you access to various open-source models through a custom OpenAI-compatible endpoint. Set `SYN_API_KEY` to use models like:
187
+ Code Puppy integrates with https://models.dev giving you access to 65 providers and >1000 different model offerings.
174
188
 
175
- - `synthetic-DeepSeek-V3.1-Terminus` (128K context)
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 models are available via `https://api.synthetic.new/openai/v1/` and provide high-quality coding assistance with generous context windows.
191
+ These providers are automatically configured with correct OpenAI-compatible endpoints, but have **not** been tested thoroughly:
181
192
 
182
- Run specific tasks or engage in interactive mode:
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
- ```bash
185
- # Execute a task directly
186
- code-puppy "write me a C++ hello world program in /tmp/main.cpp then compile it and run it"
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
- **Happy Agent Building!** 🚀 Code Puppy now supports both Python and JSON agents, making it easy for anyone to create custom AI coding assistants! 🐶✨
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
- ## Conclusion
749
- By using Code Puppy, you can maintain code quality and adhere to design guidelines with ease.
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
- # 🐶 Code Puppy 🐶
2
- ![Build Status](https://img.shields.io/badge/build-passing-brightgreen)
3
- ![Coverage](https://img.shields.io/badge/coverage-95%25-brightgreen)
4
- <a href="https://github.com/mpfaffenberger/code_puppy"><img src="https://img.shields.io/pypi/pyversions/pydantic-ai.svg" alt="versions"></a>
5
- <a href="https://github.com/mpfaffenberger/code_puppy/blob/main/LICENSE"><img src="https://img.shields.io/github/license/pydantic/pydantic-ai.svg?v" alt="license"></a>
1
+ <div align="center">
2
+
3
+ ![Code Puppy Logo](code_puppy.png)
4
+
5
+ **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
6
+
7
+ [![Version](https://img.shields.io/pypi/v/code-puppy?style=for-the-badge&logo=python&label=Version&color=purple)](https://pypi.org/project/code-puppy/)
8
+ [![Downloads](https://img.shields.io/badge/Downloads-100k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
9
+ [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
10
+ [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
11
+ [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/actions)
12
+ [![Coverage](https://img.shields.io/badge/Coverage-95%25-brightgreen?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
13
+ [![Code Style](https://img.shields.io/badge/Code%20Style-Black-black?style=for-the-badge)](https://github.com/psf/black)
14
+ [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
15
+
16
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
17
+ [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
18
+ [![Anthropic](https://img.shields.io/badge/Anthropic-Claude-orange?style=flat-square&logo=anthropic)](https://anthropic.com)
19
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.6-red?style=flat-square)](https://cerebras.ai)
20
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.6-purple?style=flat-square)](https://z.ai/)
21
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2-green?style=flat-square)](https://synthetic.new)
22
+
23
+ [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
24
+ [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
25
+
26
+ [![100% privacy](https://img.shields.io/badge/FULL-Privacy%20commitment-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy/blob/main/README.md#code-puppy-privacy-commitment)
27
+
28
+ [![GitHub stars](https://img.shields.io/github/stars/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/stargazers)
29
+ [![GitHub forks](https://img.shields.io/github/forks/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](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
- ![Code Puppy](code_puppy.gif)
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
- export MODEL_NAME=gpt-5 # or gemini-2.5-flash-preview-05-20 as an example for Google Gemini models
115
- export OPENAI_API_KEY=<your_openai_api_key> # or GEMINI_API_KEY for Google Gemini models
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
- export AZURE_OPENAI_API_KEY=...
121
- export AZURE_OPENAI_ENDPOINT=...
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
- code-puppy --interactive
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
- ### Synthetic Provider
146
+ #### Supported Providers
127
147
 
128
- Code Puppy supports the **Synthetic provider**, which gives you access to various open-source models through a custom OpenAI-compatible endpoint. Set `SYN_API_KEY` to use models like:
148
+ Code Puppy integrates with https://models.dev giving you access to 65 providers and >1000 different model offerings.
129
149
 
130
- - `synthetic-DeepSeek-V3.1-Terminus` (128K context)
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 models are available via `https://api.synthetic.new/openai/v1/` and provide high-quality coding assistance with generous context windows.
152
+ These providers are automatically configured with correct OpenAI-compatible endpoints, but have **not** been tested thoroughly:
136
153
 
137
- Run specific tasks or engage in interactive mode:
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
- ```bash
140
- # Execute a task directly
141
- code-puppy "write me a C++ hello world program in /tmp/main.cpp then compile it and run it"
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
- **Happy Agent Building!** 🚀 Code Puppy now supports both Python and JSON agents, making it easy for anyone to create custom AI coding assistants! 🐶✨
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
- ## Conclusion
704
- By using Code Puppy, you can maintain code quality and adhere to design guidelines with ease.
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
- invoke_agent(agent_name="python-tutor", user_prompt="Explain how to use list comprehensions")
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 CONFIG_DIR
31
+ from ..config import STATE_DIR
32
32
 
33
- return Path(CONFIG_DIR) / "terminal_sessions.json"
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, defaults to 'code-puppy'.
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
- return _SESSION_AGENTS_CACHE.get(session_id, "code-puppy")
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: