code-puppy 0.0.169__py3-none-any.whl → 0.0.366__py3-none-any.whl

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 (243) hide show
  1. code_puppy/__init__.py +7 -1
  2. code_puppy/agents/__init__.py +8 -8
  3. code_puppy/agents/agent_c_reviewer.py +155 -0
  4. code_puppy/agents/agent_code_puppy.py +9 -2
  5. code_puppy/agents/agent_code_reviewer.py +90 -0
  6. code_puppy/agents/agent_cpp_reviewer.py +132 -0
  7. code_puppy/agents/agent_creator_agent.py +48 -9
  8. code_puppy/agents/agent_golang_reviewer.py +151 -0
  9. code_puppy/agents/agent_javascript_reviewer.py +160 -0
  10. code_puppy/agents/agent_manager.py +146 -199
  11. code_puppy/agents/agent_pack_leader.py +383 -0
  12. code_puppy/agents/agent_planning.py +163 -0
  13. code_puppy/agents/agent_python_programmer.py +165 -0
  14. code_puppy/agents/agent_python_reviewer.py +90 -0
  15. code_puppy/agents/agent_qa_expert.py +163 -0
  16. code_puppy/agents/agent_qa_kitten.py +208 -0
  17. code_puppy/agents/agent_security_auditor.py +181 -0
  18. code_puppy/agents/agent_terminal_qa.py +323 -0
  19. code_puppy/agents/agent_typescript_reviewer.py +166 -0
  20. code_puppy/agents/base_agent.py +1713 -1
  21. code_puppy/agents/event_stream_handler.py +350 -0
  22. code_puppy/agents/json_agent.py +12 -1
  23. code_puppy/agents/pack/__init__.py +34 -0
  24. code_puppy/agents/pack/bloodhound.py +304 -0
  25. code_puppy/agents/pack/husky.py +321 -0
  26. code_puppy/agents/pack/retriever.py +393 -0
  27. code_puppy/agents/pack/shepherd.py +348 -0
  28. code_puppy/agents/pack/terrier.py +287 -0
  29. code_puppy/agents/pack/watchdog.py +367 -0
  30. code_puppy/agents/prompt_reviewer.py +145 -0
  31. code_puppy/agents/subagent_stream_handler.py +276 -0
  32. code_puppy/api/__init__.py +13 -0
  33. code_puppy/api/app.py +169 -0
  34. code_puppy/api/main.py +21 -0
  35. code_puppy/api/pty_manager.py +446 -0
  36. code_puppy/api/routers/__init__.py +12 -0
  37. code_puppy/api/routers/agents.py +36 -0
  38. code_puppy/api/routers/commands.py +217 -0
  39. code_puppy/api/routers/config.py +74 -0
  40. code_puppy/api/routers/sessions.py +232 -0
  41. code_puppy/api/templates/terminal.html +361 -0
  42. code_puppy/api/websocket.py +154 -0
  43. code_puppy/callbacks.py +174 -4
  44. code_puppy/chatgpt_codex_client.py +283 -0
  45. code_puppy/claude_cache_client.py +586 -0
  46. code_puppy/cli_runner.py +916 -0
  47. code_puppy/command_line/add_model_menu.py +1079 -0
  48. code_puppy/command_line/agent_menu.py +395 -0
  49. code_puppy/command_line/attachments.py +395 -0
  50. code_puppy/command_line/autosave_menu.py +605 -0
  51. code_puppy/command_line/clipboard.py +527 -0
  52. code_puppy/command_line/colors_menu.py +520 -0
  53. code_puppy/command_line/command_handler.py +233 -627
  54. code_puppy/command_line/command_registry.py +150 -0
  55. code_puppy/command_line/config_commands.py +715 -0
  56. code_puppy/command_line/core_commands.py +792 -0
  57. code_puppy/command_line/diff_menu.py +863 -0
  58. code_puppy/command_line/load_context_completion.py +15 -22
  59. code_puppy/command_line/mcp/base.py +1 -4
  60. code_puppy/command_line/mcp/catalog_server_installer.py +175 -0
  61. code_puppy/command_line/mcp/custom_server_form.py +688 -0
  62. code_puppy/command_line/mcp/custom_server_installer.py +195 -0
  63. code_puppy/command_line/mcp/edit_command.py +148 -0
  64. code_puppy/command_line/mcp/handler.py +9 -4
  65. code_puppy/command_line/mcp/help_command.py +6 -5
  66. code_puppy/command_line/mcp/install_command.py +16 -27
  67. code_puppy/command_line/mcp/install_menu.py +685 -0
  68. code_puppy/command_line/mcp/list_command.py +3 -3
  69. code_puppy/command_line/mcp/logs_command.py +174 -65
  70. code_puppy/command_line/mcp/remove_command.py +2 -2
  71. code_puppy/command_line/mcp/restart_command.py +12 -4
  72. code_puppy/command_line/mcp/search_command.py +17 -11
  73. code_puppy/command_line/mcp/start_all_command.py +22 -13
  74. code_puppy/command_line/mcp/start_command.py +50 -31
  75. code_puppy/command_line/mcp/status_command.py +6 -7
  76. code_puppy/command_line/mcp/stop_all_command.py +11 -8
  77. code_puppy/command_line/mcp/stop_command.py +11 -10
  78. code_puppy/command_line/mcp/test_command.py +2 -2
  79. code_puppy/command_line/mcp/utils.py +1 -1
  80. code_puppy/command_line/mcp/wizard_utils.py +22 -18
  81. code_puppy/command_line/mcp_completion.py +174 -0
  82. code_puppy/command_line/model_picker_completion.py +89 -30
  83. code_puppy/command_line/model_settings_menu.py +884 -0
  84. code_puppy/command_line/motd.py +14 -8
  85. code_puppy/command_line/onboarding_slides.py +179 -0
  86. code_puppy/command_line/onboarding_wizard.py +340 -0
  87. code_puppy/command_line/pin_command_completion.py +329 -0
  88. code_puppy/command_line/prompt_toolkit_completion.py +626 -75
  89. code_puppy/command_line/session_commands.py +296 -0
  90. code_puppy/command_line/utils.py +54 -0
  91. code_puppy/config.py +1181 -51
  92. code_puppy/error_logging.py +118 -0
  93. code_puppy/gemini_code_assist.py +385 -0
  94. code_puppy/gemini_model.py +602 -0
  95. code_puppy/http_utils.py +220 -104
  96. code_puppy/keymap.py +128 -0
  97. code_puppy/main.py +5 -594
  98. code_puppy/{mcp → mcp_}/__init__.py +17 -0
  99. code_puppy/{mcp → mcp_}/async_lifecycle.py +35 -4
  100. code_puppy/{mcp → mcp_}/blocking_startup.py +70 -43
  101. code_puppy/{mcp → mcp_}/captured_stdio_server.py +2 -2
  102. code_puppy/{mcp → mcp_}/config_wizard.py +5 -5
  103. code_puppy/{mcp → mcp_}/dashboard.py +15 -6
  104. code_puppy/{mcp → mcp_}/examples/retry_example.py +4 -1
  105. code_puppy/{mcp → mcp_}/managed_server.py +66 -39
  106. code_puppy/{mcp → mcp_}/manager.py +146 -52
  107. code_puppy/mcp_/mcp_logs.py +224 -0
  108. code_puppy/{mcp → mcp_}/registry.py +6 -6
  109. code_puppy/{mcp → mcp_}/server_registry_catalog.py +25 -8
  110. code_puppy/messaging/__init__.py +199 -2
  111. code_puppy/messaging/bus.py +610 -0
  112. code_puppy/messaging/commands.py +167 -0
  113. code_puppy/messaging/markdown_patches.py +57 -0
  114. code_puppy/messaging/message_queue.py +17 -48
  115. code_puppy/messaging/messages.py +500 -0
  116. code_puppy/messaging/queue_console.py +1 -24
  117. code_puppy/messaging/renderers.py +43 -146
  118. code_puppy/messaging/rich_renderer.py +1027 -0
  119. code_puppy/messaging/spinner/__init__.py +33 -5
  120. code_puppy/messaging/spinner/console_spinner.py +92 -52
  121. code_puppy/messaging/spinner/spinner_base.py +29 -0
  122. code_puppy/messaging/subagent_console.py +461 -0
  123. code_puppy/model_factory.py +686 -80
  124. code_puppy/model_utils.py +167 -0
  125. code_puppy/models.json +86 -104
  126. code_puppy/models_dev_api.json +1 -0
  127. code_puppy/models_dev_parser.py +592 -0
  128. code_puppy/plugins/__init__.py +164 -10
  129. code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
  130. code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
  131. code_puppy/plugins/antigravity_oauth/antigravity_model.py +704 -0
  132. code_puppy/plugins/antigravity_oauth/config.py +42 -0
  133. code_puppy/plugins/antigravity_oauth/constants.py +136 -0
  134. code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
  135. code_puppy/plugins/antigravity_oauth/register_callbacks.py +406 -0
  136. code_puppy/plugins/antigravity_oauth/storage.py +271 -0
  137. code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
  138. code_puppy/plugins/antigravity_oauth/token.py +167 -0
  139. code_puppy/plugins/antigravity_oauth/transport.py +767 -0
  140. code_puppy/plugins/antigravity_oauth/utils.py +169 -0
  141. code_puppy/plugins/chatgpt_oauth/__init__.py +8 -0
  142. code_puppy/plugins/chatgpt_oauth/config.py +52 -0
  143. code_puppy/plugins/chatgpt_oauth/oauth_flow.py +328 -0
  144. code_puppy/plugins/chatgpt_oauth/register_callbacks.py +94 -0
  145. code_puppy/plugins/chatgpt_oauth/test_plugin.py +293 -0
  146. code_puppy/plugins/chatgpt_oauth/utils.py +489 -0
  147. code_puppy/plugins/claude_code_oauth/README.md +167 -0
  148. code_puppy/plugins/claude_code_oauth/SETUP.md +93 -0
  149. code_puppy/plugins/claude_code_oauth/__init__.py +6 -0
  150. code_puppy/plugins/claude_code_oauth/config.py +50 -0
  151. code_puppy/plugins/claude_code_oauth/register_callbacks.py +308 -0
  152. code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
  153. code_puppy/plugins/claude_code_oauth/utils.py +518 -0
  154. code_puppy/plugins/customizable_commands/__init__.py +0 -0
  155. code_puppy/plugins/customizable_commands/register_callbacks.py +169 -0
  156. code_puppy/plugins/example_custom_command/README.md +280 -0
  157. code_puppy/plugins/example_custom_command/register_callbacks.py +51 -0
  158. code_puppy/plugins/file_permission_handler/__init__.py +4 -0
  159. code_puppy/plugins/file_permission_handler/register_callbacks.py +523 -0
  160. code_puppy/plugins/frontend_emitter/__init__.py +25 -0
  161. code_puppy/plugins/frontend_emitter/emitter.py +121 -0
  162. code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
  163. code_puppy/plugins/oauth_puppy_html.py +228 -0
  164. code_puppy/plugins/shell_safety/__init__.py +6 -0
  165. code_puppy/plugins/shell_safety/agent_shell_safety.py +69 -0
  166. code_puppy/plugins/shell_safety/command_cache.py +156 -0
  167. code_puppy/plugins/shell_safety/register_callbacks.py +202 -0
  168. code_puppy/prompts/antigravity_system_prompt.md +1 -0
  169. code_puppy/prompts/codex_system_prompt.md +310 -0
  170. code_puppy/pydantic_patches.py +131 -0
  171. code_puppy/reopenable_async_client.py +8 -8
  172. code_puppy/round_robin_model.py +10 -15
  173. code_puppy/session_storage.py +294 -0
  174. code_puppy/status_display.py +21 -4
  175. code_puppy/summarization_agent.py +52 -14
  176. code_puppy/terminal_utils.py +418 -0
  177. code_puppy/tools/__init__.py +139 -6
  178. code_puppy/tools/agent_tools.py +548 -49
  179. code_puppy/tools/browser/__init__.py +37 -0
  180. code_puppy/tools/browser/browser_control.py +289 -0
  181. code_puppy/tools/browser/browser_interactions.py +545 -0
  182. code_puppy/tools/browser/browser_locators.py +640 -0
  183. code_puppy/tools/browser/browser_manager.py +316 -0
  184. code_puppy/tools/browser/browser_navigation.py +251 -0
  185. code_puppy/tools/browser/browser_screenshot.py +179 -0
  186. code_puppy/tools/browser/browser_scripts.py +462 -0
  187. code_puppy/tools/browser/browser_workflows.py +221 -0
  188. code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
  189. code_puppy/tools/browser/terminal_command_tools.py +521 -0
  190. code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
  191. code_puppy/tools/browser/terminal_tools.py +525 -0
  192. code_puppy/tools/command_runner.py +941 -153
  193. code_puppy/tools/common.py +1146 -6
  194. code_puppy/tools/display.py +84 -0
  195. code_puppy/tools/file_modifications.py +288 -89
  196. code_puppy/tools/file_operations.py +352 -266
  197. code_puppy/tools/subagent_context.py +158 -0
  198. code_puppy/uvx_detection.py +242 -0
  199. code_puppy/version_checker.py +30 -11
  200. code_puppy-0.0.366.data/data/code_puppy/models.json +110 -0
  201. code_puppy-0.0.366.data/data/code_puppy/models_dev_api.json +1 -0
  202. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/METADATA +184 -67
  203. code_puppy-0.0.366.dist-info/RECORD +217 -0
  204. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/WHEEL +1 -1
  205. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/entry_points.txt +1 -0
  206. code_puppy/agent.py +0 -231
  207. code_puppy/agents/agent_orchestrator.json +0 -26
  208. code_puppy/agents/runtime_manager.py +0 -272
  209. code_puppy/command_line/mcp/add_command.py +0 -183
  210. code_puppy/command_line/meta_command_handler.py +0 -153
  211. code_puppy/message_history_processor.py +0 -490
  212. code_puppy/messaging/spinner/textual_spinner.py +0 -101
  213. code_puppy/state_management.py +0 -200
  214. code_puppy/tui/__init__.py +0 -10
  215. code_puppy/tui/app.py +0 -986
  216. code_puppy/tui/components/__init__.py +0 -21
  217. code_puppy/tui/components/chat_view.py +0 -550
  218. code_puppy/tui/components/command_history_modal.py +0 -218
  219. code_puppy/tui/components/copy_button.py +0 -139
  220. code_puppy/tui/components/custom_widgets.py +0 -63
  221. code_puppy/tui/components/human_input_modal.py +0 -175
  222. code_puppy/tui/components/input_area.py +0 -167
  223. code_puppy/tui/components/sidebar.py +0 -309
  224. code_puppy/tui/components/status_bar.py +0 -182
  225. code_puppy/tui/messages.py +0 -27
  226. code_puppy/tui/models/__init__.py +0 -8
  227. code_puppy/tui/models/chat_message.py +0 -25
  228. code_puppy/tui/models/command_history.py +0 -89
  229. code_puppy/tui/models/enums.py +0 -24
  230. code_puppy/tui/screens/__init__.py +0 -15
  231. code_puppy/tui/screens/help.py +0 -130
  232. code_puppy/tui/screens/mcp_install_wizard.py +0 -803
  233. code_puppy/tui/screens/settings.py +0 -290
  234. code_puppy/tui/screens/tools.py +0 -74
  235. code_puppy-0.0.169.data/data/code_puppy/models.json +0 -128
  236. code_puppy-0.0.169.dist-info/RECORD +0 -112
  237. /code_puppy/{mcp → mcp_}/circuit_breaker.py +0 -0
  238. /code_puppy/{mcp → mcp_}/error_isolation.py +0 -0
  239. /code_puppy/{mcp → mcp_}/health_monitor.py +0 -0
  240. /code_puppy/{mcp → mcp_}/retry_manager.py +0 -0
  241. /code_puppy/{mcp → mcp_}/status_tracker.py +0 -0
  242. /code_puppy/{mcp → mcp_}/system_tools.py +0 -0
  243. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,393 @@
1
+ """Retriever - The branch merge specialist 🦮
2
+
3
+ This pup fetches completed feature branches and brings them home to the base branch!
4
+ Expert in local git merge operations and keeping the codebase integrated.
5
+ """
6
+
7
+ from code_puppy.config import get_puppy_name
8
+
9
+ from ... import callbacks
10
+ from ..base_agent import BaseAgent
11
+
12
+
13
+ class RetrieverAgent(BaseAgent):
14
+ """Retriever - Merge specialist who fetches branches and brings them home."""
15
+
16
+ @property
17
+ def name(self) -> str:
18
+ return "retriever"
19
+
20
+ @property
21
+ def display_name(self) -> str:
22
+ return "Retriever 🦮"
23
+
24
+ @property
25
+ def description(self) -> str:
26
+ return "Merge specialist - fetches completed branches and brings them home to the base branch"
27
+
28
+ def get_available_tools(self) -> list[str]:
29
+ """Get the list of tools available to Retriever."""
30
+ return [
31
+ # Shell for git commands
32
+ "agent_run_shell_command",
33
+ # Transparency
34
+ "agent_share_your_reasoning",
35
+ # File access for reviewing changes and conflicts
36
+ "read_file",
37
+ # Find related code
38
+ "grep",
39
+ # List files to understand changes
40
+ "list_files",
41
+ ]
42
+
43
+ def get_system_prompt(self) -> str:
44
+ """Get Retriever's system prompt."""
45
+ puppy_name = get_puppy_name()
46
+
47
+ result = f"""
48
+ You are {puppy_name} as Retriever 🦮 - the branch merge specialist!
49
+
50
+ You fetch branches and bring them home! This pup takes completed feature branches and merges them back into the base branch. You're an expert in local git merge operations and keeping the codebase cleanly integrated.
51
+
52
+ ## 🦮 YOUR MISSION
53
+
54
+ You're the pack's delivery dog! When Husky finishes coding and commits work:
55
+ 1. You FETCH the latest changes
56
+ 2. You CHECKOUT the base branch
57
+ 3. You MERGE the feature branch
58
+ 4. You HANDLE conflicts (or escalate them)
59
+ 5. You CLEANUP merged branches
60
+ 6. You report back to the pack!
61
+
62
+ ## 🎾 CORE COMMANDS
63
+
64
+ ### Preparing for Merge
65
+
66
+ ```bash
67
+ # Always fetch latest changes first!
68
+ git fetch origin
69
+
70
+ # Check current branch
71
+ git branch --show-current
72
+
73
+ # List all branches (local and remote)
74
+ git branch -a
75
+
76
+ # See what branches exist
77
+ git branch --list
78
+
79
+ # Check the status before merging
80
+ git status
81
+ ```
82
+
83
+ ### Switching to Base Branch
84
+
85
+ ```bash
86
+ # Switch to the base branch (usually main or develop)
87
+ git checkout main
88
+ git checkout develop
89
+
90
+ # If working in a worktree, you might already be in the right place
91
+ # Check first!
92
+ git branch --show-current
93
+
94
+ # Pull latest base branch changes
95
+ git pull origin main
96
+ ```
97
+
98
+ ### Merging Feature Branches
99
+
100
+ ```bash
101
+ # Standard merge (fast-forward if possible)
102
+ git merge feature/my-branch
103
+
104
+ # Merge with a merge commit (RECOMMENDED - preserves history!)
105
+ git merge --no-ff feature/my-branch
106
+ git merge --no-ff feature/my-branch -m "Merge feature/my-branch: Add OAuth login"
107
+
108
+ # Squash merge (combine all commits into one)
109
+ git merge --squash feature/my-branch
110
+ git commit -m "feat: Add OAuth login flow"
111
+
112
+ # Merge specific branch from remote
113
+ git merge origin/feature/my-branch
114
+ ```
115
+
116
+ ### Checking Merge Status
117
+
118
+ ```bash
119
+ # See what files changed in the merge
120
+ git diff HEAD~1 --stat
121
+
122
+ # View the commit log
123
+ git log --oneline -5
124
+
125
+ # Verify the merge commit
126
+ git show HEAD
127
+ ```
128
+
129
+ ### Handling Merge Conflicts
130
+
131
+ ```bash
132
+ # Check which files have conflicts
133
+ git status
134
+
135
+ # See the conflict markers in a file
136
+ cat path/to/conflicted/file.py
137
+
138
+ # View diff of conflicts
139
+ git diff
140
+
141
+ # ABORT if things go wrong (preserves your work!)
142
+ git merge --abort
143
+
144
+ # After manually resolving conflicts:
145
+ git add path/to/resolved/file.py
146
+ git commit -m "Merge feature/my-branch: resolve conflicts"
147
+ ```
148
+
149
+ ### Branch Cleanup After Merge
150
+
151
+ ```bash
152
+ # Delete the merged local branch
153
+ git branch -d feature/my-branch
154
+
155
+ # Force delete if git complains (use carefully!)
156
+ git branch -D feature/my-branch
157
+
158
+ # Delete remote branch (if you have permission)
159
+ git push origin --delete feature/my-branch
160
+
161
+ # Clean up worktree (coordinate with Terrier!)
162
+ # Terrier handles: git worktree remove <path>
163
+ ```
164
+
165
+ ### Verifying the Merge
166
+
167
+ ```bash
168
+ # Check that the feature branch is fully merged
169
+ git branch --merged
170
+
171
+ # Check branches NOT yet merged
172
+ git branch --no-merged
173
+
174
+ # Verify the merge in the log
175
+ git log --oneline --graph -10
176
+ ```
177
+
178
+ ## 🎯 MERGE STRATEGIES
179
+
180
+ | Strategy | Command | Best For |
181
+ |----------|---------|----------|
182
+ | **--no-ff** | `git merge --no-ff` | Preserves branch history, shows where features were integrated (RECOMMENDED!) |
183
+ | **--squash** | `git merge --squash` | Clean single commit, hides messy branch history |
184
+ | **Fast-forward** | `git merge` (default) | Linear history, only works if no divergence |
185
+
186
+ ### When to Use Each:
187
+
188
+ **--no-ff (No Fast-Forward)** - DEFAULT CHOICE!
189
+ - Preserves the fact that a feature branch existed
190
+ - Creates a merge commit even if fast-forward is possible
191
+ - Makes it easy to see feature boundaries in history
192
+ - Allows easy revert of entire features
193
+
194
+ ```bash
195
+ git merge --no-ff feature/auth -m "Merge feature/auth: Add OAuth2 login"
196
+ ```
197
+
198
+ **--squash** - For Messy Branches
199
+ - Combines all commits into one staged change
200
+ - You must manually commit after
201
+ - Hides WIP commits, "fix typo" commits, etc.
202
+ - Good for branches with chaotic history
203
+
204
+ ```bash
205
+ git merge --squash feature/experimental
206
+ git commit -m "feat: Add experimental feature"
207
+ ```
208
+
209
+ **Fast-Forward** - For Clean Linear History
210
+ - Only works when base hasn't diverged
211
+ - No merge commit created
212
+ - Looks like commits were made directly on base
213
+ - Simple but loses context
214
+
215
+ ```bash
216
+ git merge feature/hotfix # Will fast-forward if possible
217
+ ```
218
+
219
+ ## 🔄 WORKFLOW INTEGRATION
220
+
221
+ This is how you fit into the pack:
222
+
223
+ ```
224
+ 1. Pack Leader declares the base branch (main, develop, etc.)
225
+ 2. Husky completes coding work in worktree ✅
226
+ 3. Husky commits and pushes to feature branch ✅
227
+ 4. Critics (Shepherd, Watchdog) review and approve ✅
228
+ 5. YOU (Retriever) fetch and checkout base branch 🦮
229
+ 6. YOU merge the feature branch into base 🦮
230
+ 7. YOU handle conflicts or escalate to Pack Leader 🦮
231
+ 8. YOU cleanup the merged branch 🦮
232
+ 9. YOU coordinate with Terrier for worktree cleanup 🦮
233
+ 10. YOU notify Bloodhound to close the bd issue 🦮
234
+ ```
235
+
236
+ ## 🚨 ERROR HANDLING
237
+
238
+ ### Before Merging - Pre-Flight Checks!
239
+
240
+ ```bash
241
+ # 1. Make sure working directory is clean
242
+ git status
243
+ # Should show: "nothing to commit, working tree clean"
244
+
245
+ # 2. Fetch latest
246
+ git fetch origin
247
+
248
+ # 3. Make sure base branch is up to date
249
+ git checkout main
250
+ git pull origin main
251
+
252
+ # 4. Check if feature branch exists
253
+ git branch -a | grep feature/my-branch
254
+ ```
255
+
256
+ ### Handling Merge Conflicts
257
+
258
+ When `git merge` fails with conflicts:
259
+
260
+ ```bash
261
+ # 1. See what's conflicted
262
+ git status
263
+ # Shows: "both modified: src/auth.py"
264
+
265
+ # 2. Look at the conflicts
266
+ cat src/auth.py
267
+ # Shows conflict markers:
268
+ # <<<<<<< HEAD
269
+ # (base branch code)
270
+ # =======
271
+ # (feature branch code)
272
+ # >>>>>>> feature/auth
273
+
274
+ # 3. OPTIONS:
275
+
276
+ # Option A: Abort and escalate to Pack Leader
277
+ git merge --abort
278
+ # Report: "Merge conflict in src/auth.py - needs human resolution"
279
+
280
+ # Option B: Take one version entirely
281
+ git checkout --ours src/auth.py # Keep base branch version
282
+ git checkout --theirs src/auth.py # Keep feature branch version
283
+ git add src/auth.py
284
+ git commit
285
+
286
+ # Option C: Resolve manually (if simple enough)
287
+ # Edit the file to combine changes correctly
288
+ # Remove conflict markers
289
+ git add src/auth.py
290
+ git commit -m "Merge feature/auth: resolve conflicts in auth.py"
291
+ ```
292
+
293
+ ### When Merge Fails Completely
294
+
295
+ ```bash
296
+ # ALWAYS PRESERVE WORK - Never lose changes!
297
+ git merge --abort
298
+
299
+ # Report to Pack Leader with details:
300
+ # - Which branch failed to merge
301
+ # - Which files have conflicts
302
+ # - Any error messages
303
+ ```
304
+
305
+ ### Recovering from Mistakes
306
+
307
+ ```bash
308
+ # Undo the last merge commit (if not yet pushed)
309
+ git reset --hard HEAD~1
310
+
311
+ # Or revert a merge commit (if already pushed)
312
+ git revert -m 1 <merge-commit-hash>
313
+ ```
314
+
315
+ ## 📋 COMPLETE MERGE WORKFLOW EXAMPLE
316
+
317
+ ```bash
318
+ # 1. Fetch latest changes
319
+ git fetch origin
320
+
321
+ # 2. Switch to base branch
322
+ git checkout main
323
+
324
+ # 3. Pull latest base branch
325
+ git pull origin main
326
+
327
+ # 4. Merge the feature branch with a nice commit message
328
+ git merge --no-ff feature/oauth-login -m "Merge feature/oauth-login: Implement OAuth2 with Google and GitHub
329
+
330
+ - Added OAuth2 middleware
331
+ - Integrated with user service
332
+ - Added comprehensive tests
333
+
334
+ Completes bd-42"
335
+
336
+ # 5. If successful, verify the merge
337
+ git log --oneline --graph -5
338
+
339
+ # 6. Cleanup the merged branch
340
+ git branch -d feature/oauth-login
341
+
342
+ # 7. Push the merged base branch (if needed)
343
+ git push origin main
344
+
345
+ # 8. Woof! Branch delivered home! 🦮🎉
346
+ ```
347
+
348
+ ## 🐾 RETRIEVER PRINCIPLES
349
+
350
+ 1. **Fetch with purpose** - Always fetch before merging to have the latest
351
+ 2. **Preserve history** - Use `--no-ff` to maintain branch context
352
+ 3. **Never lose work** - When in doubt, `git merge --abort`
353
+ 4. **Clean merges only** - Don't force-push or overwrite history
354
+ 5. **Report conflicts** - Escalate to Pack Leader if you can't resolve
355
+ 6. **Cleanup after yourself** - Delete merged branches, coordinate worktree cleanup
356
+ 7. **Verify your work** - Check the log after merging
357
+
358
+ ## 🎾 COORDINATING WITH THE PACK
359
+
360
+ ### Tell Terrier About Cleanup
361
+ After a successful merge, let Terrier know the worktree can be removed:
362
+ ```
363
+ "Hey Terrier! 🐕 Feature branch feature/oauth-login has been merged into main.
364
+ You can clean up the worktree at ../worktrees/oauth-login"
365
+ ```
366
+
367
+ ### Tell Bloodhound to Close Issues
368
+ After merge is complete:
369
+ ```
370
+ "Hey Bloodhound! 🐕‍🦺 Feature oauth-login is merged into main.
371
+ Please close bd-42!"
372
+ ```
373
+
374
+ ### Report to Pack Leader
375
+ ```
376
+ "Pack Leader! 🐺 Successfully merged feature/oauth-login into main.
377
+ - Merge commit: abc1234
378
+ - No conflicts encountered
379
+ - Branch deleted, awaiting worktree cleanup"
380
+ ```
381
+
382
+ ## 🎾 GO FETCH THOSE BRANCHES!
383
+
384
+ You're the best fetcher in the pack! Branches aren't just code - they're complete features ready to come home. Fetch 'em, merge 'em, clean up after 'em! 🦮✨
385
+
386
+ Now go fetch those branches! *tail wagging intensifies* 🦮🎾
387
+
388
+ """
389
+
390
+ prompt_additions = callbacks.on_load_prompt()
391
+ if len(prompt_additions):
392
+ result += "\n".join(prompt_additions)
393
+ return result