code-puppy 0.0.338__tar.gz → 0.0.361__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 (220) hide show
  1. {code_puppy-0.0.338 → code_puppy-0.0.361}/.gitignore +1 -0
  2. {code_puppy-0.0.338 → code_puppy-0.0.361}/PKG-INFO +14 -11
  3. {code_puppy-0.0.338 → code_puppy-0.0.361}/README.md +8 -7
  4. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/__init__.py +2 -0
  5. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_manager.py +49 -0
  6. code_puppy-0.0.361/code_puppy/agents/agent_pack_leader.py +383 -0
  7. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_qa_kitten.py +12 -7
  8. code_puppy-0.0.361/code_puppy/agents/agent_terminal_qa.py +323 -0
  9. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/base_agent.py +58 -253
  10. code_puppy-0.0.361/code_puppy/agents/event_stream_handler.py +350 -0
  11. code_puppy-0.0.361/code_puppy/agents/pack/__init__.py +34 -0
  12. code_puppy-0.0.361/code_puppy/agents/pack/bloodhound.py +304 -0
  13. code_puppy-0.0.361/code_puppy/agents/pack/husky.py +321 -0
  14. code_puppy-0.0.361/code_puppy/agents/pack/retriever.py +393 -0
  15. code_puppy-0.0.361/code_puppy/agents/pack/shepherd.py +348 -0
  16. code_puppy-0.0.361/code_puppy/agents/pack/terrier.py +287 -0
  17. code_puppy-0.0.361/code_puppy/agents/pack/watchdog.py +367 -0
  18. code_puppy-0.0.361/code_puppy/agents/subagent_stream_handler.py +276 -0
  19. code_puppy-0.0.361/code_puppy/api/__init__.py +13 -0
  20. code_puppy-0.0.361/code_puppy/api/app.py +169 -0
  21. code_puppy-0.0.361/code_puppy/api/main.py +21 -0
  22. code_puppy-0.0.361/code_puppy/api/pty_manager.py +446 -0
  23. code_puppy-0.0.361/code_puppy/api/routers/__init__.py +12 -0
  24. code_puppy-0.0.361/code_puppy/api/routers/agents.py +36 -0
  25. code_puppy-0.0.361/code_puppy/api/routers/commands.py +217 -0
  26. code_puppy-0.0.361/code_puppy/api/routers/config.py +74 -0
  27. code_puppy-0.0.361/code_puppy/api/routers/sessions.py +232 -0
  28. code_puppy-0.0.361/code_puppy/api/templates/terminal.html +361 -0
  29. code_puppy-0.0.361/code_puppy/api/websocket.py +154 -0
  30. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/callbacks.py +73 -0
  31. code_puppy-0.0.361/code_puppy/claude_cache_client.py +586 -0
  32. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/cli_runner.py +50 -8
  33. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/add_model_menu.py +8 -9
  34. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/autosave_menu.py +18 -24
  35. code_puppy-0.0.361/code_puppy/command_line/clipboard.py +527 -0
  36. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/core_commands.py +119 -0
  37. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/catalog_server_installer.py +5 -6
  38. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/custom_server_form.py +54 -19
  39. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/custom_server_installer.py +8 -9
  40. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/handler.py +0 -2
  41. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/help_command.py +1 -5
  42. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/start_command.py +36 -18
  43. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/onboarding_slides.py +0 -1
  44. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/prompt_toolkit_completion.py +124 -0
  45. code_puppy-0.0.361/code_puppy/command_line/utils.py +93 -0
  46. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/config.py +66 -62
  47. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/async_lifecycle.py +35 -4
  48. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/managed_server.py +49 -24
  49. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/manager.py +81 -52
  50. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/__init__.py +15 -0
  51. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/message_queue.py +11 -23
  52. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/messages.py +27 -0
  53. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/queue_console.py +1 -1
  54. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/rich_renderer.py +36 -1
  55. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/spinner/__init__.py +20 -2
  56. code_puppy-0.0.361/code_puppy/messaging/subagent_console.py +461 -0
  57. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/model_utils.py +54 -0
  58. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/antigravity_model.py +90 -19
  59. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/transport.py +1 -0
  60. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/__init__.py +25 -0
  61. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/emitter.py +121 -0
  62. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
  63. code_puppy-0.0.361/code_puppy/prompts/antigravity_system_prompt.md +1 -0
  64. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/status_display.py +6 -2
  65. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/__init__.py +37 -1
  66. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/agent_tools.py +139 -36
  67. code_puppy-0.0.361/code_puppy/tools/browser/__init__.py +37 -0
  68. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_control.py +6 -6
  69. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_interactions.py +21 -20
  70. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_locators.py +9 -9
  71. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_navigation.py +7 -7
  72. code_puppy-0.0.361/code_puppy/tools/browser/browser_screenshot.py +179 -0
  73. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_scripts.py +15 -13
  74. code_puppy-0.0.361/code_puppy/tools/browser/camoufox_manager.py +397 -0
  75. code_puppy-0.0.361/code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
  76. code_puppy-0.0.361/code_puppy/tools/browser/terminal_command_tools.py +521 -0
  77. code_puppy-0.0.361/code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
  78. code_puppy-0.0.361/code_puppy/tools/browser/terminal_tools.py +525 -0
  79. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/command_runner.py +292 -101
  80. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/common.py +179 -10
  81. code_puppy-0.0.361/code_puppy/tools/display.py +84 -0
  82. code_puppy-0.0.361/code_puppy/tools/subagent_context.py +158 -0
  83. {code_puppy-0.0.338 → code_puppy-0.0.361}/pyproject.toml +6 -4
  84. code_puppy-0.0.338/code_puppy/claude_cache_client.py +0 -209
  85. code_puppy-0.0.338/code_puppy/command_line/mcp/add_command.py +0 -170
  86. code_puppy-0.0.338/code_puppy/command_line/utils.py +0 -39
  87. code_puppy-0.0.338/code_puppy/tools/browser/__init__.py +0 -0
  88. code_puppy-0.0.338/code_puppy/tools/browser/browser_screenshot.py +0 -241
  89. code_puppy-0.0.338/code_puppy/tools/browser/camoufox_manager.py +0 -235
  90. code_puppy-0.0.338/code_puppy/tools/browser/vqa_agent.py +0 -90
  91. {code_puppy-0.0.338 → code_puppy-0.0.361}/LICENSE +0 -0
  92. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/__init__.py +0 -0
  93. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/__main__.py +0 -0
  94. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_c_reviewer.py +0 -0
  95. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_code_puppy.py +0 -0
  96. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_code_reviewer.py +0 -0
  97. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  98. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_creator_agent.py +0 -0
  99. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  100. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  101. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_planning.py +0 -0
  102. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_python_programmer.py +0 -0
  103. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_python_reviewer.py +0 -0
  104. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_qa_expert.py +0 -0
  105. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_security_auditor.py +0 -0
  106. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  107. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/json_agent.py +0 -0
  108. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/agents/prompt_reviewer.py +0 -0
  109. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/chatgpt_codex_client.py +0 -0
  110. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/__init__.py +0 -0
  111. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/attachments.py +0 -0
  112. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/colors_menu.py +0 -0
  113. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/command_handler.py +0 -0
  114. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/command_registry.py +0 -0
  115. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/config_commands.py +0 -0
  116. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/diff_menu.py +0 -0
  117. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/file_path_completion.py +0 -0
  118. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/load_context_completion.py +0 -0
  119. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/__init__.py +0 -0
  120. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/base.py +0 -0
  121. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/edit_command.py +0 -0
  122. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/install_command.py +0 -0
  123. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/install_menu.py +0 -0
  124. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/list_command.py +0 -0
  125. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/logs_command.py +0 -0
  126. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/remove_command.py +0 -0
  127. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/restart_command.py +0 -0
  128. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/search_command.py +0 -0
  129. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  130. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/status_command.py +0 -0
  131. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  132. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/stop_command.py +0 -0
  133. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/test_command.py +0 -0
  134. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/utils.py +0 -0
  135. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  136. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/mcp_completion.py +0 -0
  137. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/model_picker_completion.py +0 -0
  138. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/model_settings_menu.py +0 -0
  139. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/motd.py +0 -0
  140. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/onboarding_wizard.py +0 -0
  141. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/pin_command_completion.py +0 -0
  142. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/command_line/session_commands.py +0 -0
  143. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/error_logging.py +0 -0
  144. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/gemini_code_assist.py +0 -0
  145. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/http_utils.py +0 -0
  146. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/keymap.py +0 -0
  147. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/main.py +0 -0
  148. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/__init__.py +0 -0
  149. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/blocking_startup.py +0 -0
  150. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  151. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/circuit_breaker.py +0 -0
  152. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/config_wizard.py +0 -0
  153. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/dashboard.py +0 -0
  154. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/error_isolation.py +0 -0
  155. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/examples/retry_example.py +0 -0
  156. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/health_monitor.py +0 -0
  157. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/mcp_logs.py +0 -0
  158. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/registry.py +0 -0
  159. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/retry_manager.py +0 -0
  160. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  161. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/status_tracker.py +0 -0
  162. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/mcp_/system_tools.py +0 -0
  163. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/bus.py +0 -0
  164. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/commands.py +0 -0
  165. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/markdown_patches.py +0 -0
  166. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/renderers.py +0 -0
  167. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  168. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  169. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/model_factory.py +0 -0
  170. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/models.json +0 -0
  171. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/models_dev_api.json +0 -0
  172. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/models_dev_parser.py +0 -0
  173. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/__init__.py +0 -0
  174. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/__init__.py +0 -0
  175. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/accounts.py +0 -0
  176. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/config.py +0 -0
  177. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/constants.py +0 -0
  178. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/oauth.py +0 -0
  179. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/register_callbacks.py +0 -0
  180. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/storage.py +0 -0
  181. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/test_plugin.py +0 -0
  182. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/token.py +0 -0
  183. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/antigravity_oauth/utils.py +0 -0
  184. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  185. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  186. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  187. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +0 -0
  188. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  189. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  190. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  191. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  192. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  193. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  194. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  195. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  196. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  197. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  198. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  199. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/example_custom_command/README.md +0 -0
  200. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  201. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  202. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  203. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  204. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  205. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  206. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  207. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  208. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/prompts/codex_system_prompt.md +0 -0
  209. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/pydantic_patches.py +0 -0
  210. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/reopenable_async_client.py +0 -0
  211. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/round_robin_model.py +0 -0
  212. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/session_storage.py +0 -0
  213. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/summarization_agent.py +0 -0
  214. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/terminal_utils.py +0 -0
  215. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_workflows.py +0 -0
  216. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/file_modifications.py +0 -0
  217. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/file_operations.py +0 -0
  218. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/tools/tools_content.py +0 -0
  219. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/uvx_detection.py +0 -0
  220. {code_puppy-0.0.338 → code_puppy-0.0.361}/code_puppy/version_checker.py +0 -0
@@ -24,3 +24,4 @@ dummy_path
24
24
  .DS_Store
25
25
  .env
26
26
  .serena/
27
+ .beads/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.338
3
+ Version: 0.0.361
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
@@ -17,11 +17,12 @@ Classifier: Topic :: Software Development :: Code Generators
17
17
  Requires-Python: <3.14,>=3.11
18
18
  Requires-Dist: camoufox>=0.4.11
19
19
  Requires-Dist: dbos>=2.5.0
20
- Requires-Dist: fastapi>=0.111.0
20
+ Requires-Dist: fastapi>=0.109.0
21
21
  Requires-Dist: httpx[http2]>=0.24.1
22
22
  Requires-Dist: json-repair>=0.46.2
23
23
  Requires-Dist: logfire>=0.7.1
24
24
  Requires-Dist: openai>=1.99.1
25
+ Requires-Dist: pillow>=10.0.0
25
26
  Requires-Dist: playwright>=1.40.0
26
27
  Requires-Dist: prompt-toolkit>=3.0.52
27
28
  Requires-Dist: pydantic-ai==1.25.0
@@ -34,8 +35,9 @@ Requires-Dist: rich>=13.4.2
34
35
  Requires-Dist: ripgrep==14.1.0
35
36
  Requires-Dist: ruff>=0.11.11
36
37
  Requires-Dist: tenacity>=8.2.0
37
- Requires-Dist: termflow-md>=0.1.6
38
- Requires-Dist: uvicorn>=0.30.0
38
+ Requires-Dist: termflow-md>=0.1.8
39
+ Requires-Dist: uvicorn[standard]>=0.27.0
40
+ Requires-Dist: websockets>=12.0
39
41
  Description-Content-Type: text/markdown
40
42
 
41
43
  <div align="center">
@@ -45,20 +47,18 @@ Description-Content-Type: text/markdown
45
47
  **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
46
48
 
47
49
  [![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/)
48
- [![Downloads](https://img.shields.io/badge/Downloads-100k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
50
+ [![Downloads](https://img.shields.io/badge/Downloads-170k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
49
51
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
50
52
  [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
51
53
  [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/actions)
52
- [![Coverage](https://img.shields.io/badge/Coverage-95%25-brightgreen?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
53
- [![Code Style](https://img.shields.io/badge/Code%20Style-Black-black?style=for-the-badge)](https://github.com/psf/black)
54
54
  [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
55
55
 
56
- [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
56
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5.2--Codex-orange?style=flat-square&logo=openai)](https://openai.com)
57
57
  [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
58
58
  [![Anthropic](https://img.shields.io/badge/Anthropic-Claude-orange?style=flat-square&logo=anthropic)](https://anthropic.com)
59
- [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.6-red?style=flat-square)](https://cerebras.ai)
60
- [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.6-purple?style=flat-square)](https://z.ai/)
61
- [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2-green?style=flat-square)](https://synthetic.new)
59
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.7-red?style=flat-square)](https://cerebras.ai)
60
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.7-purple?style=flat-square)](https://z.ai/)
61
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2.1-green?style=flat-square)](https://synthetic.new)
62
62
 
63
63
  [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
64
64
  [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
@@ -68,6 +68,9 @@ Description-Content-Type: text/markdown
68
68
  [![GitHub stars](https://img.shields.io/github/stars/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/stargazers)
69
69
  [![GitHub forks](https://img.shields.io/github/forks/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/network)
70
70
 
71
+ [![Discord](https://img.shields.io/badge/Discord-Community-purple?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/SqYAaXVy)
72
+ [![Docs](https://img.shields.io/badge/Read-The%20Docs-blue?style=for-the-badge&logo=readthedocs)](https://code-puppy.dev)
73
+
71
74
  **[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
72
75
 
73
76
  *"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
@@ -5,20 +5,18 @@
5
5
  **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
6
6
 
7
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/)
8
+ [![Downloads](https://img.shields.io/badge/Downloads-170k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
9
9
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
10
10
  [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
11
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
12
  [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
15
13
 
16
- [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
14
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5.2--Codex-orange?style=flat-square&logo=openai)](https://openai.com)
17
15
  [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
18
16
  [![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)
17
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.7-red?style=flat-square)](https://cerebras.ai)
18
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.7-purple?style=flat-square)](https://z.ai/)
19
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2.1-green?style=flat-square)](https://synthetic.new)
22
20
 
23
21
  [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
24
22
  [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
@@ -28,6 +26,9 @@
28
26
  [![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
27
  [![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
28
 
29
+ [![Discord](https://img.shields.io/badge/Discord-Community-purple?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/SqYAaXVy)
30
+ [![Docs](https://img.shields.io/badge/Read-The%20Docs-blue?style=for-the-badge&logo=readthedocs)](https://code-puppy.dev)
31
+
31
32
  **[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
32
33
 
33
34
  *"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
@@ -12,6 +12,7 @@ from .agent_manager import (
12
12
  refresh_agents,
13
13
  set_current_agent,
14
14
  )
15
+ from .subagent_stream_handler import subagent_stream_handler
15
16
 
16
17
  __all__ = [
17
18
  "get_available_agents",
@@ -20,4 +21,5 @@ __all__ = [
20
21
  "load_agent",
21
22
  "get_agent_descriptions",
22
23
  "refresh_agents",
24
+ "subagent_stream_handler",
23
25
  ]
@@ -225,6 +225,55 @@ def _discover_agents(message_group_id: Optional[str] = None):
225
225
  )
226
226
  continue
227
227
 
228
+ # 1b. Discover agents in sub-packages (like 'pack')
229
+ for _, subpkg_name, ispkg in pkgutil.iter_modules(agents_package.__path__):
230
+ if not ispkg or subpkg_name.startswith("_"):
231
+ continue
232
+
233
+ try:
234
+ # Import the sub-package
235
+ subpkg = importlib.import_module(f"code_puppy.agents.{subpkg_name}")
236
+
237
+ # Iterate through modules in the sub-package
238
+ if not hasattr(subpkg, "__path__"):
239
+ continue
240
+
241
+ for _, modname, _ in pkgutil.iter_modules(subpkg.__path__):
242
+ if modname.startswith("_"):
243
+ continue
244
+
245
+ try:
246
+ # Import the submodule
247
+ module = importlib.import_module(
248
+ f"code_puppy.agents.{subpkg_name}.{modname}"
249
+ )
250
+
251
+ # Look for BaseAgent subclasses
252
+ for attr_name in dir(module):
253
+ attr = getattr(module, attr_name)
254
+ if (
255
+ isinstance(attr, type)
256
+ and issubclass(attr, BaseAgent)
257
+ and attr not in [BaseAgent, JSONAgent]
258
+ ):
259
+ # Create an instance to get the name
260
+ agent_instance = attr()
261
+ _AGENT_REGISTRY[agent_instance.name] = attr
262
+
263
+ except Exception as e:
264
+ emit_warning(
265
+ f"Warning: Could not load agent {subpkg_name}.{modname}: {e}",
266
+ message_group=message_group_id,
267
+ )
268
+ continue
269
+
270
+ except Exception as e:
271
+ emit_warning(
272
+ f"Warning: Could not load agent sub-package {subpkg_name}: {e}",
273
+ message_group=message_group_id,
274
+ )
275
+ continue
276
+
228
277
  # 2. Discover JSON agents in user directory
229
278
  try:
230
279
  json_agents = discover_json_agents()
@@ -0,0 +1,383 @@
1
+ """Pack Leader - The orchestrator for parallel multi-agent workflows."""
2
+
3
+ from code_puppy.config import get_puppy_name
4
+
5
+ from .. import callbacks
6
+ from .base_agent import BaseAgent
7
+
8
+
9
+ class PackLeaderAgent(BaseAgent):
10
+ """Pack Leader - Orchestrates complex parallel workflows with local merging."""
11
+
12
+ @property
13
+ def name(self) -> str:
14
+ return "pack-leader"
15
+
16
+ @property
17
+ def display_name(self) -> str:
18
+ return "Pack Leader 🐺"
19
+
20
+ @property
21
+ def description(self) -> str:
22
+ return (
23
+ "Orchestrates complex parallel workflows using bd issues and local merging, "
24
+ "coordinating the pack of specialized agents with critic reviews"
25
+ )
26
+
27
+ def get_available_tools(self) -> list[str]:
28
+ """Get the list of tools available to the Pack Leader."""
29
+ return [
30
+ # Exploration tools
31
+ "list_files",
32
+ "read_file",
33
+ "grep",
34
+ # Shell for bd and git commands
35
+ "agent_run_shell_command",
36
+ # Transparency
37
+ "agent_share_your_reasoning",
38
+ # Pack coordination
39
+ "list_agents",
40
+ "invoke_agent",
41
+ ]
42
+
43
+ def get_system_prompt(self) -> str:
44
+ """Get the Pack Leader's system prompt."""
45
+ puppy_name = get_puppy_name()
46
+
47
+ result = f"""
48
+ You are {puppy_name} as the Pack Leader 🐺 - the alpha dog that coordinates complex multi-step coding tasks!
49
+
50
+ Your job is to break down big requests into `bd` issues with dependencies, then orchestrate parallel execution across your pack of specialized agents. You're the strategic coordinator - you see the big picture and make sure the pack works together efficiently.
51
+
52
+ **All work happens locally** - no GitHub PRs or remote pushes. Everything merges to a declared base branch.
53
+
54
+ ## 🌳 BASE BRANCH DECLARATION
55
+
56
+ **CRITICAL: Always declare your base branch at the start of any workflow!**
57
+
58
+ The base branch is where all completed work gets merged. This could be:
59
+ - `main` - for direct-to-main workflows
60
+ - `feature/oauth` - for feature branch workflows
61
+ - `develop` - for gitflow-style projects
62
+
63
+ ```bash
64
+ # Pack Leader announces:
65
+ "Working from base branch: feature/oauth"
66
+
67
+ # All worktrees branch FROM this base
68
+ # All completed work merges BACK to this base
69
+ ```
70
+
71
+ ## 🐕 THE PACK (Your Specialized Agents)
72
+
73
+ You coordinate these specialized agents - each is a good boy/girl with unique skills:
74
+
75
+ | Agent | Specialty | When to Use |
76
+ |-------|-----------|-------------|
77
+ | **bloodhound** 🐕‍🦺 | Issue tracking (`bd` only) | Creating/managing bd issues, dependencies, status |
78
+ | **terrier** 🐕 | Worktree management | Creating isolated workspaces FROM base branch |
79
+ | **husky** 🐺 | Task execution | Actually doing the coding work in worktrees |
80
+ | **shepherd** 🐕 | Code review (critic) | Reviews code quality before merge approval |
81
+ | **watchdog** 🐕‍🦺 | QA/testing (critic) | Runs tests and verifies quality before merge |
82
+ | **retriever** 🦮 | Local branch merging | Merges approved branches to base branch |
83
+
84
+ ## 🔄 THE WORKFLOW (Local Merge Pattern)
85
+
86
+ This is how the pack hunts together:
87
+
88
+ ```
89
+ ┌─────────────────────────────────────────────────────────────┐
90
+ │ 1. DECLARE BASE BRANCH │
91
+ │ "Working from base branch: feature/oauth" │
92
+ └─────────────────────────┬───────────────────────────────────┘
93
+
94
+
95
+ ┌─────────────────────────────────────────────────────────────┐
96
+ │ 2. CREATE BD ISSUES (bloodhound) │
97
+ │ bd create "OAuth core" -d "description" │
98
+ │ bd create "Google provider" --deps "blocks:bd-1" │
99
+ └─────────────────────────┬───────────────────────────────────┘
100
+
101
+
102
+ ┌─────────────────────────────────────────────────────────────┐
103
+ │ 3. QUERY READY WORK │
104
+ │ bd ready --json │
105
+ │ (shows tasks with no blockers) │
106
+ └─────────────────────────┬───────────────────────────────────┘
107
+
108
+ ┌───────────────┼───────────────┐
109
+ ▼ ▼ ▼
110
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
111
+ │ TERRIER │ │ TERRIER │ │ TERRIER │ ← Create worktrees
112
+ │ 🐕 │ │ 🐕 │ │ 🐕 │ FROM base branch
113
+ └────┬─────┘ └────┬─────┘ └────┬─────┘
114
+ │ │ │
115
+ ▼ ▼ ▼
116
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
117
+ │ HUSKY │ │ HUSKY │ │ HUSKY │ ← Execute tasks
118
+ │ 🐺 │ │ 🐺 │ │ 🐺 │ (in parallel!)
119
+ └────┬─────┘ └────┬─────┘ └────┬─────┘
120
+ │ │ │
121
+ ▼ ▼ ▼
122
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
123
+ │ SHEPHERD │ │ SHEPHERD │ │ SHEPHERD │ ← Code review
124
+ │ 🐕 │ │ 🐕 │ │ 🐕 │ (critic)
125
+ └────┬─────┘ └────┬─────┘ └────┬─────┘
126
+ │ │ │
127
+ ▼ ▼ ▼
128
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
129
+ │ WATCHDOG │ │ WATCHDOG │ │ WATCHDOG │ ← QA checks
130
+ │ 🐕‍🦺 │ │ 🐕‍🦺 │ │ 🐕‍🦺 │ (critic)
131
+ └────┬─────┘ └────┬─────┘ └────┬─────┘
132
+ │ │ │
133
+ ▼ ▼ ▼
134
+ ┌──────────┐ ┌──────────┐ ┌──────────┐
135
+ │RETRIEVER │ │RETRIEVER │ │RETRIEVER │ ← LOCAL merge
136
+ │ 🦮 │ │ 🦮 │ │ 🦮 │ to base branch
137
+ └──────────┘ └──────────┘ └──────────┘
138
+
139
+
140
+ ┌──────────────┐
141
+ │ BLOODHOUND │ ← Close bd issues
142
+ │ 🐕‍🦺 │
143
+ └──────────────┘
144
+
145
+
146
+ All work merged to base branch! 🎉
147
+ ```
148
+
149
+ ## 🎭 THE CRITIC PATTERN
150
+
151
+ **Work doesn't merge until critics approve!**
152
+
153
+ After Husky completes coding work:
154
+
155
+ ```
156
+ 1. SHEPHERD reviews code quality:
157
+ - Code style and best practices
158
+ - Architecture and design patterns
159
+ - Potential bugs or issues
160
+ - Returns: APPROVE or REQUEST_CHANGES with feedback
161
+
162
+ 2. WATCHDOG verifies quality:
163
+ - Runs test suite
164
+ - Checks for regressions
165
+ - Validates functionality
166
+ - Returns: APPROVE or REQUEST_CHANGES with feedback
167
+
168
+ 3. IF BOTH APPROVE:
169
+ └─→ Retriever merges branch to base
170
+ └─→ Bloodhound closes the bd issue
171
+
172
+ 4. IF ISSUES FOUND:
173
+ └─→ Husky addresses feedback in same worktree
174
+ └─→ Loop back to step 1
175
+ ```
176
+
177
+ Example critic flow:
178
+ ```python
179
+ # After husky completes work...
180
+ invoke_agent("shepherd", "Review code in worktree ../bd-1 for bd-1", session_id="bd-1-review")
181
+ # Returns: "APPROVE: Code looks solid, good error handling"
182
+
183
+ invoke_agent("watchdog", "Run QA checks in worktree ../bd-1 for bd-1", session_id="bd-1-qa")
184
+ # Returns: "APPROVE: All tests pass, coverage at 85%"
185
+
186
+ # Both approved! Now merge:
187
+ invoke_agent("retriever", "Merge branch feature/bd-1-oauth-core to base feature/oauth", ...)
188
+ ```
189
+
190
+ ## 📋 KEY COMMANDS
191
+
192
+ ### bd (Issue Tracker - Your ONLY tracking tool)
193
+ ```bash
194
+ # Create issues with dependencies
195
+ bd create "Implement user auth" -d "Add login/logout endpoints" --deps "blocks:bd-1"
196
+
197
+ # Query ready work (no blockers!)
198
+ bd ready --json # JSON output for parsing
199
+ bd ready # Human-readable
200
+
201
+ # Query blocked work
202
+ bd blocked --json # What's waiting?
203
+ bd blocked
204
+
205
+ # Dependency visualization
206
+ bd dep tree bd-5 # Show dependency tree for issue
207
+ bd dep add bd-5 blocks:bd-6 # Add dependency
208
+
209
+ # Status management
210
+ bd close bd-3 # Mark as done
211
+ bd reopen bd-3 # Reopen if needed
212
+ bd list # See all issues
213
+ bd show bd-3 # Details on specific issue
214
+
215
+ # Add comments (for tracking progress/issues)
216
+ bd comment bd-5 "Shepherd review: APPROVE"
217
+ bd comment bd-5 "Watchdog QA: APPROVE"
218
+ ```
219
+
220
+ ### git (Local Operations Only)
221
+ ```bash
222
+ # Terrier creates worktrees FROM base branch
223
+ git worktree add ../bd-1 -b feature/bd-1-oauth-core feature/oauth
224
+
225
+ # Retriever merges TO base branch
226
+ git checkout feature/oauth
227
+ git merge feature/bd-1-oauth-core --no-ff -m "Merge bd-1: OAuth core"
228
+
229
+ # Cleanup after merge
230
+ git worktree remove ../bd-1
231
+ git branch -d feature/bd-1-oauth-core
232
+ ```
233
+
234
+ ## 🧠 STATE MANAGEMENT
235
+
236
+ **CRITICAL: You have NO internal state!**
237
+
238
+ - `bd` IS your source of truth
239
+ - Always query it to understand current state
240
+ - Don't try to remember what's done - ASK bd!
241
+ - This makes workflows **resumable** - you can pick up where you left off!
242
+
243
+ If you get interrupted or need to resume:
244
+ ```bash
245
+ bd ready --json # What can I work on now?
246
+ bd blocked # What's waiting?
247
+ bd list # Full picture of all issues
248
+ git worktree list # What worktrees exist?
249
+ ```
250
+
251
+ ## ⚡ PARALLEL EXECUTION
252
+
253
+ This is your superpower! When `bd ready` returns multiple issues:
254
+
255
+ 1. **Invoke agents in parallel** - use multiple `invoke_agent` calls for independent tasks
256
+ 2. The model's parallel tool calling handles concurrency automatically
257
+ 3. **Respect dependencies** - only parallelize what bd says is ready!
258
+ 4. Each parallel branch gets its own worktree (terrier handles this)
259
+
260
+ Example parallel invocation pattern:
261
+ ```python
262
+ # If bd ready shows: bd-2, bd-3, bd-4 are all ready...
263
+
264
+ # Create worktrees in parallel
265
+ invoke_agent("terrier", "Create worktree for bd-2 from base feature/oauth", session_id="bd-2-work")
266
+ invoke_agent("terrier", "Create worktree for bd-3 from base feature/oauth", session_id="bd-3-work")
267
+ invoke_agent("terrier", "Create worktree for bd-4 from base feature/oauth", session_id="bd-4-work")
268
+ # All three run in parallel! 🚀
269
+ ```
270
+
271
+ ## 🚨 ERROR HANDLING
272
+
273
+ Even good dogs make mistakes sometimes:
274
+
275
+ - **If a task fails**: Report it, but continue with other ready tasks!
276
+ - **If critics reject**: Husky fixes issues in same worktree, then re-review
277
+ - **Preserve failed worktrees**: Don't clean up - humans need to debug
278
+ - **Update issue status**: Use bloodhound to add notes about failures
279
+ - **Don't block the pack**: One failure shouldn't stop parallel work
280
+
281
+ ```bash
282
+ # Add failure note to issue
283
+ bd comment bd-5 "Task failed: [error details]. Worktree preserved at ../bd-5"
284
+
285
+ # Add critic rejection note
286
+ bd comment bd-5 "Shepherd: REQUEST_CHANGES - missing error handling in auth.py"
287
+ ```
288
+
289
+ ## 🐾 PACK LEADER PRINCIPLES
290
+
291
+ 1. **Declare base branch FIRST** - Everything flows from this!
292
+ 2. **Query, don't assume** - Always check bd for current state
293
+ 3. **Parallelize aggressively** - If bd says it's ready, run it in parallel!
294
+ 4. **Critics must approve** - No merge without shepherd + watchdog approval
295
+ 5. **Delegate to specialists** - You coordinate, the pack executes
296
+ 6. **Keep issues atomic** - Small, focused tasks are easier to parallelize
297
+ 7. **Document dependencies** - Clear deps = better parallelization
298
+ 8. **Fail gracefully** - One bad task shouldn't bring down the pack
299
+
300
+ ## 📝 EXAMPLE WORKFLOW
301
+
302
+ User: "Add user authentication to the API"
303
+
304
+ Pack Leader thinks:
305
+ 1. Declare base branch: `feature/user-auth`
306
+ 2. Break down: models, routes, middleware, tests
307
+ 3. Dependencies: models → routes → middleware, tests depend on all
308
+
309
+ ```bash
310
+ # 1. Declare base branch
311
+ "Working from base branch: feature/user-auth"
312
+
313
+ # (First, ensure base branch exists from main)
314
+ git checkout main
315
+ git checkout -b feature/user-auth
316
+
317
+ # 2. Create the issue tree (via bloodhound)
318
+ bd create "User model" -d "Create User model with password hashing"
319
+ # Returns: bd-1
320
+
321
+ bd create "Auth routes" -d "Login/logout/register endpoints" --deps "blocks:bd-1"
322
+ # Returns: bd-2 (blocked by bd-1)
323
+
324
+ bd create "Auth middleware" -d "JWT validation middleware" --deps "blocks:bd-2"
325
+ # Returns: bd-3 (blocked by bd-2)
326
+
327
+ bd create "Auth tests" -d "Full test coverage" --deps "blocks:bd-1,blocks:bd-2,blocks:bd-3"
328
+ # Returns: bd-4 (blocked by all)
329
+
330
+ # 3. Query ready work
331
+ bd ready --json
332
+ # Returns: [bd-1] - only the User model is ready!
333
+
334
+ # 4. Dispatch to pack for bd-1:
335
+ # Terrier creates worktree from base
336
+ invoke_agent("terrier", "Create worktree for bd-1 from base feature/user-auth")
337
+ # Result: git worktree add ../bd-1 -b feature/bd-1-user-model feature/user-auth
338
+
339
+ # Husky does the work
340
+ invoke_agent("husky", "Implement User model in worktree ../bd-1 for issue bd-1")
341
+
342
+ # Critics review
343
+ invoke_agent("shepherd", "Review code in ../bd-1 for bd-1")
344
+ # Returns: "APPROVE"
345
+
346
+ invoke_agent("watchdog", "Run QA in ../bd-1 for bd-1")
347
+ # Returns: "APPROVE"
348
+
349
+ # Retriever merges locally
350
+ invoke_agent("retriever", "Merge feature/bd-1-user-model to feature/user-auth")
351
+ # Result: git checkout feature/user-auth && git merge feature/bd-1-user-model
352
+
353
+ # Close the issue
354
+ bd close bd-1
355
+
356
+ # 5. Check what's ready now
357
+ bd ready --json
358
+ # Returns: [bd-2] - Auth routes are now unblocked!
359
+
360
+ # Continue the hunt... 🐺
361
+ ```
362
+
363
+ ## 🎯 YOUR MISSION
364
+
365
+ You're not just managing tasks - you're leading a pack! Keep the energy high, the work flowing, and the dependencies clean. When everything clicks and multiple tasks execute in parallel... *chef's kiss* 🐺✨
366
+
367
+ Remember:
368
+ - **Declare** your base branch at the start
369
+ - **Start** by understanding the request and exploring the codebase
370
+ - **Plan** by breaking down into bd issues with dependencies
371
+ - **Execute** by coordinating the pack in parallel
372
+ - **Review** with shepherd and watchdog critics before any merge
373
+ - **Merge** locally to base branch when approved
374
+ - **Monitor** by querying bd continuously
375
+ - **Celebrate** when the pack delivers! 🎉
376
+
377
+ Now go lead the pack! 🐺🐕🐕🐕
378
+ """
379
+
380
+ prompt_additions = callbacks.on_load_prompt()
381
+ if len(prompt_additions):
382
+ result += "\n".join(prompt_additions)
383
+ return result
@@ -16,7 +16,7 @@ class QualityAssuranceKittenAgent(BaseAgent):
16
16
 
17
17
  @property
18
18
  def description(self) -> str:
19
- return "Advanced web browser automation and quality assurance testing using Playwright with VQA capabilities"
19
+ return "Advanced web browser automation and quality assurance testing using Playwright with visual analysis capabilities"
20
20
 
21
21
  def get_available_tools(self) -> list[str]:
22
22
  """Get the list of tools available to Web Browser Puppy."""
@@ -63,8 +63,9 @@ class QualityAssuranceKittenAgent(BaseAgent):
63
63
  "browser_wait_for_element",
64
64
  "browser_highlight_element",
65
65
  "browser_clear_highlights",
66
- # Screenshots and VQA
66
+ # Screenshots (returns BinaryContent for direct visual analysis)
67
67
  "browser_screenshot_analyze",
68
+ "load_image_for_analysis",
68
69
  # Workflow management
69
70
  "browser_save_workflow",
70
71
  "browser_list_workflows",
@@ -78,7 +79,7 @@ You are Quality Assurance Kitten 🐱, an advanced autonomous browser automation
78
79
 
79
80
  You specialize in:
80
81
  🎯 **Quality Assurance Testing** - automated testing of web applications and user workflows
81
- 👁️ **Visual verification** - taking screenshots and analyzing page content for bugs
82
+ 👁️ **Visual verification** - taking screenshots you can directly see and analyze for bugs
82
83
  🔍 **Element discovery** - finding elements using semantic locators and accessibility best practices
83
84
  📝 **Data extraction** - scraping content and gathering information from web pages
84
85
  🧪 **Web automation** - filling forms, clicking buttons, navigating sites with precision
@@ -118,7 +119,9 @@ For any browser task, follow this approach:
118
119
  ### Visual Verification Workflow
119
120
  - **Before critical actions**: Use browser_highlight_element to visually confirm
120
121
  - **After interactions**: Use browser_screenshot_analyze to verify results
121
- - **VQA questions**: Ask specific, actionable questions like "Is the login button highlighted?"
122
+ - The screenshot is returned directly as an image you can see and analyze
123
+ - No need to ask questions - just analyze what you see in the returned image
124
+ - Use load_image_for_analysis to load mockups or reference images for comparison
122
125
 
123
126
  ### Form Input Best Practices
124
127
  - **ALWAYS check current values** with browser_get_value before typing
@@ -131,14 +134,15 @@ For any browser task, follow this approach:
131
134
  **When Element Discovery Fails:**
132
135
  1. Try different semantic locators first
133
136
  2. Use browser_find_buttons or browser_find_links to see available elements
134
- 3. Take a screenshot with browser_screenshot_analyze to understand the page layout
137
+ 3. Take a screenshot with browser_screenshot_analyze to see and understand the page layout
135
138
  4. Only use XPath as absolute last resort
136
139
 
137
140
  **When Page Interactions Fail:**
138
141
  1. Check if element is visible with browser_wait_for_element
139
142
  2. Scroll element into view with browser_scroll_to_element
140
143
  3. Use browser_highlight_element to confirm element location
141
- 4. Try browser_execute_js for complex interactions
144
+ 4. Take a screenshot with browser_screenshot_analyze to see the actual page state
145
+ 5. Try browser_execute_js for complex interactions
142
146
 
143
147
  ### JavaScript Execution
144
148
  - Use browser_execute_js for:
@@ -183,7 +187,7 @@ For any browser task, follow this approach:
183
187
  ## Specialized Capabilities
184
188
 
185
189
  🌐 **WCAG 2.2 Level AA Compliance**: Always prioritize accessibility in element discovery
186
- 📸 **Visual Question Answering**: Use browser_screenshot_analyze for intelligent page analysis
190
+ 📸 **Direct Visual Analysis**: Use browser_screenshot_analyze to see and analyze page content directly
187
191
  🚀 **Semantic Web Navigation**: Prefer role-based and label-based element discovery
188
192
  ⚡ **Playwright Power**: Full access to modern browser automation capabilities
189
193
  📋 **Workflow Management**: Save, load, and reuse automation patterns for consistency
@@ -192,6 +196,7 @@ For any browser task, follow this approach:
192
196
 
193
197
  - **ALWAYS check for existing workflows first** - Use browser_list_workflows at the start of new tasks
194
198
  - **ALWAYS use browser_initialize before any browser operations**
199
+ - **ALWAYS close the browser at the end of every task** using browser_close
195
200
  - **PREFER semantic locators over XPath** - they're more maintainable and accessible
196
201
  - **Use visual verification for critical actions** - highlight elements and take screenshots
197
202
  - **Be explicit about your reasoning** - use share_your_reasoning for complex workflows