auto-coder 0.1.400__py3-none-any.whl → 2.0.0__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.
Potentially problematic release.
This version of auto-coder might be problematic. Click here for more details.
- auto_coder-2.0.0.dist-info/LICENSE +158 -0
- auto_coder-2.0.0.dist-info/METADATA +558 -0
- auto_coder-2.0.0.dist-info/RECORD +795 -0
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/entry_points.txt +3 -3
- autocoder/__init__.py +31 -0
- autocoder/agent/auto_filegroup.py +32 -13
- autocoder/agent/auto_learn_from_commit.py +9 -1
- autocoder/agent/base_agentic/__init__.py +3 -0
- autocoder/agent/base_agentic/agent_hub.py +1 -1
- autocoder/agent/base_agentic/base_agent.py +235 -136
- autocoder/agent/base_agentic/default_tools.py +119 -118
- autocoder/agent/base_agentic/test_base_agent.py +1 -1
- autocoder/agent/base_agentic/tool_registry.py +32 -20
- autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +25 -4
- autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
- autocoder/agent/base_agentic/types.py +42 -0
- autocoder/agent/entry_command_agent/chat.py +73 -59
- autocoder/auto_coder.py +31 -40
- autocoder/auto_coder_rag.py +11 -1084
- autocoder/auto_coder_runner.py +1029 -2310
- autocoder/auto_coder_terminal.py +26 -0
- autocoder/auto_coder_terminal_v3.py +190 -0
- autocoder/chat/conf_command.py +224 -124
- autocoder/chat/models_command.py +361 -299
- autocoder/chat/rules_command.py +79 -31
- autocoder/chat_auto_coder.py +1021 -372
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +26 -9
- autocoder/commands/auto_web.py +1 -1
- autocoder/commands/tools.py +44 -44
- autocoder/common/__init__.py +150 -128
- autocoder/common/ac_style_command_parser/__init__.py +39 -2
- autocoder/common/ac_style_command_parser/config.py +422 -0
- autocoder/common/ac_style_command_parser/parser.py +292 -78
- autocoder/common/ac_style_command_parser/test_parser.py +241 -16
- autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
- autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
- autocoder/common/action_yml_file_manager.py +25 -13
- autocoder/common/agent_events/__init__.py +52 -0
- autocoder/common/agent_events/agent_event_emitter.py +193 -0
- autocoder/common/agent_events/event_factory.py +177 -0
- autocoder/common/agent_events/examples.py +307 -0
- autocoder/common/agent_events/types.py +113 -0
- autocoder/common/agent_events/utils.py +68 -0
- autocoder/common/agent_hooks/__init__.py +44 -0
- autocoder/common/agent_hooks/examples.py +582 -0
- autocoder/common/agent_hooks/hook_executor.py +217 -0
- autocoder/common/agent_hooks/hook_manager.py +288 -0
- autocoder/common/agent_hooks/types.py +133 -0
- autocoder/common/agent_hooks/utils.py +99 -0
- autocoder/common/agent_query_queue/queue_executor.py +324 -0
- autocoder/common/agent_query_queue/queue_manager.py +325 -0
- autocoder/common/agents/__init__.py +11 -0
- autocoder/common/agents/agent_manager.py +323 -0
- autocoder/common/agents/agent_parser.py +189 -0
- autocoder/common/agents/example_usage.py +344 -0
- autocoder/common/agents/integration_example.py +330 -0
- autocoder/common/agents/test_agent_parser.py +545 -0
- autocoder/common/async_utils.py +101 -0
- autocoder/common/auto_coder_lang.py +23 -972
- autocoder/common/autocoderargs_parser/__init__.py +14 -0
- autocoder/common/autocoderargs_parser/parser.py +184 -0
- autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
- autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
- autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
- autocoder/common/autocoderargs_parser/token_parser.py +290 -0
- autocoder/common/buildin_tokenizer.py +2 -4
- autocoder/common/code_auto_generate.py +149 -74
- autocoder/common/code_auto_generate_diff.py +163 -70
- autocoder/common/code_auto_generate_editblock.py +179 -89
- autocoder/common/code_auto_generate_strict_diff.py +167 -72
- autocoder/common/code_auto_merge_editblock.py +13 -6
- autocoder/common/code_modification_ranker.py +1 -1
- autocoder/common/command_completer.py +3 -3
- autocoder/common/command_file_manager/manager.py +183 -47
- autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
- autocoder/common/command_templates.py +1 -1
- autocoder/common/conf_utils.py +2 -4
- autocoder/common/conversations/config.py +11 -3
- autocoder/common/conversations/get_conversation_manager.py +100 -2
- autocoder/common/conversations/llm_stats_models.py +264 -0
- autocoder/common/conversations/manager.py +112 -28
- autocoder/common/conversations/models.py +16 -2
- autocoder/common/conversations/storage/index_manager.py +134 -10
- autocoder/common/core_config/__init__.py +63 -0
- autocoder/common/core_config/agentic_mode_manager.py +109 -0
- autocoder/common/core_config/base_manager.py +123 -0
- autocoder/common/core_config/compatibility.py +151 -0
- autocoder/common/core_config/config_manager.py +156 -0
- autocoder/common/core_config/conversation_manager.py +31 -0
- autocoder/common/core_config/exclude_manager.py +72 -0
- autocoder/common/core_config/file_manager.py +177 -0
- autocoder/common/core_config/human_as_model_manager.py +129 -0
- autocoder/common/core_config/lib_manager.py +54 -0
- autocoder/common/core_config/main_manager.py +81 -0
- autocoder/common/core_config/mode_manager.py +126 -0
- autocoder/common/core_config/models.py +70 -0
- autocoder/common/core_config/test_memory_manager.py +1056 -0
- autocoder/common/env_manager.py +282 -0
- autocoder/common/env_manager_usage_example.py +211 -0
- autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
- autocoder/common/file_checkpoint/manager.py +264 -48
- autocoder/common/file_checkpoint/test_backup.py +1 -18
- autocoder/common/file_checkpoint/test_manager.py +270 -1
- autocoder/common/file_checkpoint/test_store.py +1 -17
- autocoder/common/file_handler/__init__.py +23 -0
- autocoder/common/file_handler/active_context_handler.py +159 -0
- autocoder/common/file_handler/add_files_handler.py +409 -0
- autocoder/common/file_handler/chat_handler.py +180 -0
- autocoder/common/file_handler/coding_handler.py +401 -0
- autocoder/common/file_handler/commit_handler.py +200 -0
- autocoder/common/file_handler/lib_handler.py +156 -0
- autocoder/common/file_handler/list_files_handler.py +111 -0
- autocoder/common/file_handler/mcp_handler.py +268 -0
- autocoder/common/file_handler/models_handler.py +493 -0
- autocoder/common/file_handler/remove_files_handler.py +172 -0
- autocoder/common/file_monitor/test_file_monitor.py +307 -0
- autocoder/common/git_utils.py +51 -10
- autocoder/common/global_cancel.py +15 -6
- autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
- autocoder/common/international/__init__.py +31 -0
- autocoder/common/international/demo_international.py +92 -0
- autocoder/common/international/message_manager.py +157 -0
- autocoder/common/international/messages/__init__.py +56 -0
- autocoder/common/international/messages/async_command_messages.py +507 -0
- autocoder/common/international/messages/auto_coder_messages.py +2208 -0
- autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
- autocoder/common/international/messages/command_help_messages.py +986 -0
- autocoder/common/international/messages/conversation_command_messages.py +191 -0
- autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
- autocoder/common/international/messages/queue_command_messages.py +751 -0
- autocoder/common/international/messages/rules_command_messages.py +77 -0
- autocoder/common/international/messages/sdk_messages.py +1707 -0
- autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
- autocoder/common/international/messages/tool_display_messages.py +1212 -0
- autocoder/common/international/messages/workflow_exception_messages.py +473 -0
- autocoder/common/international/test_international.py +612 -0
- autocoder/common/linter_core/__init__.py +28 -0
- autocoder/common/linter_core/base_linter.py +61 -0
- autocoder/common/linter_core/config_loader.py +271 -0
- autocoder/common/linter_core/formatters/__init__.py +0 -0
- autocoder/common/linter_core/formatters/base_formatter.py +38 -0
- autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
- autocoder/common/linter_core/linter.py +166 -0
- autocoder/common/linter_core/linter_factory.py +216 -0
- autocoder/common/linter_core/linter_manager.py +333 -0
- autocoder/common/linter_core/linters/__init__.py +9 -0
- autocoder/common/linter_core/linters/java_linter.py +342 -0
- autocoder/common/linter_core/linters/python_linter.py +115 -0
- autocoder/common/linter_core/linters/typescript_linter.py +119 -0
- autocoder/common/linter_core/models/__init__.py +7 -0
- autocoder/common/linter_core/models/lint_result.py +91 -0
- autocoder/common/linter_core/models.py +33 -0
- autocoder/common/linter_core/tests/__init__.py +3 -0
- autocoder/common/linter_core/tests/test_config_loader.py +323 -0
- autocoder/common/linter_core/tests/test_config_loading.py +308 -0
- autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
- autocoder/common/linter_core/tests/test_formatters.py +147 -0
- autocoder/common/linter_core/tests/test_integration.py +317 -0
- autocoder/common/linter_core/tests/test_java_linter.py +496 -0
- autocoder/common/linter_core/tests/test_linters.py +265 -0
- autocoder/common/linter_core/tests/test_models.py +81 -0
- autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
- autocoder/common/linter_core/tests/verify_fixes.py +183 -0
- autocoder/common/llm_friendly_package/__init__.py +31 -0
- autocoder/common/llm_friendly_package/base_manager.py +102 -0
- autocoder/common/llm_friendly_package/docs_manager.py +121 -0
- autocoder/common/llm_friendly_package/library_manager.py +171 -0
- autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
- autocoder/common/llm_friendly_package/models.py +40 -0
- autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
- autocoder/common/llms/__init__.py +15 -0
- autocoder/common/llms/demo_error_handling.py +85 -0
- autocoder/common/llms/factory.py +142 -0
- autocoder/common/llms/manager.py +264 -0
- autocoder/common/llms/pricing.py +121 -0
- autocoder/common/llms/registry.py +288 -0
- autocoder/common/llms/schema.py +77 -0
- autocoder/common/llms/simple_demo.py +45 -0
- autocoder/common/llms/test_quick_model.py +116 -0
- autocoder/common/llms/test_remove_functionality.py +182 -0
- autocoder/common/llms/tests/__init__.py +1 -0
- autocoder/common/llms/tests/test_manager.py +330 -0
- autocoder/common/llms/tests/test_registry.py +364 -0
- autocoder/common/mcp_tools/__init__.py +62 -0
- autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
- autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
- autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
- autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
- autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
- autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
- autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
- autocoder/common/mcp_tools/verify_functionality.py +202 -0
- autocoder/common/model_speed_tester.py +32 -26
- autocoder/common/priority_directory_finder/__init__.py +142 -0
- autocoder/common/priority_directory_finder/examples.py +230 -0
- autocoder/common/priority_directory_finder/finder.py +283 -0
- autocoder/common/priority_directory_finder/models.py +236 -0
- autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
- autocoder/common/project_scanner/__init__.py +18 -0
- autocoder/common/project_scanner/compat.py +77 -0
- autocoder/common/project_scanner/scanner.py +436 -0
- autocoder/common/project_tracker/__init__.py +27 -0
- autocoder/common/project_tracker/api.py +228 -0
- autocoder/common/project_tracker/demo.py +272 -0
- autocoder/common/project_tracker/tracker.py +487 -0
- autocoder/common/project_tracker/types.py +53 -0
- autocoder/common/pruner/__init__.py +67 -0
- autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
- autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
- autocoder/common/pruner/conversation_message_ids_api.py +386 -0
- autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
- autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
- autocoder/common/pruner/conversation_normalizer.py +347 -0
- autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
- autocoder/common/pruner/test_context_pruner.py +546 -0
- autocoder/common/pruner/test_conversation_normalizer.py +502 -0
- autocoder/common/pruner/test_tool_content_detector.py +324 -0
- autocoder/common/pruner/tool_content_detector.py +227 -0
- autocoder/common/pruner/tools/__init__.py +18 -0
- autocoder/common/pruner/tools/query_message_ids.py +264 -0
- autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
- autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
- autocoder/common/pull_requests/__init__.py +9 -1
- autocoder/common/pull_requests/utils.py +122 -1
- autocoder/common/rag_manager/rag_manager.py +36 -40
- autocoder/common/rulefiles/__init__.py +53 -1
- autocoder/common/rulefiles/api.py +250 -0
- autocoder/common/rulefiles/core/__init__.py +14 -0
- autocoder/common/rulefiles/core/manager.py +241 -0
- autocoder/common/rulefiles/core/selector.py +805 -0
- autocoder/common/rulefiles/models/__init__.py +20 -0
- autocoder/common/rulefiles/models/index.py +16 -0
- autocoder/common/rulefiles/models/init_rule.py +18 -0
- autocoder/common/rulefiles/models/rule_file.py +18 -0
- autocoder/common/rulefiles/models/rule_relevance.py +14 -0
- autocoder/common/rulefiles/models/summary.py +16 -0
- autocoder/common/rulefiles/test_rulefiles.py +776 -0
- autocoder/common/rulefiles/utils/__init__.py +34 -0
- autocoder/common/rulefiles/utils/monitor.py +86 -0
- autocoder/common/rulefiles/utils/parser.py +230 -0
- autocoder/common/save_formatted_log.py +67 -10
- autocoder/common/search_replace.py +8 -1
- autocoder/common/search_replace_patch/__init__.py +24 -0
- autocoder/common/search_replace_patch/base.py +115 -0
- autocoder/common/search_replace_patch/manager.py +248 -0
- autocoder/common/search_replace_patch/patch_replacer.py +304 -0
- autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
- autocoder/common/search_replace_patch/string_replacer.py +181 -0
- autocoder/common/search_replace_patch/tests/__init__.py +3 -0
- autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
- autocoder/common/search_replace_patch/tests/test_base.py +188 -0
- autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
- autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
- autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
- autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
- autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
- autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
- autocoder/common/shell_commands/__init__.py +197 -0
- autocoder/common/shell_commands/background_process_notifier.py +346 -0
- autocoder/common/shell_commands/command_executor.py +1127 -0
- autocoder/common/shell_commands/error_recovery.py +541 -0
- autocoder/common/shell_commands/exceptions.py +120 -0
- autocoder/common/shell_commands/interactive_executor.py +476 -0
- autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
- autocoder/common/shell_commands/interactive_process.py +744 -0
- autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
- autocoder/common/shell_commands/monitoring.py +529 -0
- autocoder/common/shell_commands/process_cleanup.py +386 -0
- autocoder/common/shell_commands/process_manager.py +606 -0
- autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
- autocoder/common/shell_commands/tests/__init__.py +6 -0
- autocoder/common/shell_commands/tests/conftest.py +118 -0
- autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
- autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
- autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
- autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
- autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
- autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
- autocoder/common/shell_commands/tests/test_integration.py +664 -0
- autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
- autocoder/common/shell_commands/tests/test_performance.py +632 -0
- autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
- autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
- autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
- autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
- autocoder/common/shell_commands/timeout_config.py +315 -0
- autocoder/common/shell_commands/timeout_manager.py +352 -0
- autocoder/common/terminal_paste/__init__.py +14 -0
- autocoder/common/terminal_paste/demo.py +145 -0
- autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
- autocoder/common/terminal_paste/paste_handler.py +200 -0
- autocoder/common/terminal_paste/paste_manager.py +118 -0
- autocoder/common/terminal_paste/tests/__init__.py +1 -0
- autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
- autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
- autocoder/common/terminal_paste/utils.py +163 -0
- autocoder/common/test_autocoder_args.py +232 -0
- autocoder/common/test_env_manager.py +173 -0
- autocoder/common/test_env_manager_integration.py +159 -0
- autocoder/common/text_similarity/__init__.py +9 -0
- autocoder/common/text_similarity/demo.py +216 -0
- autocoder/common/text_similarity/examples.py +266 -0
- autocoder/common/text_similarity/test_text_similarity.py +306 -0
- autocoder/common/text_similarity/text_similarity.py +194 -0
- autocoder/common/text_similarity/utils.py +125 -0
- autocoder/common/todos/__init__.py +61 -0
- autocoder/common/todos/cache/__init__.py +16 -0
- autocoder/common/todos/cache/base_cache.py +89 -0
- autocoder/common/todos/cache/cache_manager.py +228 -0
- autocoder/common/todos/cache/memory_cache.py +225 -0
- autocoder/common/todos/config.py +155 -0
- autocoder/common/todos/exceptions.py +35 -0
- autocoder/common/todos/get_todo_manager.py +161 -0
- autocoder/common/todos/manager.py +537 -0
- autocoder/common/todos/models.py +239 -0
- autocoder/common/todos/storage/__init__.py +14 -0
- autocoder/common/todos/storage/base_storage.py +76 -0
- autocoder/common/todos/storage/file_storage.py +278 -0
- autocoder/common/tokens/__init__.py +15 -0
- autocoder/common/tokens/counter.py +44 -2
- autocoder/common/tools_manager/__init__.py +17 -0
- autocoder/common/tools_manager/examples.py +162 -0
- autocoder/common/tools_manager/manager.py +385 -0
- autocoder/common/tools_manager/models.py +39 -0
- autocoder/common/tools_manager/test_tools_manager.py +303 -0
- autocoder/common/tools_manager/utils.py +191 -0
- autocoder/common/v2/agent/agentic_callbacks.py +270 -0
- autocoder/common/v2/agent/agentic_edit.py +2729 -2052
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
- autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
- autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
- autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
- autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
- autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
- autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
- autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
- autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
- autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
- autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
- autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
- autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
- autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
- autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
- autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
- autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
- autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
- autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
- autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
- autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
- autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
- autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
- autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
- autocoder/common/v2/agent/agentic_edit_types.py +386 -10
- autocoder/common/v2/agent/runner/__init__.py +31 -0
- autocoder/common/v2/agent/runner/base_runner.py +92 -0
- autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
- autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
- autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
- autocoder/common/v2/agent/runner/tool_display.py +589 -0
- autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
- autocoder/common/v2/agent/test_agentic_edit.py +194 -0
- autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
- autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
- autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
- autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
- autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
- autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
- autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
- autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
- autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
- autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
- autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
- autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
- autocoder/common/v2/code_auto_generate.py +136 -78
- autocoder/common/v2/code_auto_generate_diff.py +135 -79
- autocoder/common/v2/code_auto_generate_editblock.py +174 -99
- autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
- autocoder/common/v2/code_auto_merge.py +1 -1
- autocoder/common/v2/code_auto_merge_editblock.py +13 -1
- autocoder/common/v2/code_diff_manager.py +3 -3
- autocoder/common/v2/code_editblock_manager.py +4 -14
- autocoder/common/v2/code_manager.py +1 -1
- autocoder/common/v2/code_strict_diff_manager.py +2 -2
- autocoder/common/wrap_llm_hint/__init__.py +10 -0
- autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
- autocoder/common/wrap_llm_hint/utils.py +432 -0
- autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
- autocoder/completer/__init__.py +8 -0
- autocoder/completer/command_completer_v2.py +1051 -0
- autocoder/default_project/__init__.py +501 -0
- autocoder/dispacher/__init__.py +4 -12
- autocoder/dispacher/actions/action.py +165 -7
- autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
- autocoder/index/entry.py +117 -125
- autocoder/{agent → index/filter}/agentic_filter.py +323 -334
- autocoder/index/filter/normal_filter.py +5 -11
- autocoder/index/filter/quick_filter.py +1 -1
- autocoder/index/index.py +36 -9
- autocoder/index/tests/__init__.py +1 -0
- autocoder/index/tests/run_tests.py +195 -0
- autocoder/index/tests/test_entry.py +303 -0
- autocoder/index/tests/test_index_manager.py +314 -0
- autocoder/index/tests/test_module_integration.py +300 -0
- autocoder/index/tests/test_symbols_utils.py +183 -0
- autocoder/inner/__init__.py +4 -0
- autocoder/inner/agentic.py +932 -0
- autocoder/inner/async_command_handler.py +992 -0
- autocoder/inner/conversation_command_handlers.py +623 -0
- autocoder/inner/merge_command_handler.py +213 -0
- autocoder/inner/queue_command_handler.py +684 -0
- autocoder/models.py +95 -266
- autocoder/plugins/git_helper_plugin.py +31 -29
- autocoder/plugins/token_helper_plugin.py +156 -37
- autocoder/pyproject/__init__.py +32 -29
- autocoder/rag/agentic_rag.py +215 -75
- autocoder/rag/cache/simple_cache.py +1 -2
- autocoder/rag/loaders/image_loader.py +1 -1
- autocoder/rag/long_context_rag.py +42 -26
- autocoder/rag/qa_conversation_strategy.py +1 -1
- autocoder/rag/terminal/__init__.py +17 -0
- autocoder/rag/terminal/args.py +581 -0
- autocoder/rag/terminal/bootstrap.py +61 -0
- autocoder/rag/terminal/command_handlers.py +653 -0
- autocoder/rag/terminal/formatters/__init__.py +20 -0
- autocoder/rag/terminal/formatters/base.py +70 -0
- autocoder/rag/terminal/formatters/json_format.py +66 -0
- autocoder/rag/terminal/formatters/stream_json.py +95 -0
- autocoder/rag/terminal/formatters/text.py +28 -0
- autocoder/rag/terminal/init.py +120 -0
- autocoder/rag/terminal/utils.py +106 -0
- autocoder/rag/test_agentic_rag.py +389 -0
- autocoder/rag/test_doc_filter.py +3 -3
- autocoder/rag/test_long_context_rag.py +1 -1
- autocoder/rag/test_token_limiter.py +517 -10
- autocoder/rag/token_counter.py +3 -0
- autocoder/rag/token_limiter.py +19 -15
- autocoder/rag/tools/__init__.py +26 -2
- autocoder/rag/tools/bochaai_example.py +343 -0
- autocoder/rag/tools/bochaai_sdk.py +541 -0
- autocoder/rag/tools/metaso_example.py +268 -0
- autocoder/rag/tools/metaso_sdk.py +417 -0
- autocoder/rag/tools/recall_tool.py +28 -7
- autocoder/rag/tools/run_integration_tests.py +204 -0
- autocoder/rag/tools/test_all_providers.py +318 -0
- autocoder/rag/tools/test_bochaai_integration.py +482 -0
- autocoder/rag/tools/test_final_integration.py +215 -0
- autocoder/rag/tools/test_metaso_integration.py +424 -0
- autocoder/rag/tools/test_metaso_real.py +171 -0
- autocoder/rag/tools/test_web_crawl_tool.py +639 -0
- autocoder/rag/tools/test_web_search_tool.py +509 -0
- autocoder/rag/tools/todo_read_tool.py +202 -0
- autocoder/rag/tools/todo_write_tool.py +412 -0
- autocoder/rag/tools/web_crawl_tool.py +634 -0
- autocoder/rag/tools/web_search_tool.py +558 -0
- autocoder/rag/tools/web_tools_example.py +119 -0
- autocoder/rag/types.py +16 -0
- autocoder/rag/variable_holder.py +4 -2
- autocoder/rags.py +86 -79
- autocoder/regexproject/__init__.py +23 -21
- autocoder/run_context.py +9 -0
- autocoder/sdk/__init__.py +50 -161
- autocoder/sdk/api.py +370 -0
- autocoder/sdk/async_runner/__init__.py +26 -0
- autocoder/sdk/async_runner/async_executor.py +650 -0
- autocoder/sdk/async_runner/async_handler.py +356 -0
- autocoder/sdk/async_runner/markdown_processor.py +595 -0
- autocoder/sdk/async_runner/task_metadata.py +284 -0
- autocoder/sdk/async_runner/worktree_manager.py +438 -0
- autocoder/sdk/cli/__init__.py +2 -5
- autocoder/sdk/cli/formatters.py +28 -204
- autocoder/sdk/cli/handlers.py +77 -44
- autocoder/sdk/cli/main.py +158 -170
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -267
- autocoder/sdk/core/bridge.py +298 -118
- autocoder/sdk/exceptions.py +18 -12
- autocoder/sdk/formatters/__init__.py +19 -0
- autocoder/sdk/formatters/input.py +64 -0
- autocoder/sdk/formatters/output.py +247 -0
- autocoder/sdk/formatters/stream.py +54 -0
- autocoder/sdk/models/__init__.py +6 -5
- autocoder/sdk/models/options.py +55 -18
- autocoder/sdk/utils/formatters.py +27 -195
- autocoder/suffixproject/__init__.py +28 -25
- autocoder/terminal/__init__.py +14 -0
- autocoder/terminal/app.py +454 -0
- autocoder/terminal/args.py +32 -0
- autocoder/terminal/bootstrap.py +178 -0
- autocoder/terminal/command_processor.py +521 -0
- autocoder/terminal/command_registry.py +57 -0
- autocoder/terminal/help.py +97 -0
- autocoder/terminal/tasks/__init__.py +5 -0
- autocoder/terminal/tasks/background.py +77 -0
- autocoder/terminal/tasks/task_event.py +70 -0
- autocoder/terminal/ui/__init__.py +13 -0
- autocoder/terminal/ui/completer.py +268 -0
- autocoder/terminal/ui/keybindings.py +75 -0
- autocoder/terminal/ui/session.py +41 -0
- autocoder/terminal/ui/toolbar.py +64 -0
- autocoder/terminal/utils/__init__.py +13 -0
- autocoder/terminal/utils/errors.py +18 -0
- autocoder/terminal/utils/paths.py +19 -0
- autocoder/terminal/utils/shell.py +43 -0
- autocoder/terminal_v3/__init__.py +10 -0
- autocoder/terminal_v3/app.py +201 -0
- autocoder/terminal_v3/handlers/__init__.py +5 -0
- autocoder/terminal_v3/handlers/command_handler.py +131 -0
- autocoder/terminal_v3/models/__init__.py +6 -0
- autocoder/terminal_v3/models/conversation_buffer.py +214 -0
- autocoder/terminal_v3/models/message.py +50 -0
- autocoder/terminal_v3/models/tool_display.py +247 -0
- autocoder/terminal_v3/ui/__init__.py +7 -0
- autocoder/terminal_v3/ui/keybindings.py +56 -0
- autocoder/terminal_v3/ui/layout.py +141 -0
- autocoder/terminal_v3/ui/styles.py +43 -0
- autocoder/tsproject/__init__.py +23 -23
- autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
- autocoder/utils/llms.py +88 -80
- autocoder/utils/math_utils.py +101 -0
- autocoder/utils/model_provider_selector.py +16 -4
- autocoder/utils/operate_config_api.py +33 -5
- autocoder/utils/thread_utils.py +2 -2
- autocoder/version.py +4 -2
- autocoder/workflow_agents/__init__.py +84 -0
- autocoder/workflow_agents/agent.py +143 -0
- autocoder/workflow_agents/exceptions.py +573 -0
- autocoder/workflow_agents/executor.py +489 -0
- autocoder/workflow_agents/loader.py +737 -0
- autocoder/workflow_agents/runner.py +267 -0
- autocoder/workflow_agents/types.py +172 -0
- autocoder/workflow_agents/utils.py +434 -0
- autocoder/workflow_agents/workflow_manager.py +211 -0
- auto_coder-0.1.400.dist-info/METADATA +0 -396
- auto_coder-0.1.400.dist-info/RECORD +0 -425
- auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
- autocoder/auto_coder_server.py +0 -672
- autocoder/benchmark.py +0 -138
- autocoder/common/ac_style_command_parser/example.py +0 -7
- autocoder/common/cleaner.py +0 -31
- autocoder/common/command_completer_v2.py +0 -615
- autocoder/common/directory_cache/__init__.py +0 -1
- autocoder/common/directory_cache/cache.py +0 -192
- autocoder/common/directory_cache/test_cache.py +0 -190
- autocoder/common/file_checkpoint/examples.py +0 -217
- autocoder/common/llm_friendly_package_example.py +0 -138
- autocoder/common/llm_friendly_package_test.py +0 -63
- autocoder/common/pull_requests/test_module.py +0 -1
- autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
- autocoder/common/text.py +0 -30
- autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
- autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
- autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
- autocoder/common/v2/agent/agentic_tool_display.py +0 -183
- autocoder/plugins/dynamic_completion_example.py +0 -148
- autocoder/plugins/sample_plugin.py +0 -160
- autocoder/sdk/cli/__main__.py +0 -26
- autocoder/sdk/cli/completion_wrapper.py +0 -38
- autocoder/sdk/cli/install_completion.py +0 -301
- autocoder/sdk/models/messages.py +0 -209
- autocoder/sdk/session/__init__.py +0 -32
- autocoder/sdk/session/session.py +0 -106
- autocoder/sdk/session/session_manager.py +0 -56
- {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
- /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
|
|
2
|
+
"""
|
|
3
|
+
Agent Parser Module
|
|
4
|
+
|
|
5
|
+
This module provides functionality to parse agent definitions from markdown files.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import re
|
|
9
|
+
from typing import List, Optional, Dict, Any
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
import yaml
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
@dataclass
|
|
16
|
+
class Agent:
|
|
17
|
+
"""Represents an agent definition."""
|
|
18
|
+
name: str
|
|
19
|
+
description: str
|
|
20
|
+
tools: List[str] = field(default_factory=list)
|
|
21
|
+
model: Optional[str] = None
|
|
22
|
+
content: str = ""
|
|
23
|
+
file_path: Optional[Path] = None
|
|
24
|
+
include_rules: bool = False
|
|
25
|
+
|
|
26
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
27
|
+
"""Convert agent to dictionary representation."""
|
|
28
|
+
return {
|
|
29
|
+
'name': self.name,
|
|
30
|
+
'description': self.description,
|
|
31
|
+
'tools': self.tools,
|
|
32
|
+
'model': self.model,
|
|
33
|
+
'content': self.content,
|
|
34
|
+
'file_path': str(self.file_path) if self.file_path else None,
|
|
35
|
+
'include_rules': self.include_rules
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class AgentParser:
|
|
40
|
+
"""Parser for agent definition files."""
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def parse_agent_file(file_path: Path) -> Agent:
|
|
44
|
+
"""
|
|
45
|
+
Parse an agent definition from a markdown file.
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
file_path: Path to the .md file containing agent definition
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
Agent: Parsed agent object
|
|
52
|
+
|
|
53
|
+
Raises:
|
|
54
|
+
ValueError: If the file format is invalid
|
|
55
|
+
"""
|
|
56
|
+
if not file_path.exists():
|
|
57
|
+
raise ValueError(f"Agent file not found: {file_path}")
|
|
58
|
+
|
|
59
|
+
content = file_path.read_text(encoding='utf-8')
|
|
60
|
+
return AgentParser.parse_agent_content(content, file_path)
|
|
61
|
+
|
|
62
|
+
@staticmethod
|
|
63
|
+
def parse_agent_content(content: str, file_path: Optional[Path] = None) -> Agent:
|
|
64
|
+
"""
|
|
65
|
+
Parse agent definition from content string.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
content: The content of the agent definition
|
|
69
|
+
file_path: Optional path to the source file
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Agent: Parsed agent object
|
|
73
|
+
|
|
74
|
+
Raises:
|
|
75
|
+
ValueError: If the content format is invalid
|
|
76
|
+
"""
|
|
77
|
+
# Split content into frontmatter and body
|
|
78
|
+
parts = content.split('---', 2)
|
|
79
|
+
|
|
80
|
+
if len(parts) < 3:
|
|
81
|
+
raise ValueError("Invalid agent file format. Expected YAML frontmatter between --- markers.")
|
|
82
|
+
|
|
83
|
+
# Parse YAML frontmatter
|
|
84
|
+
frontmatter_str = parts[1].strip()
|
|
85
|
+
|
|
86
|
+
# Handle special case: tools: * (fix YAML alias issue)
|
|
87
|
+
# Replace 'tools: *' with 'tools: "*"' to make it a string literal
|
|
88
|
+
frontmatter_str = frontmatter_str.replace('tools: *', 'tools: "*"')
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
frontmatter = yaml.safe_load(frontmatter_str)
|
|
92
|
+
if not isinstance(frontmatter, dict):
|
|
93
|
+
raise ValueError("Frontmatter must be a valid YAML dictionary")
|
|
94
|
+
except yaml.YAMLError as e:
|
|
95
|
+
raise ValueError(f"Failed to parse YAML frontmatter: {e}")
|
|
96
|
+
|
|
97
|
+
# Extract required fields
|
|
98
|
+
name = frontmatter.get('name')
|
|
99
|
+
if not name:
|
|
100
|
+
raise ValueError("Agent definition must include 'name' field")
|
|
101
|
+
|
|
102
|
+
description = frontmatter.get('description')
|
|
103
|
+
if not description:
|
|
104
|
+
raise ValueError("Agent definition must include 'description' field")
|
|
105
|
+
|
|
106
|
+
# Extract optional fields
|
|
107
|
+
tools_str = frontmatter.get('tools', '')
|
|
108
|
+
tools = AgentParser._parse_tools(tools_str)
|
|
109
|
+
|
|
110
|
+
model = frontmatter.get('model')
|
|
111
|
+
include_rules = frontmatter.get('include_rules', False)
|
|
112
|
+
|
|
113
|
+
# The body content (system prompt)
|
|
114
|
+
body_content = parts[2].strip()
|
|
115
|
+
|
|
116
|
+
return Agent(
|
|
117
|
+
name=name,
|
|
118
|
+
description=description,
|
|
119
|
+
tools=tools,
|
|
120
|
+
model=model,
|
|
121
|
+
content=body_content,
|
|
122
|
+
file_path=file_path,
|
|
123
|
+
include_rules=include_rules
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
@staticmethod
|
|
127
|
+
def _parse_tools(tools_str: str) -> List[str]:
|
|
128
|
+
"""
|
|
129
|
+
Parse tools string into a list of tool names.
|
|
130
|
+
|
|
131
|
+
Args:
|
|
132
|
+
tools_str: Comma-separated string of tool names, or "*" for all tools
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
List[str]: List of tool names
|
|
136
|
+
"""
|
|
137
|
+
if not tools_str:
|
|
138
|
+
return []
|
|
139
|
+
|
|
140
|
+
# Handle special case: "*" means all tools
|
|
141
|
+
if tools_str.strip() == "*":
|
|
142
|
+
return ["*"] # Keep as "*" to indicate all tools
|
|
143
|
+
|
|
144
|
+
# Split by comma and clean up each tool name
|
|
145
|
+
tools = [tool.strip() for tool in tools_str.split(',')]
|
|
146
|
+
# Remove empty strings
|
|
147
|
+
tools = [tool for tool in tools if tool]
|
|
148
|
+
|
|
149
|
+
return tools
|
|
150
|
+
|
|
151
|
+
@staticmethod
|
|
152
|
+
def validate_agent(agent: Agent) -> List[str]:
|
|
153
|
+
"""
|
|
154
|
+
Validate an agent definition.
|
|
155
|
+
|
|
156
|
+
Args:
|
|
157
|
+
agent: The agent to validate
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
List[str]: List of validation errors (empty if valid)
|
|
161
|
+
"""
|
|
162
|
+
errors = []
|
|
163
|
+
|
|
164
|
+
if not agent.name:
|
|
165
|
+
errors.append("Agent name is required")
|
|
166
|
+
|
|
167
|
+
if not agent.description:
|
|
168
|
+
errors.append("Agent description is required")
|
|
169
|
+
|
|
170
|
+
if not agent.content:
|
|
171
|
+
errors.append("Agent content (system prompt) is required")
|
|
172
|
+
|
|
173
|
+
# Validate tool names (basic validation)
|
|
174
|
+
# Tool names should match those defined in agentic_edit_types.py TOOL_MODEL_MAP
|
|
175
|
+
valid_tools = {
|
|
176
|
+
'execute_command', 'read_file', 'write_to_file', 'replace_in_file',
|
|
177
|
+
'search_files', 'list_files',
|
|
178
|
+
'ask_followup_question', 'attempt_completion',
|
|
179
|
+
'use_mcp_tool', 'use_rag_tool', 'run_named_subagents',
|
|
180
|
+
'todo_read', 'todo_write', 'ac_mod_read', 'ac_mod_write', 'ac_mod_list',
|
|
181
|
+
'count_tokens',
|
|
182
|
+
'*' # Special case for all tools
|
|
183
|
+
}
|
|
184
|
+
for tool in agent.tools:
|
|
185
|
+
if tool not in valid_tools:
|
|
186
|
+
errors.append(f"Unknown tool: {tool}. Valid tools are: {', '.join(sorted(valid_tools - {'*'}))}, or '*' for all tools")
|
|
187
|
+
|
|
188
|
+
return errors
|
|
189
|
+
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Example usage and demonstrations for the agents module.
|
|
3
|
+
|
|
4
|
+
This file provides practical examples of how to use the AgentManager and AgentParser.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import tempfile
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from autocoder.common.agents import AgentManager, AgentParser, Agent
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def example_create_sample_agents():
|
|
14
|
+
"""Example: Create sample agent files for testing."""
|
|
15
|
+
print("=== Creating Sample Agent Files ===")
|
|
16
|
+
|
|
17
|
+
# Create a temporary directory for our example
|
|
18
|
+
temp_dir = Path(tempfile.mkdtemp())
|
|
19
|
+
agents_dir = temp_dir / ".autocoderagents"
|
|
20
|
+
agents_dir.mkdir()
|
|
21
|
+
|
|
22
|
+
# Sample agent definitions
|
|
23
|
+
code_reviewer_agent = """---
|
|
24
|
+
name: code-reviewer
|
|
25
|
+
description: Expert code reviewer specializing in best practices and security
|
|
26
|
+
tools: read_file, write_to_file, search_files
|
|
27
|
+
model: gpt-4
|
|
28
|
+
include_rules: true
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
You are an expert code reviewer with extensive experience in software development.
|
|
32
|
+
Your role is to:
|
|
33
|
+
|
|
34
|
+
1. Review code for best practices, security vulnerabilities, and performance issues
|
|
35
|
+
2. Suggest improvements and optimizations
|
|
36
|
+
3. Ensure code follows established patterns and conventions
|
|
37
|
+
4. Check for proper error handling and edge cases
|
|
38
|
+
|
|
39
|
+
When reviewing code, focus on:
|
|
40
|
+
- Code quality and maintainability
|
|
41
|
+
- Security vulnerabilities
|
|
42
|
+
- Performance implications
|
|
43
|
+
- Best practices for the specific language/framework
|
|
44
|
+
- Documentation and testing coverage
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
documentation_agent = """---
|
|
48
|
+
name: documentation-writer
|
|
49
|
+
description: Technical documentation specialist for creating clear and comprehensive docs
|
|
50
|
+
tools: read_file, write_to_file, search_files
|
|
51
|
+
model: gpt-3.5-turbo
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
You are a technical documentation specialist with expertise in creating clear,
|
|
55
|
+
comprehensive, and user-friendly documentation.
|
|
56
|
+
|
|
57
|
+
Your responsibilities include:
|
|
58
|
+
1. Writing clear API documentation
|
|
59
|
+
2. Creating user guides and tutorials
|
|
60
|
+
3. Documenting code architecture and design decisions
|
|
61
|
+
4. Ensuring documentation is up-to-date and accurate
|
|
62
|
+
|
|
63
|
+
Focus on:
|
|
64
|
+
- Clarity and readability
|
|
65
|
+
- Comprehensive examples
|
|
66
|
+
- Proper formatting and structure
|
|
67
|
+
- Accessibility for different skill levels
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
testing_agent = """---
|
|
71
|
+
name: test-engineer
|
|
72
|
+
description: Testing specialist focused on comprehensive test coverage and quality assurance
|
|
73
|
+
tools: read_file, write_to_file, execute_command, search_files
|
|
74
|
+
include_rules: false
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
You are a testing engineer specializing in creating comprehensive test suites
|
|
78
|
+
and ensuring high-quality software delivery.
|
|
79
|
+
|
|
80
|
+
Your expertise includes:
|
|
81
|
+
1. Unit testing and integration testing
|
|
82
|
+
2. Test-driven development (TDD)
|
|
83
|
+
3. Performance and load testing
|
|
84
|
+
4. Test automation and CI/CD integration
|
|
85
|
+
|
|
86
|
+
When creating tests, ensure:
|
|
87
|
+
- High test coverage
|
|
88
|
+
- Edge case handling
|
|
89
|
+
- Clear test documentation
|
|
90
|
+
- Maintainable test code
|
|
91
|
+
- Proper test data management
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
# Write the agent files
|
|
95
|
+
(agents_dir / "code-reviewer.md").write_text(code_reviewer_agent)
|
|
96
|
+
(agents_dir / "documentation-writer.md").write_text(documentation_agent)
|
|
97
|
+
(agents_dir / "test-engineer.md").write_text(testing_agent)
|
|
98
|
+
|
|
99
|
+
print(f"Created sample agents in: {agents_dir}")
|
|
100
|
+
print("- code-reviewer.md")
|
|
101
|
+
print("- documentation-writer.md")
|
|
102
|
+
print("- test-engineer.md")
|
|
103
|
+
|
|
104
|
+
return temp_dir
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def example_basic_usage():
|
|
108
|
+
"""Example: Basic AgentManager usage."""
|
|
109
|
+
print("\n=== Basic AgentManager Usage ===")
|
|
110
|
+
|
|
111
|
+
# Create sample agents
|
|
112
|
+
project_root = example_create_sample_agents()
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
# Initialize AgentManager
|
|
116
|
+
manager = AgentManager(str(project_root))
|
|
117
|
+
|
|
118
|
+
# List all available agents
|
|
119
|
+
print(f"Total agents loaded: {len(manager.list_agents())}")
|
|
120
|
+
print(f"Agent names: {manager.get_agent_names()}")
|
|
121
|
+
|
|
122
|
+
# Get a specific agent
|
|
123
|
+
reviewer = manager.get_agent("code-reviewer")
|
|
124
|
+
if reviewer:
|
|
125
|
+
print(f"\nAgent: {reviewer.name}")
|
|
126
|
+
print(f"Description: {reviewer.description}")
|
|
127
|
+
print(f"Tools: {reviewer.tools}")
|
|
128
|
+
print(f"Model: {reviewer.model}")
|
|
129
|
+
print(f"Include Rules: {reviewer.include_rules}")
|
|
130
|
+
print(f"Content preview: {reviewer.content[:100]}...")
|
|
131
|
+
|
|
132
|
+
# Try to get a non-existent agent
|
|
133
|
+
non_existent = manager.get_agent("non-existent-agent")
|
|
134
|
+
print(f"\nNon-existent agent: {non_existent}")
|
|
135
|
+
|
|
136
|
+
finally:
|
|
137
|
+
# Cleanup
|
|
138
|
+
import shutil
|
|
139
|
+
shutil.rmtree(project_root)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def example_agent_parser():
|
|
143
|
+
"""Example: Using AgentParser directly."""
|
|
144
|
+
print("\n=== AgentParser Direct Usage ===")
|
|
145
|
+
|
|
146
|
+
# Sample agent content
|
|
147
|
+
agent_content = """---
|
|
148
|
+
name: example-agent
|
|
149
|
+
description: An example agent for demonstration
|
|
150
|
+
tools: read_file, write_to_file, search_files
|
|
151
|
+
model: gpt-4
|
|
152
|
+
include_rules: false
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
You are an example agent created for demonstration purposes.
|
|
156
|
+
Your task is to show how agent parsing works.
|
|
157
|
+
|
|
158
|
+
Key capabilities:
|
|
159
|
+
1. Parse YAML frontmatter
|
|
160
|
+
2. Extract agent metadata
|
|
161
|
+
3. Validate agent definitions
|
|
162
|
+
"""
|
|
163
|
+
|
|
164
|
+
try:
|
|
165
|
+
# Parse agent content
|
|
166
|
+
agent = AgentParser.parse_agent_content(agent_content)
|
|
167
|
+
|
|
168
|
+
print(f"Parsed agent: {agent.name}")
|
|
169
|
+
print(f"Description: {agent.description}")
|
|
170
|
+
print(f"Tools: {agent.tools}")
|
|
171
|
+
print(f"Model: {agent.model}")
|
|
172
|
+
print(f"Include Rules: {agent.include_rules}")
|
|
173
|
+
|
|
174
|
+
# Validate the agent
|
|
175
|
+
errors = AgentParser.validate_agent(agent)
|
|
176
|
+
if errors:
|
|
177
|
+
print(f"Validation errors: {errors}")
|
|
178
|
+
else:
|
|
179
|
+
print("Agent validation: PASSED")
|
|
180
|
+
|
|
181
|
+
# Convert to dictionary
|
|
182
|
+
agent_dict = agent.to_dict()
|
|
183
|
+
print(f"Agent as dict keys: {list(agent_dict.keys())}")
|
|
184
|
+
|
|
185
|
+
except ValueError as e:
|
|
186
|
+
print(f"Parsing error: {e}")
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def example_validation_errors():
|
|
190
|
+
"""Example: Demonstrating validation errors."""
|
|
191
|
+
print("\n=== Validation Error Examples ===")
|
|
192
|
+
|
|
193
|
+
# Agent with missing required fields
|
|
194
|
+
invalid_agent_content = """---
|
|
195
|
+
description: Agent without name field
|
|
196
|
+
tools: InvalidTool, Read
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
This agent is missing the name field and has an invalid tool.
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
agent = AgentParser.parse_agent_content(invalid_agent_content)
|
|
204
|
+
errors = AgentParser.validate_agent(agent)
|
|
205
|
+
|
|
206
|
+
if errors:
|
|
207
|
+
print("Validation errors found:")
|
|
208
|
+
for i, error in enumerate(errors, 1):
|
|
209
|
+
print(f" {i}. {error}")
|
|
210
|
+
else:
|
|
211
|
+
print("No validation errors (unexpected!)")
|
|
212
|
+
|
|
213
|
+
except ValueError as e:
|
|
214
|
+
print(f"Parsing failed as expected: {e}")
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def example_priority_system():
|
|
218
|
+
"""Example: Demonstrating the priority system."""
|
|
219
|
+
print("\n=== Agent Priority System Demo ===")
|
|
220
|
+
|
|
221
|
+
temp_dir = Path(tempfile.mkdtemp())
|
|
222
|
+
|
|
223
|
+
try:
|
|
224
|
+
# Create agents in different priority directories
|
|
225
|
+
high_priority_dir = temp_dir / ".autocoderagents"
|
|
226
|
+
medium_priority_dir = temp_dir / ".auto-coder" / ".autocoderagents"
|
|
227
|
+
|
|
228
|
+
high_priority_dir.mkdir()
|
|
229
|
+
medium_priority_dir.mkdir(parents=True)
|
|
230
|
+
|
|
231
|
+
# Same agent name in different directories
|
|
232
|
+
high_priority_agent = """---
|
|
233
|
+
name: priority-test
|
|
234
|
+
description: High priority agent (should win)
|
|
235
|
+
model: gpt-4
|
|
236
|
+
---
|
|
237
|
+
This is the HIGH PRIORITY agent that should be loaded.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
medium_priority_agent = """---
|
|
241
|
+
name: priority-test
|
|
242
|
+
description: Medium priority agent (should be overridden)
|
|
243
|
+
model: gpt-3.5-turbo
|
|
244
|
+
---
|
|
245
|
+
This is the medium priority agent that should be overridden.
|
|
246
|
+
"""
|
|
247
|
+
|
|
248
|
+
# Write agents to different directories
|
|
249
|
+
(high_priority_dir / "priority-test.md").write_text(high_priority_agent)
|
|
250
|
+
(medium_priority_dir / "priority-test.md").write_text(medium_priority_agent)
|
|
251
|
+
|
|
252
|
+
# Load agents using AgentManager
|
|
253
|
+
manager = AgentManager(str(temp_dir))
|
|
254
|
+
|
|
255
|
+
# Check which agent was loaded
|
|
256
|
+
agent = manager.get_agent("priority-test")
|
|
257
|
+
if agent:
|
|
258
|
+
print(f"Loaded agent description: {agent.description}")
|
|
259
|
+
print(f"Agent model: {agent.model}")
|
|
260
|
+
print(f"Should be the HIGH PRIORITY agent")
|
|
261
|
+
else:
|
|
262
|
+
print("No agent loaded (unexpected)")
|
|
263
|
+
|
|
264
|
+
finally:
|
|
265
|
+
import shutil
|
|
266
|
+
shutil.rmtree(temp_dir)
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def example_render_sub_agents():
|
|
270
|
+
"""Example: Rendering sub-agents section for system prompts."""
|
|
271
|
+
print("\n=== Sub-Agents Section Rendering ===")
|
|
272
|
+
|
|
273
|
+
project_root = example_create_sample_agents()
|
|
274
|
+
|
|
275
|
+
try:
|
|
276
|
+
manager = AgentManager(str(project_root))
|
|
277
|
+
|
|
278
|
+
# Render sub-agents section
|
|
279
|
+
result = manager.render_sub_agents_section(current_model="gpt-4")
|
|
280
|
+
|
|
281
|
+
# The method returns a rendered template string
|
|
282
|
+
if result and result.strip():
|
|
283
|
+
print("Sub-agents section content:")
|
|
284
|
+
print("-" * 50)
|
|
285
|
+
print(result[:500] + "..." if len(result) > 500 else result)
|
|
286
|
+
print("-" * 50)
|
|
287
|
+
else:
|
|
288
|
+
print("No agents available for rendering")
|
|
289
|
+
|
|
290
|
+
finally:
|
|
291
|
+
import shutil
|
|
292
|
+
shutil.rmtree(project_root)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def example_error_handling():
|
|
296
|
+
"""Example: Error handling scenarios."""
|
|
297
|
+
print("\n=== Error Handling Examples ===")
|
|
298
|
+
|
|
299
|
+
# 1. Non-existent project directory
|
|
300
|
+
try:
|
|
301
|
+
manager = AgentManager("/non/existent/directory")
|
|
302
|
+
print(f"Manager created for non-existent directory: {len(manager.agents)} agents")
|
|
303
|
+
except Exception as e:
|
|
304
|
+
print(f"Error with non-existent directory: {e}")
|
|
305
|
+
|
|
306
|
+
# 2. Invalid agent file
|
|
307
|
+
temp_dir = Path(tempfile.mkdtemp())
|
|
308
|
+
agents_dir = temp_dir / ".autocoderagents"
|
|
309
|
+
agents_dir.mkdir()
|
|
310
|
+
|
|
311
|
+
invalid_agent = """---
|
|
312
|
+
name:
|
|
313
|
+
description: Agent with empty name
|
|
314
|
+
---
|
|
315
|
+
Invalid agent content.
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
try:
|
|
319
|
+
(agents_dir / "invalid.md").write_text(invalid_agent)
|
|
320
|
+
manager = AgentManager(str(temp_dir))
|
|
321
|
+
print(f"Agents loaded despite invalid file: {len(manager.agents)}")
|
|
322
|
+
finally:
|
|
323
|
+
import shutil
|
|
324
|
+
shutil.rmtree(temp_dir)
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
def main():
|
|
328
|
+
"""Run all examples."""
|
|
329
|
+
print("AutoCoder Agents Module - Usage Examples")
|
|
330
|
+
print("=" * 50)
|
|
331
|
+
|
|
332
|
+
example_basic_usage()
|
|
333
|
+
example_agent_parser()
|
|
334
|
+
example_validation_errors()
|
|
335
|
+
example_priority_system()
|
|
336
|
+
example_render_sub_agents()
|
|
337
|
+
example_error_handling()
|
|
338
|
+
|
|
339
|
+
print("\n" + "=" * 50)
|
|
340
|
+
print("All examples completed successfully!")
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
if __name__ == "__main__":
|
|
344
|
+
main()
|