newcode 0.1.1__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.
- code_puppy/__init__.py +10 -0
- code_puppy/__main__.py +10 -0
- code_puppy/agents/__init__.py +31 -0
- code_puppy/agents/agent_c_reviewer.py +155 -0
- code_puppy/agents/agent_code_puppy.py +147 -0
- code_puppy/agents/agent_code_reviewer.py +90 -0
- code_puppy/agents/agent_cpp_reviewer.py +132 -0
- code_puppy/agents/agent_creator_agent.py +630 -0
- code_puppy/agents/agent_golang_reviewer.py +151 -0
- code_puppy/agents/agent_helios.py +122 -0
- code_puppy/agents/agent_javascript_reviewer.py +160 -0
- code_puppy/agents/agent_manager.py +742 -0
- code_puppy/agents/agent_pack_leader.py +380 -0
- code_puppy/agents/agent_planning.py +165 -0
- code_puppy/agents/agent_python_programmer.py +167 -0
- code_puppy/agents/agent_python_reviewer.py +90 -0
- code_puppy/agents/agent_qa_expert.py +163 -0
- code_puppy/agents/agent_qa_kitten.py +208 -0
- code_puppy/agents/agent_scheduler.py +121 -0
- code_puppy/agents/agent_security_auditor.py +181 -0
- code_puppy/agents/agent_terminal_qa.py +323 -0
- code_puppy/agents/agent_typescript_reviewer.py +166 -0
- code_puppy/agents/base_agent.py +2145 -0
- code_puppy/agents/event_stream_handler.py +348 -0
- code_puppy/agents/json_agent.py +202 -0
- code_puppy/agents/pack/__init__.py +34 -0
- code_puppy/agents/pack/bloodhound.py +296 -0
- code_puppy/agents/pack/husky.py +307 -0
- code_puppy/agents/pack/retriever.py +380 -0
- code_puppy/agents/pack/shepherd.py +327 -0
- code_puppy/agents/pack/terrier.py +281 -0
- code_puppy/agents/pack/watchdog.py +357 -0
- code_puppy/agents/prompt_reviewer.py +145 -0
- code_puppy/agents/subagent_stream_handler.py +276 -0
- code_puppy/api/__init__.py +13 -0
- code_puppy/api/app.py +169 -0
- code_puppy/api/main.py +21 -0
- code_puppy/api/pty_manager.py +453 -0
- code_puppy/api/routers/__init__.py +12 -0
- code_puppy/api/routers/agents.py +36 -0
- code_puppy/api/routers/commands.py +217 -0
- code_puppy/api/routers/config.py +75 -0
- code_puppy/api/routers/sessions.py +234 -0
- code_puppy/api/templates/terminal.html +361 -0
- code_puppy/api/websocket.py +154 -0
- code_puppy/callbacks.py +674 -0
- code_puppy/chatgpt_codex_client.py +338 -0
- code_puppy/claude_cache_client.py +664 -0
- code_puppy/cli_runner.py +1038 -0
- code_puppy/command_line/__init__.py +1 -0
- code_puppy/command_line/add_model_menu.py +1092 -0
- code_puppy/command_line/agent_menu.py +662 -0
- code_puppy/command_line/attachments.py +395 -0
- code_puppy/command_line/autosave_menu.py +704 -0
- code_puppy/command_line/clipboard.py +527 -0
- code_puppy/command_line/colors_menu.py +526 -0
- code_puppy/command_line/command_handler.py +283 -0
- code_puppy/command_line/command_registry.py +150 -0
- code_puppy/command_line/config_commands.py +719 -0
- code_puppy/command_line/core_commands.py +853 -0
- code_puppy/command_line/diff_menu.py +865 -0
- code_puppy/command_line/file_path_completion.py +73 -0
- code_puppy/command_line/load_context_completion.py +52 -0
- code_puppy/command_line/mcp/__init__.py +10 -0
- code_puppy/command_line/mcp/base.py +32 -0
- code_puppy/command_line/mcp/catalog_server_installer.py +175 -0
- code_puppy/command_line/mcp/custom_server_form.py +688 -0
- code_puppy/command_line/mcp/custom_server_installer.py +195 -0
- code_puppy/command_line/mcp/edit_command.py +148 -0
- code_puppy/command_line/mcp/handler.py +138 -0
- code_puppy/command_line/mcp/help_command.py +147 -0
- code_puppy/command_line/mcp/install_command.py +214 -0
- code_puppy/command_line/mcp/install_menu.py +705 -0
- code_puppy/command_line/mcp/list_command.py +94 -0
- code_puppy/command_line/mcp/logs_command.py +235 -0
- code_puppy/command_line/mcp/remove_command.py +82 -0
- code_puppy/command_line/mcp/restart_command.py +100 -0
- code_puppy/command_line/mcp/search_command.py +123 -0
- code_puppy/command_line/mcp/start_all_command.py +135 -0
- code_puppy/command_line/mcp/start_command.py +117 -0
- code_puppy/command_line/mcp/status_command.py +184 -0
- code_puppy/command_line/mcp/stop_all_command.py +112 -0
- code_puppy/command_line/mcp/stop_command.py +80 -0
- code_puppy/command_line/mcp/test_command.py +107 -0
- code_puppy/command_line/mcp/utils.py +129 -0
- code_puppy/command_line/mcp/wizard_utils.py +334 -0
- code_puppy/command_line/mcp_completion.py +174 -0
- code_puppy/command_line/model_picker_completion.py +197 -0
- code_puppy/command_line/model_settings_menu.py +932 -0
- code_puppy/command_line/motd.py +91 -0
- code_puppy/command_line/onboarding_slides.py +179 -0
- code_puppy/command_line/onboarding_wizard.py +342 -0
- code_puppy/command_line/pin_command_completion.py +329 -0
- code_puppy/command_line/prompt_toolkit_completion.py +846 -0
- code_puppy/command_line/session_commands.py +302 -0
- code_puppy/command_line/skills_completion.py +160 -0
- code_puppy/command_line/uc_menu.py +893 -0
- code_puppy/command_line/utils.py +93 -0
- code_puppy/command_line/wiggum_state.py +78 -0
- code_puppy/config.py +1787 -0
- code_puppy/error_logging.py +133 -0
- code_puppy/gemini_code_assist.py +385 -0
- code_puppy/gemini_model.py +754 -0
- code_puppy/hook_engine/README.md +105 -0
- code_puppy/hook_engine/__init__.py +15 -0
- code_puppy/hook_engine/aliases.py +155 -0
- code_puppy/hook_engine/engine.py +195 -0
- code_puppy/hook_engine/executor.py +293 -0
- code_puppy/hook_engine/matcher.py +145 -0
- code_puppy/hook_engine/models.py +222 -0
- code_puppy/hook_engine/registry.py +106 -0
- code_puppy/hook_engine/validator.py +141 -0
- code_puppy/http_utils.py +361 -0
- code_puppy/keymap.py +128 -0
- code_puppy/main.py +10 -0
- code_puppy/mcp_/__init__.py +66 -0
- code_puppy/mcp_/async_lifecycle.py +286 -0
- code_puppy/mcp_/blocking_startup.py +469 -0
- code_puppy/mcp_/captured_stdio_server.py +275 -0
- code_puppy/mcp_/circuit_breaker.py +290 -0
- code_puppy/mcp_/config_wizard.py +507 -0
- code_puppy/mcp_/dashboard.py +308 -0
- code_puppy/mcp_/error_isolation.py +407 -0
- code_puppy/mcp_/examples/retry_example.py +226 -0
- code_puppy/mcp_/health_monitor.py +589 -0
- code_puppy/mcp_/managed_server.py +428 -0
- code_puppy/mcp_/manager.py +807 -0
- code_puppy/mcp_/mcp_logs.py +224 -0
- code_puppy/mcp_/registry.py +451 -0
- code_puppy/mcp_/retry_manager.py +337 -0
- code_puppy/mcp_/server_registry_catalog.py +1126 -0
- code_puppy/mcp_/status_tracker.py +355 -0
- code_puppy/mcp_/system_tools.py +209 -0
- code_puppy/mcp_prompts/__init__.py +1 -0
- code_puppy/mcp_prompts/hook_creator.py +103 -0
- code_puppy/messaging/__init__.py +255 -0
- code_puppy/messaging/bus.py +613 -0
- code_puppy/messaging/commands.py +167 -0
- code_puppy/messaging/markdown_patches.py +57 -0
- code_puppy/messaging/message_queue.py +361 -0
- code_puppy/messaging/messages.py +569 -0
- code_puppy/messaging/queue_console.py +271 -0
- code_puppy/messaging/renderers.py +311 -0
- code_puppy/messaging/rich_renderer.py +1153 -0
- code_puppy/messaging/spinner/__init__.py +83 -0
- code_puppy/messaging/spinner/console_spinner.py +240 -0
- code_puppy/messaging/spinner/spinner_base.py +96 -0
- code_puppy/messaging/subagent_console.py +460 -0
- code_puppy/model_factory.py +848 -0
- code_puppy/model_switching.py +63 -0
- code_puppy/model_utils.py +168 -0
- code_puppy/models.json +130 -0
- code_puppy/models_dev_api.json +1 -0
- code_puppy/models_dev_parser.py +592 -0
- code_puppy/plugins/__init__.py +186 -0
- code_puppy/plugins/agent_skills/__init__.py +22 -0
- code_puppy/plugins/agent_skills/config.py +175 -0
- code_puppy/plugins/agent_skills/discovery.py +136 -0
- code_puppy/plugins/agent_skills/downloader.py +392 -0
- code_puppy/plugins/agent_skills/installer.py +22 -0
- code_puppy/plugins/agent_skills/metadata.py +219 -0
- code_puppy/plugins/agent_skills/prompt_builder.py +100 -0
- code_puppy/plugins/agent_skills/register_callbacks.py +241 -0
- code_puppy/plugins/agent_skills/remote_catalog.py +322 -0
- code_puppy/plugins/agent_skills/skill_catalog.py +257 -0
- code_puppy/plugins/agent_skills/skills_install_menu.py +664 -0
- code_puppy/plugins/agent_skills/skills_menu.py +781 -0
- code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
- code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
- code_puppy/plugins/antigravity_oauth/antigravity_model.py +706 -0
- code_puppy/plugins/antigravity_oauth/config.py +42 -0
- code_puppy/plugins/antigravity_oauth/constants.py +133 -0
- code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
- code_puppy/plugins/antigravity_oauth/register_callbacks.py +518 -0
- code_puppy/plugins/antigravity_oauth/storage.py +288 -0
- code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
- code_puppy/plugins/antigravity_oauth/token.py +167 -0
- code_puppy/plugins/antigravity_oauth/transport.py +863 -0
- code_puppy/plugins/antigravity_oauth/utils.py +168 -0
- code_puppy/plugins/chatgpt_oauth/__init__.py +8 -0
- code_puppy/plugins/chatgpt_oauth/config.py +52 -0
- code_puppy/plugins/chatgpt_oauth/oauth_flow.py +328 -0
- code_puppy/plugins/chatgpt_oauth/register_callbacks.py +176 -0
- code_puppy/plugins/chatgpt_oauth/test_plugin.py +295 -0
- code_puppy/plugins/chatgpt_oauth/utils.py +499 -0
- code_puppy/plugins/claude_code_hooks/__init__.py +1 -0
- code_puppy/plugins/claude_code_hooks/config.py +131 -0
- code_puppy/plugins/claude_code_hooks/register_callbacks.py +163 -0
- code_puppy/plugins/claude_code_oauth/README.md +167 -0
- code_puppy/plugins/claude_code_oauth/SETUP.md +93 -0
- code_puppy/plugins/claude_code_oauth/__init__.py +25 -0
- code_puppy/plugins/claude_code_oauth/config.py +52 -0
- code_puppy/plugins/claude_code_oauth/register_callbacks.py +453 -0
- code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
- code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +241 -0
- code_puppy/plugins/claude_code_oauth/utils.py +601 -0
- code_puppy/plugins/customizable_commands/__init__.py +0 -0
- code_puppy/plugins/customizable_commands/register_callbacks.py +152 -0
- code_puppy/plugins/example_custom_command/README.md +280 -0
- code_puppy/plugins/example_custom_command/register_callbacks.py +48 -0
- code_puppy/plugins/file_permission_handler/__init__.py +4 -0
- code_puppy/plugins/file_permission_handler/register_callbacks.py +528 -0
- code_puppy/plugins/frontend_emitter/__init__.py +25 -0
- code_puppy/plugins/frontend_emitter/emitter.py +121 -0
- code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
- code_puppy/plugins/hook_creator/__init__.py +1 -0
- code_puppy/plugins/hook_creator/register_callbacks.py +33 -0
- code_puppy/plugins/hook_manager/__init__.py +1 -0
- code_puppy/plugins/hook_manager/config.py +277 -0
- code_puppy/plugins/hook_manager/hooks_menu.py +551 -0
- code_puppy/plugins/hook_manager/register_callbacks.py +205 -0
- code_puppy/plugins/oauth_puppy_html.py +224 -0
- code_puppy/plugins/scheduler/__init__.py +1 -0
- code_puppy/plugins/scheduler/register_callbacks.py +88 -0
- code_puppy/plugins/scheduler/scheduler_menu.py +522 -0
- code_puppy/plugins/scheduler/scheduler_wizard.py +341 -0
- code_puppy/plugins/shell_safety/__init__.py +6 -0
- code_puppy/plugins/shell_safety/agent_shell_safety.py +69 -0
- code_puppy/plugins/shell_safety/command_cache.py +156 -0
- code_puppy/plugins/shell_safety/register_callbacks.py +202 -0
- code_puppy/plugins/synthetic_status/__init__.py +1 -0
- code_puppy/plugins/synthetic_status/register_callbacks.py +132 -0
- code_puppy/plugins/synthetic_status/status_api.py +147 -0
- code_puppy/plugins/universal_constructor/__init__.py +13 -0
- code_puppy/plugins/universal_constructor/models.py +138 -0
- code_puppy/plugins/universal_constructor/register_callbacks.py +47 -0
- code_puppy/plugins/universal_constructor/registry.py +302 -0
- code_puppy/plugins/universal_constructor/sandbox.py +584 -0
- code_puppy/prompts/antigravity_system_prompt.md +1 -0
- code_puppy/pydantic_patches.py +317 -0
- code_puppy/reopenable_async_client.py +232 -0
- code_puppy/round_robin_model.py +150 -0
- code_puppy/scheduler/__init__.py +41 -0
- code_puppy/scheduler/__main__.py +9 -0
- code_puppy/scheduler/cli.py +118 -0
- code_puppy/scheduler/config.py +126 -0
- code_puppy/scheduler/daemon.py +280 -0
- code_puppy/scheduler/executor.py +155 -0
- code_puppy/scheduler/platform.py +19 -0
- code_puppy/scheduler/platform_unix.py +22 -0
- code_puppy/scheduler/platform_win.py +32 -0
- code_puppy/session_storage.py +338 -0
- code_puppy/status_display.py +257 -0
- code_puppy/summarization_agent.py +176 -0
- code_puppy/terminal_utils.py +418 -0
- code_puppy/tools/__init__.py +470 -0
- code_puppy/tools/agent_tools.py +616 -0
- code_puppy/tools/ask_user_question/__init__.py +26 -0
- code_puppy/tools/ask_user_question/constants.py +73 -0
- code_puppy/tools/ask_user_question/demo_tui.py +55 -0
- code_puppy/tools/ask_user_question/handler.py +232 -0
- code_puppy/tools/ask_user_question/models.py +304 -0
- code_puppy/tools/ask_user_question/registration.py +36 -0
- code_puppy/tools/ask_user_question/renderers.py +309 -0
- code_puppy/tools/ask_user_question/terminal_ui.py +329 -0
- code_puppy/tools/ask_user_question/theme.py +155 -0
- code_puppy/tools/ask_user_question/tui_loop.py +423 -0
- code_puppy/tools/browser/__init__.py +37 -0
- code_puppy/tools/browser/browser_control.py +289 -0
- code_puppy/tools/browser/browser_interactions.py +545 -0
- code_puppy/tools/browser/browser_locators.py +640 -0
- code_puppy/tools/browser/browser_manager.py +378 -0
- code_puppy/tools/browser/browser_navigation.py +251 -0
- code_puppy/tools/browser/browser_screenshot.py +179 -0
- code_puppy/tools/browser/browser_scripts.py +462 -0
- code_puppy/tools/browser/browser_workflows.py +221 -0
- code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
- code_puppy/tools/browser/terminal_command_tools.py +534 -0
- code_puppy/tools/browser/terminal_screenshot_tools.py +552 -0
- code_puppy/tools/browser/terminal_tools.py +525 -0
- code_puppy/tools/command_runner.py +1346 -0
- code_puppy/tools/common.py +1409 -0
- code_puppy/tools/display.py +84 -0
- code_puppy/tools/file_modifications.py +739 -0
- code_puppy/tools/file_operations.py +802 -0
- code_puppy/tools/scheduler_tools.py +412 -0
- code_puppy/tools/skills_tools.py +251 -0
- code_puppy/tools/subagent_context.py +158 -0
- code_puppy/tools/tools_content.py +51 -0
- code_puppy/tools/universal_constructor.py +889 -0
- code_puppy/uvx_detection.py +242 -0
- code_puppy/version_checker.py +82 -0
- newcode-0.1.1.data/data/code_puppy/models.json +130 -0
- newcode-0.1.1.data/data/code_puppy/models_dev_api.json +1 -0
- newcode-0.1.1.dist-info/METADATA +154 -0
- newcode-0.1.1.dist-info/RECORD +289 -0
- newcode-0.1.1.dist-info/WHEEL +4 -0
- newcode-0.1.1.dist-info/entry_points.txt +3 -0
- newcode-0.1.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"""Tracker - Issue tracking specialist using bd for dependency management."""
|
|
2
|
+
|
|
3
|
+
from code_puppy.config import get_agent_name
|
|
4
|
+
|
|
5
|
+
from ... import callbacks
|
|
6
|
+
from ..base_agent import BaseAgent
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class BloodhoundAgent(BaseAgent):
|
|
10
|
+
"""Tracker - Issue tracking specialist.
|
|
11
|
+
|
|
12
|
+
Expert in `bd` (local issue tracker with dependencies).
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
@property
|
|
16
|
+
def name(self) -> str:
|
|
17
|
+
return "bloodhound"
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def display_name(self) -> str:
|
|
21
|
+
return "Tracker"
|
|
22
|
+
|
|
23
|
+
@property
|
|
24
|
+
def description(self) -> str:
|
|
25
|
+
return "Issue tracking specialist using bd for dependency management"
|
|
26
|
+
|
|
27
|
+
def get_available_tools(self) -> list[str]:
|
|
28
|
+
"""Get the list of tools available to the Tracker."""
|
|
29
|
+
return [
|
|
30
|
+
# Shell for bd commands
|
|
31
|
+
"agent_run_shell_command",
|
|
32
|
+
# Transparency
|
|
33
|
+
"agent_share_your_reasoning",
|
|
34
|
+
# Read files to understand issue context
|
|
35
|
+
"read_file",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
def get_system_prompt(self) -> str:
|
|
39
|
+
"""Get the Tracker's system prompt."""
|
|
40
|
+
agent_name = get_agent_name()
|
|
41
|
+
|
|
42
|
+
result = f"""
|
|
43
|
+
You are {agent_name} acting as the Tracker - the issue tracking specialist for the agent team.
|
|
44
|
+
|
|
45
|
+
Your job is to manage issues using the `bd` local issue tracker. You are an expert in:
|
|
46
|
+
- **`bd`** - The local issue tracker with powerful dependency support
|
|
47
|
+
|
|
48
|
+
When the Orchestrator needs issues created, queried, or managed, you handle it.
|
|
49
|
+
|
|
50
|
+
## YOUR SPECIALTY
|
|
51
|
+
|
|
52
|
+
You track and manage:
|
|
53
|
+
- **Issue dependencies** - What blocks what? What was discovered from what?
|
|
54
|
+
- **Issue status** - What is open? What is ready to work on? What is blocked?
|
|
55
|
+
- **Priority management** - Critical issues get attention first
|
|
56
|
+
- **Dependency visualization** - See the full tree of how work connects
|
|
57
|
+
|
|
58
|
+
## CORE bd COMMANDS
|
|
59
|
+
|
|
60
|
+
### Creating Issues
|
|
61
|
+
```bash
|
|
62
|
+
# Basic issue creation
|
|
63
|
+
bd create "Fix login bug" -d "Users can't login after password reset" -p 1 -t bug
|
|
64
|
+
|
|
65
|
+
# With dependencies
|
|
66
|
+
bd create "Add user routes" -d "REST endpoints for users" --deps "blocks:bd-1,discovered-from:bd-2"
|
|
67
|
+
|
|
68
|
+
# Priority levels (0-4)
|
|
69
|
+
# 0 = critical (drop everything)
|
|
70
|
+
# 1 = high (next up)
|
|
71
|
+
# 2 = medium (normal work)
|
|
72
|
+
# 3 = low (when you have time)
|
|
73
|
+
# 4 = backlog (someday maybe)
|
|
74
|
+
|
|
75
|
+
# Types
|
|
76
|
+
# bug, feature, task, epic, chore
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Querying Issues
|
|
80
|
+
```bash
|
|
81
|
+
# List all issues (always use --json for parsing)
|
|
82
|
+
bd list --json
|
|
83
|
+
bd list --status open --json
|
|
84
|
+
bd list --status closed --json
|
|
85
|
+
|
|
86
|
+
# Key commands for the Orchestrator:
|
|
87
|
+
bd ready --json # No blockers - ready to work on
|
|
88
|
+
bd blocked --json # Has unresolved blockers
|
|
89
|
+
|
|
90
|
+
# Deep dive on one issue
|
|
91
|
+
bd show bd-5 --json
|
|
92
|
+
|
|
93
|
+
# Visualize dependency tree
|
|
94
|
+
bd dep tree bd-5
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Managing Issues
|
|
98
|
+
```bash
|
|
99
|
+
# Update issue details
|
|
100
|
+
bd update bd-5 -d "Updated description with more context"
|
|
101
|
+
bd update bd-5 -p 0 -t bug # Change priority and type
|
|
102
|
+
bd update bd-5 --title "New title for the issue"
|
|
103
|
+
|
|
104
|
+
# Status changes
|
|
105
|
+
bd close bd-5 # Mark as complete
|
|
106
|
+
bd reopen bd-5 # Reopen if needed
|
|
107
|
+
|
|
108
|
+
# Add comments (for tracking progress)
|
|
109
|
+
bd comment bd-5 "Found root cause: race condition in auth middleware"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Dependency Management
|
|
113
|
+
```bash
|
|
114
|
+
# Add dependencies
|
|
115
|
+
bd dep add bd-5 blocks bd-6 # bd-5 must be done before bd-6
|
|
116
|
+
bd dep add bd-5 discovered-from bd-3 # Found this while working on bd-3
|
|
117
|
+
|
|
118
|
+
# Remove dependencies
|
|
119
|
+
bd dep remove bd-5 blocks bd-6
|
|
120
|
+
|
|
121
|
+
# Visualize (always do this before making changes)
|
|
122
|
+
bd dep tree bd-5
|
|
123
|
+
|
|
124
|
+
# Detect cycles
|
|
125
|
+
bd dep cycles
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Labels
|
|
129
|
+
```bash
|
|
130
|
+
# Add labels
|
|
131
|
+
bd label add bd-5 urgent
|
|
132
|
+
bd label add bd-5 needs-review
|
|
133
|
+
|
|
134
|
+
# Remove labels
|
|
135
|
+
bd label remove bd-5 wontfix
|
|
136
|
+
|
|
137
|
+
# Filter by label
|
|
138
|
+
bd list --label urgent --json
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## DEPENDENCY KNOWLEDGE
|
|
142
|
+
|
|
143
|
+
You understand these relationship types:
|
|
144
|
+
|
|
145
|
+
### `blocks`
|
|
146
|
+
- "bd-5 blocks bd-6" means bd-5 MUST be done before bd-6 can start
|
|
147
|
+
- This is the core dependency type for workflow ordering
|
|
148
|
+
- The Orchestrator uses this to determine parallel execution
|
|
149
|
+
|
|
150
|
+
### `discovered-from`
|
|
151
|
+
- "bd-7 discovered-from bd-3" means you found bd-7 while working on bd-3
|
|
152
|
+
- Useful for audit trails and understanding issue genealogy
|
|
153
|
+
- Does not create blocking relationships
|
|
154
|
+
|
|
155
|
+
### Best Practices
|
|
156
|
+
- **Always visualize first**: `bd dep tree bd-X` before making changes
|
|
157
|
+
- **Check for cycles**: `bd dep cycles` - circular dependencies break the workflow
|
|
158
|
+
- **Keep it shallow**: Deep dependency chains hurt parallelization
|
|
159
|
+
- **Be explicit**: Better to over-document than under-document
|
|
160
|
+
|
|
161
|
+
## WORKFLOW INTEGRATION
|
|
162
|
+
|
|
163
|
+
You work with the Orchestrator to:
|
|
164
|
+
|
|
165
|
+
### 1. Task Breakdown
|
|
166
|
+
When the Orchestrator breaks down a task, you create the issue tree:
|
|
167
|
+
```bash
|
|
168
|
+
# Parent epic
|
|
169
|
+
bd create "Implement auth" -d "Full authentication system" -t epic
|
|
170
|
+
# Returns: bd-1
|
|
171
|
+
|
|
172
|
+
# Child tasks with dependencies
|
|
173
|
+
bd create "User model" -d "Create User with password hashing" -t task -p 1
|
|
174
|
+
# Returns: bd-2
|
|
175
|
+
|
|
176
|
+
bd create "Auth routes" -d "Login/register endpoints" -t task -p 1
|
|
177
|
+
# Returns: bd-3
|
|
178
|
+
|
|
179
|
+
bd create "JWT middleware" -d "Token validation" -t task -p 1
|
|
180
|
+
# Returns: bd-4
|
|
181
|
+
|
|
182
|
+
# Now set up the dependency chain
|
|
183
|
+
bd dep add bd-2 blocks bd-3 # Routes need the model
|
|
184
|
+
bd dep add bd-3 blocks bd-4 # Middleware needs routes
|
|
185
|
+
bd dep add bd-4 blocks bd-1 # Epic blocked until middleware done
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 2. Ready/Blocked Queries
|
|
189
|
+
The Orchestrator constantly asks: "What can we work on now?"
|
|
190
|
+
```bash
|
|
191
|
+
# Your standard response:
|
|
192
|
+
bd ready --json # Issues with no blockers - THESE CAN RUN IN PARALLEL
|
|
193
|
+
bd blocked --json # Issues waiting on dependencies
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### 3. Status Updates
|
|
197
|
+
As work completes:
|
|
198
|
+
```bash
|
|
199
|
+
bd close bd-3
|
|
200
|
+
# Now check what is unblocked
|
|
201
|
+
bd ready --json # bd-4 might be ready now
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
## BEST PRACTICES FOR ATOMIC ISSUES
|
|
205
|
+
|
|
206
|
+
1. **Keep issues small and focused** - One task, one issue
|
|
207
|
+
2. **Write good descriptions** - Clear context helps the entire team
|
|
208
|
+
3. **Set appropriate priority** - Not everything is critical
|
|
209
|
+
4. **Use the right type** - bug, feature, task, epic, chore
|
|
210
|
+
5. **Check dep tree** before adding/removing dependencies
|
|
211
|
+
6. **Maximize parallelization** - Wide dependency trees > deep chains
|
|
212
|
+
7. **Always use `--json`** for programmatic output that the Orchestrator can parse
|
|
213
|
+
|
|
214
|
+
### What Makes an Issue Atomic?
|
|
215
|
+
- Can be completed in one focused session
|
|
216
|
+
- Has a clear "done" definition
|
|
217
|
+
- Tests one specific piece of functionality
|
|
218
|
+
- Does not require splitting mid-work
|
|
219
|
+
|
|
220
|
+
### Bad Issue (Too Big)
|
|
221
|
+
```bash
|
|
222
|
+
bd create "Build entire auth system" -d "Everything about authentication"
|
|
223
|
+
# This is an epic pretending to be a task
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Good Issues (Atomic)
|
|
227
|
+
```bash
|
|
228
|
+
bd create "User password hashing" -d "Add bcrypt hashing to User model" -t task
|
|
229
|
+
bd create "Login endpoint" -d "POST /api/auth/login returns JWT" -t task
|
|
230
|
+
bd create "Token validation middleware" -d "Verify JWT on protected routes" -t task
|
|
231
|
+
# Each can be done, tested, and closed independently
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## TRACKER PRINCIPLES
|
|
235
|
+
|
|
236
|
+
1. **Always check status first**: `bd ready` before suggesting work
|
|
237
|
+
2. **Leave clear records**: Good descriptions and comments help the team
|
|
238
|
+
3. **Track everything in bd**: It is the single source of truth
|
|
239
|
+
4. **Follow dependencies**: They define the execution order
|
|
240
|
+
5. **Report what you find**: Use `agent_share_your_reasoning` liberally
|
|
241
|
+
6. **Atomic over epic**: Many small issues beat one large monolith
|
|
242
|
+
|
|
243
|
+
## EXAMPLE SESSION
|
|
244
|
+
|
|
245
|
+
Orchestrator: "Create issues for the authentication feature"
|
|
246
|
+
|
|
247
|
+
Tracker plan:
|
|
248
|
+
- Need a parent epic for tracking
|
|
249
|
+
- Break into model, routes, middleware, tests
|
|
250
|
+
- Model blocks routes, routes block middleware, all block tests
|
|
251
|
+
- Keep each issue atomic and testable
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# Create the issue tree
|
|
255
|
+
bd create "Auth epic" -d "Complete authentication system" -t epic -p 1
|
|
256
|
+
# bd-1 created
|
|
257
|
+
|
|
258
|
+
bd create "User model" -d "User model with bcrypt password hashing, email validation" -t task -p 1
|
|
259
|
+
# bd-2 created
|
|
260
|
+
|
|
261
|
+
bd create "Auth routes" -d "POST /login, POST /register, POST /logout" -t task -p 1
|
|
262
|
+
# bd-3 created
|
|
263
|
+
|
|
264
|
+
bd create "JWT middleware" -d "Validate JWT tokens, extract user from token" -t task -p 1
|
|
265
|
+
# bd-4 created
|
|
266
|
+
|
|
267
|
+
bd create "Auth tests" -d "Unit + integration tests for auth" -t task -p 2
|
|
268
|
+
# bd-5 created
|
|
269
|
+
|
|
270
|
+
# Now set up dependencies
|
|
271
|
+
bd dep add bd-2 blocks bd-3 # Routes need the model
|
|
272
|
+
bd dep add bd-3 blocks bd-4 # Middleware needs routes
|
|
273
|
+
bd dep add bd-2 blocks bd-5 # Tests need model
|
|
274
|
+
bd dep add bd-3 blocks bd-5 # Tests need routes
|
|
275
|
+
bd dep add bd-4 blocks bd-5 # Tests need middleware
|
|
276
|
+
bd dep add bd-5 blocks bd-1 # Epic done when tests pass
|
|
277
|
+
|
|
278
|
+
# Verify the structure:
|
|
279
|
+
bd dep tree bd-1
|
|
280
|
+
bd ready --json # Should show bd-2 is ready
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## ERROR HANDLING
|
|
284
|
+
|
|
285
|
+
- **Issue not found**: Double-check the bd-X number with `bd list --json`
|
|
286
|
+
- **Cycle detected**: Run `bd dep cycles` to find and break the loop
|
|
287
|
+
- **Dependency conflict**: Visualize with `bd dep tree` first
|
|
288
|
+
- **Too many blockers**: Consider if the issue is too big - split it up
|
|
289
|
+
|
|
290
|
+
When in doubt, `bd list --json` and start fresh.
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
prompt_additions = callbacks.on_load_prompt()
|
|
294
|
+
if len(prompt_additions):
|
|
295
|
+
result += "\n".join(prompt_additions)
|
|
296
|
+
return result
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
"""Executor - Task executor that implements coding changes in isolated worktrees."""
|
|
2
|
+
|
|
3
|
+
from code_puppy.config import get_agent_name
|
|
4
|
+
|
|
5
|
+
from ... import callbacks
|
|
6
|
+
from ..base_agent import BaseAgent
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class HuskyAgent(BaseAgent):
|
|
10
|
+
"""Executor - Implements coding tasks within worktrees."""
|
|
11
|
+
|
|
12
|
+
@property
|
|
13
|
+
def name(self) -> str:
|
|
14
|
+
return "husky"
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def display_name(self) -> str:
|
|
18
|
+
return "Executor"
|
|
19
|
+
|
|
20
|
+
@property
|
|
21
|
+
def description(self) -> str:
|
|
22
|
+
return "Task executor - implements coding changes in isolated worktrees"
|
|
23
|
+
|
|
24
|
+
def get_available_tools(self) -> list[str]:
|
|
25
|
+
"""Get the full coding toolkit available to the Executor."""
|
|
26
|
+
return [
|
|
27
|
+
# File exploration
|
|
28
|
+
"list_files",
|
|
29
|
+
"read_file",
|
|
30
|
+
"grep",
|
|
31
|
+
# File modification
|
|
32
|
+
"edit_file",
|
|
33
|
+
"delete_file",
|
|
34
|
+
# Shell for builds, tests, git
|
|
35
|
+
"agent_run_shell_command",
|
|
36
|
+
# Transparency
|
|
37
|
+
"agent_share_your_reasoning",
|
|
38
|
+
# Skills
|
|
39
|
+
"activate_skill",
|
|
40
|
+
"list_or_search_skills",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
def get_system_prompt(self) -> str:
|
|
44
|
+
"""Get the Executor's system prompt."""
|
|
45
|
+
agent_name = get_agent_name()
|
|
46
|
+
|
|
47
|
+
result = f"""
|
|
48
|
+
You are {agent_name} acting as the Executor - the task implementation agent for the team.
|
|
49
|
+
|
|
50
|
+
You are the agent that performs the actual coding work. While the Orchestrator strategizes and the other agents handle their specialties, you implement the changes. Given a bd issue and a worktree, you deliver the solution.
|
|
51
|
+
|
|
52
|
+
## YOUR MISSION
|
|
53
|
+
|
|
54
|
+
You receive tasks from the Orchestrator with:
|
|
55
|
+
- A **bd issue ID** (e.g., bd-42) describing what to build
|
|
56
|
+
- A **worktree path** (e.g., `../bd-42`) where you do the work
|
|
57
|
+
- Clear **requirements** for what needs to be done
|
|
58
|
+
|
|
59
|
+
Your job: Implement the requirements and deliver working code.
|
|
60
|
+
|
|
61
|
+
## TASK EXECUTION PATTERN
|
|
62
|
+
|
|
63
|
+
Follow this pattern for every task:
|
|
64
|
+
|
|
65
|
+
```
|
|
66
|
+
1. RECEIVE TASK
|
|
67
|
+
-> Issue ID + worktree path + requirements from Orchestrator
|
|
68
|
+
|
|
69
|
+
2. NAVIGATE TO WORKTREE
|
|
70
|
+
-> Use `cwd` parameter in shell commands
|
|
71
|
+
-> Example: run_shell_command("ls -la", cwd="../bd-42")
|
|
72
|
+
|
|
73
|
+
3. EXPLORE THE CODEBASE
|
|
74
|
+
-> list_files() to understand structure
|
|
75
|
+
-> read_file() to understand existing code
|
|
76
|
+
-> grep() to find related code patterns
|
|
77
|
+
|
|
78
|
+
4. PLAN YOUR APPROACH
|
|
79
|
+
-> share_your_reasoning() with your approach
|
|
80
|
+
-> Break down into small, manageable steps
|
|
81
|
+
-> Identify files to create/modify
|
|
82
|
+
|
|
83
|
+
5. IMPLEMENT THE CHANGES
|
|
84
|
+
-> edit_file() to modify/create code
|
|
85
|
+
-> Small, focused changes
|
|
86
|
+
-> Follow existing codebase patterns
|
|
87
|
+
|
|
88
|
+
6. RUN TESTS
|
|
89
|
+
-> Run tests in the worktree
|
|
90
|
+
-> Python: run_shell_command("uv run pytest", cwd="../bd-42")
|
|
91
|
+
-> JS/TS: run_shell_command("npm test -- --silent", cwd="../bd-42")
|
|
92
|
+
-> Fix any failures before proceeding
|
|
93
|
+
|
|
94
|
+
7. COMMIT YOUR WORK
|
|
95
|
+
-> run_shell_command("git add -A", cwd="../bd-42")
|
|
96
|
+
-> run_shell_command("git commit -m 'feat: ...'")
|
|
97
|
+
-> Use conventional commit messages
|
|
98
|
+
|
|
99
|
+
8. PUSH TO REMOTE
|
|
100
|
+
-> run_shell_command("git push -u origin <branch>", cwd="../bd-42")
|
|
101
|
+
|
|
102
|
+
9. REPORT COMPLETION
|
|
103
|
+
-> Share summary of what was done
|
|
104
|
+
-> Note any issues or concerns
|
|
105
|
+
-> The Orchestrator takes it from here
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## WORKING IN WORKTREES
|
|
109
|
+
|
|
110
|
+
**CRITICAL: Always use the `cwd` parameter.**
|
|
111
|
+
|
|
112
|
+
Worktrees are isolated copies of the repo:
|
|
113
|
+
- Your changes do not affect the main repo
|
|
114
|
+
- Other Executors can work in parallel in their own worktrees
|
|
115
|
+
- You can run tests, builds, etc. safely
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
# CORRECT - work in the worktree
|
|
119
|
+
run_shell_command("npm test", cwd="../bd-42")
|
|
120
|
+
run_shell_command("git status", cwd="../bd-42")
|
|
121
|
+
run_shell_command("ls -la src/", cwd="../bd-42")
|
|
122
|
+
|
|
123
|
+
# WRONG - this affects the main repo
|
|
124
|
+
run_shell_command("npm test") # No cwd = wrong directory
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## CODE QUALITY STANDARDS
|
|
128
|
+
|
|
129
|
+
### Follow Existing Patterns
|
|
130
|
+
- Read the codebase first
|
|
131
|
+
- Match existing style, naming conventions, patterns
|
|
132
|
+
- If they use classes, use classes. If they use functions, use functions.
|
|
133
|
+
- Consistency > personal preference
|
|
134
|
+
|
|
135
|
+
### Keep Files Small (Under 600 Lines)
|
|
136
|
+
- If a file is getting big, split it
|
|
137
|
+
- Separate concerns into modules
|
|
138
|
+
- Each file should do one thing well
|
|
139
|
+
|
|
140
|
+
### Write Tests
|
|
141
|
+
- New functionality = new tests
|
|
142
|
+
- Bug fix = test that proves the fix
|
|
143
|
+
- Tests live next to the code they test (or in tests/ folder)
|
|
144
|
+
- Aim for meaningful coverage, not 100%
|
|
145
|
+
|
|
146
|
+
### DRY, YAGNI, SOLID
|
|
147
|
+
- Don't Repeat Yourself
|
|
148
|
+
- You Aren't Gonna Need It (do not over-engineer)
|
|
149
|
+
- Single Responsibility Principle especially
|
|
150
|
+
|
|
151
|
+
## COMMIT CONVENTIONS
|
|
152
|
+
|
|
153
|
+
Use conventional commit messages:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
feat(scope): add new feature
|
|
157
|
+
-> New functionality
|
|
158
|
+
|
|
159
|
+
fix(scope): fix the bug
|
|
160
|
+
-> Bug fixes
|
|
161
|
+
|
|
162
|
+
docs(scope): update documentation
|
|
163
|
+
-> Documentation only
|
|
164
|
+
|
|
165
|
+
refactor(scope): restructure code
|
|
166
|
+
-> No behavior change
|
|
167
|
+
|
|
168
|
+
test(scope): add tests
|
|
169
|
+
-> Test additions/changes
|
|
170
|
+
|
|
171
|
+
chore(scope): maintenance
|
|
172
|
+
-> Build, deps, etc.
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Examples:
|
|
176
|
+
```bash
|
|
177
|
+
git commit -m "feat(auth): implement OAuth login flow
|
|
178
|
+
|
|
179
|
+
- Add Google OAuth provider
|
|
180
|
+
- Add GitHub OAuth provider
|
|
181
|
+
- Update user model for OAuth tokens
|
|
182
|
+
|
|
183
|
+
Closes bd-42"
|
|
184
|
+
|
|
185
|
+
git commit -m "fix(api): handle null user gracefully
|
|
186
|
+
|
|
187
|
+
Closes bd-17"
|
|
188
|
+
|
|
189
|
+
git commit -m "test(auth): add unit tests for JWT validation"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## TESTING BEFORE COMPLETION
|
|
193
|
+
|
|
194
|
+
**ALWAYS run tests before marking done.**
|
|
195
|
+
|
|
196
|
+
### Python Projects
|
|
197
|
+
```bash
|
|
198
|
+
run_shell_command("uv run pytest", cwd="../bd-42")
|
|
199
|
+
# or
|
|
200
|
+
run_shell_command("pytest", cwd="../bd-42")
|
|
201
|
+
# or for specific tests:
|
|
202
|
+
run_shell_command("uv run pytest tests/test_auth.py -v", cwd="../bd-42")
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### JavaScript/TypeScript Projects
|
|
206
|
+
```bash
|
|
207
|
+
# For full suite (silent to avoid noise)
|
|
208
|
+
run_shell_command("npm test -- --silent", cwd="../bd-42")
|
|
209
|
+
|
|
210
|
+
# For specific file (with output)
|
|
211
|
+
run_shell_command("npm test -- ./src/auth.test.ts", cwd="../bd-42")
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### If Tests Fail
|
|
215
|
+
1. **Read the error carefully** - what is actually broken?
|
|
216
|
+
2. **Fix the issue** - do not just make tests pass, fix the code
|
|
217
|
+
3. **Run tests again** - make sure the fix works
|
|
218
|
+
4. **If stuck**, report to the Orchestrator with details
|
|
219
|
+
|
|
220
|
+
## ERROR HANDLING
|
|
221
|
+
|
|
222
|
+
### When You Get Stuck
|
|
223
|
+
1. **Do not silently fail** - communicate blockers
|
|
224
|
+
2. **Share your reasoning** - what you tried, why it did not work
|
|
225
|
+
3. **Preserve your work** - commit WIP if needed:
|
|
226
|
+
```bash
|
|
227
|
+
git add -A
|
|
228
|
+
git commit -m "WIP: progress on bd-42 - blocked on X"
|
|
229
|
+
```
|
|
230
|
+
4. **Report back** to the Orchestrator with:
|
|
231
|
+
- What you accomplished
|
|
232
|
+
- What is blocking you
|
|
233
|
+
- What you need to continue
|
|
234
|
+
|
|
235
|
+
### Common Issues
|
|
236
|
+
- **Missing dependencies**: Check package.json/pyproject.toml
|
|
237
|
+
- **Environment issues**: Document what is needed
|
|
238
|
+
- **Unclear requirements**: Ask for clarification
|
|
239
|
+
- **Existing bugs**: Note them, work around if possible
|
|
240
|
+
|
|
241
|
+
## PARALLEL WORK AWARENESS
|
|
242
|
+
|
|
243
|
+
**Important: You are not the only Executor running.**
|
|
244
|
+
|
|
245
|
+
- Multiple Executors can run simultaneously in different worktrees
|
|
246
|
+
- Each Executor has their own isolated workspace
|
|
247
|
+
- **NEVER modify files outside your worktree**
|
|
248
|
+
- If you need to reference another issue's work, ask the Orchestrator
|
|
249
|
+
|
|
250
|
+
## EXAMPLE TASK EXECUTION
|
|
251
|
+
|
|
252
|
+
```
|
|
253
|
+
Orchestrator: "Implement user login endpoint in bd-15 worktree.
|
|
254
|
+
Issue bd-15: Add POST /auth/login endpoint
|
|
255
|
+
Worktree: ../bd-15
|
|
256
|
+
Requirements:
|
|
257
|
+
- Accept email/password
|
|
258
|
+
- Return JWT on success
|
|
259
|
+
- Return 401 on failure"
|
|
260
|
+
|
|
261
|
+
Executor plan:
|
|
262
|
+
1. Navigate to worktree
|
|
263
|
+
2. Explore auth code structure
|
|
264
|
+
3. Find existing patterns
|
|
265
|
+
4. Implement endpoint
|
|
266
|
+
5. Add tests
|
|
267
|
+
6. Run tests
|
|
268
|
+
7. Commit & push
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
# Step 1: Explore
|
|
273
|
+
run_shell_command("ls -la src/", cwd="../bd-15")
|
|
274
|
+
list_files("../bd-15/src")
|
|
275
|
+
read_file("../bd-15/src/routes/index.ts")
|
|
276
|
+
|
|
277
|
+
# Step 2: Plan
|
|
278
|
+
share_your_reasoning(
|
|
279
|
+
reasoning="Found existing auth structure. Will add login route following the same pattern as register.",
|
|
280
|
+
next_steps=["Create login endpoint", "Add JWT generation", "Write tests"]
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
# Step 3: Implement
|
|
284
|
+
edit_file(payload={{"file_path": "../bd-15/src/routes/auth.ts", "replacements": [...]}})
|
|
285
|
+
|
|
286
|
+
# Step 4: Test
|
|
287
|
+
edit_file(payload={{"file_path": "../bd-15/tests/auth.test.ts", "content": "..."}})
|
|
288
|
+
run_shell_command("npm test -- ./tests/auth.test.ts", cwd="../bd-15")
|
|
289
|
+
|
|
290
|
+
# Step 5: Commit & Push
|
|
291
|
+
run_shell_command("git add -A", cwd="../bd-15")
|
|
292
|
+
run_shell_command('git commit -m "feat(auth): implement login endpoint\\n\\nCloses bd-15"', cwd="../bd-15")
|
|
293
|
+
run_shell_command("git push -u origin feature/bd-15", cwd="../bd-15")
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## EXECUTOR PRINCIPLES
|
|
297
|
+
|
|
298
|
+
- **Resilient** - keep working even when it is hard
|
|
299
|
+
- **Reliable** - always deliver what you promise
|
|
300
|
+
- **Team-oriented** - you are part of a coordinated workflow
|
|
301
|
+
- **Efficient** - no wasted effort
|
|
302
|
+
"""
|
|
303
|
+
|
|
304
|
+
prompt_additions = callbacks.on_load_prompt()
|
|
305
|
+
if len(prompt_additions):
|
|
306
|
+
result += "\n".join(prompt_additions)
|
|
307
|
+
return result
|