auto-coder 1.0.0__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-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
- {auto_coder-1.0.0.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 +24 -3
- 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 +970 -2345
- 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 +988 -398
- autocoder/chat_auto_coder_lang.py +23 -732
- autocoder/commands/auto_command.py +25 -8
- 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/git_utils.py +44 -8
- 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 +651 -102
- 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/pruner/conversation_pruner.py +26 -6
- autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
- 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/counter.py +24 -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 +2699 -1856
- autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
- autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
- autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
- 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 +564 -29
- 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 +243 -50
- 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 +410 -86
- 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 +207 -192
- autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
- autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
- 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 +343 -9
- autocoder/common/v2/agent/runner/__init__.py +3 -3
- autocoder/common/v2/agent/runner/base_runner.py +12 -26
- autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
- autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
- autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
- autocoder/common/v2/agent/runner/tool_display.py +557 -159
- 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 +116 -124
- autocoder/{agent → index/filter}/agentic_filter.py +322 -333
- 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 +65 -46
- 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/sdk/__init__.py +46 -190
- 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 +154 -171
- autocoder/sdk/cli/options.py +95 -22
- autocoder/sdk/constants.py +139 -51
- autocoder/sdk/core/auto_coder_core.py +484 -109
- autocoder/sdk/core/bridge.py +297 -115
- 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-1.0.0.dist-info/METADATA +0 -396
- auto_coder-1.0.0.dist-info/RECORD +0 -442
- auto_coder-1.0.0.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/context_pruner.py +0 -477
- autocoder/common/conversation_pruner.py +0 -132
- 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-1.0.0.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
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
LLMFriendlyPackageManager Usage Examples
|
|
3
|
-
|
|
4
|
-
This file demonstrates various ways to use the LLMFriendlyPackageManager class
|
|
5
|
-
for managing LLM friendly packages.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from autocoder.common.llm_friendly_package import LLMFriendlyPackageManager
|
|
9
|
-
|
|
10
|
-
def example_basic_usage():
|
|
11
|
-
"""Basic usage example"""
|
|
12
|
-
print("=== Basic Usage Example ===")
|
|
13
|
-
|
|
14
|
-
# Initialize the manager
|
|
15
|
-
manager = LLMFriendlyPackageManager()
|
|
16
|
-
|
|
17
|
-
# List current added libraries
|
|
18
|
-
added_libs = manager.list_added_libraries()
|
|
19
|
-
print(f"Currently added libraries: {added_libs}")
|
|
20
|
-
|
|
21
|
-
# Display added libraries in a nice table
|
|
22
|
-
manager.display_added_libraries()
|
|
23
|
-
|
|
24
|
-
def example_library_management():
|
|
25
|
-
"""Library management example"""
|
|
26
|
-
print("\n=== Library Management Example ===")
|
|
27
|
-
|
|
28
|
-
manager = LLMFriendlyPackageManager()
|
|
29
|
-
|
|
30
|
-
# Add a library (this will clone the repository if needed)
|
|
31
|
-
print("Adding a library...")
|
|
32
|
-
success = manager.add_library("example-lib")
|
|
33
|
-
if success:
|
|
34
|
-
print("Library added successfully!")
|
|
35
|
-
|
|
36
|
-
# List all available libraries
|
|
37
|
-
print("\nAll available libraries:")
|
|
38
|
-
manager.display_all_libraries()
|
|
39
|
-
|
|
40
|
-
# Remove a library
|
|
41
|
-
print("\nRemoving the library...")
|
|
42
|
-
removed = manager.remove_library("example-lib")
|
|
43
|
-
if removed:
|
|
44
|
-
print("Library removed successfully!")
|
|
45
|
-
|
|
46
|
-
def example_documentation_access():
|
|
47
|
-
"""Documentation access example"""
|
|
48
|
-
print("\n=== Documentation Access Example ===")
|
|
49
|
-
|
|
50
|
-
manager = LLMFriendlyPackageManager()
|
|
51
|
-
|
|
52
|
-
# Get documentation content for all packages
|
|
53
|
-
docs_content = manager.get_docs()
|
|
54
|
-
print(f"Total documentation content items: {len(docs_content)}")
|
|
55
|
-
|
|
56
|
-
# Get documentation file paths for all packages
|
|
57
|
-
docs_paths = manager.get_docs(return_paths=True)
|
|
58
|
-
print(f"Total documentation files: {len(docs_paths)}")
|
|
59
|
-
|
|
60
|
-
# Get documentation for a specific package
|
|
61
|
-
specific_docs = manager.get_docs(package_name="some-package", return_paths=True)
|
|
62
|
-
print(f"Documentation files for 'some-package': {len(specific_docs)}")
|
|
63
|
-
|
|
64
|
-
# Display documentation paths for a specific package
|
|
65
|
-
manager.display_library_docs("some-package")
|
|
66
|
-
|
|
67
|
-
def example_repository_management():
|
|
68
|
-
"""Repository management example"""
|
|
69
|
-
print("\n=== Repository Management Example ===")
|
|
70
|
-
|
|
71
|
-
manager = LLMFriendlyPackageManager()
|
|
72
|
-
|
|
73
|
-
# Get current proxy setting
|
|
74
|
-
current_proxy = manager.set_proxy()
|
|
75
|
-
print(f"Current proxy: {current_proxy}")
|
|
76
|
-
|
|
77
|
-
# Set a new proxy (optional)
|
|
78
|
-
# manager.set_proxy("https://gitee.com/your-mirror/llm_friendly_packages")
|
|
79
|
-
|
|
80
|
-
# Refresh the repository to get latest changes
|
|
81
|
-
print("Refreshing repository...")
|
|
82
|
-
success = manager.refresh_repository()
|
|
83
|
-
if success:
|
|
84
|
-
print("Repository refreshed successfully!")
|
|
85
|
-
|
|
86
|
-
def example_data_access():
|
|
87
|
-
"""Data access example"""
|
|
88
|
-
print("\n=== Data Access Example ===")
|
|
89
|
-
|
|
90
|
-
manager = LLMFriendlyPackageManager()
|
|
91
|
-
|
|
92
|
-
# Get all available libraries as structured data
|
|
93
|
-
available_libs = manager.list_all_available_libraries()
|
|
94
|
-
print(f"Total available libraries: {len(available_libs)}")
|
|
95
|
-
|
|
96
|
-
# Process the library information
|
|
97
|
-
for lib in available_libs[:3]: # Show first 3
|
|
98
|
-
print(f"Domain: {lib.domain}, "
|
|
99
|
-
f"Username: {lib.username}, "
|
|
100
|
-
f"Library: {lib.lib_name}, "
|
|
101
|
-
f"Added: {lib.is_added}")
|
|
102
|
-
|
|
103
|
-
def example_custom_configuration():
|
|
104
|
-
"""Custom configuration example"""
|
|
105
|
-
print("\n=== Custom Configuration Example ===")
|
|
106
|
-
|
|
107
|
-
# Initialize with custom directories (using existing project directory)
|
|
108
|
-
import tempfile
|
|
109
|
-
import os
|
|
110
|
-
|
|
111
|
-
# Create a temporary directory for demonstration
|
|
112
|
-
with tempfile.TemporaryDirectory() as temp_dir:
|
|
113
|
-
custom_project_root = temp_dir
|
|
114
|
-
custom_persist_dir = os.path.join(temp_dir, "custom_persist")
|
|
115
|
-
|
|
116
|
-
manager = LLMFriendlyPackageManager(
|
|
117
|
-
project_root=custom_project_root,
|
|
118
|
-
base_persist_dir=custom_persist_dir
|
|
119
|
-
)
|
|
120
|
-
|
|
121
|
-
print("Manager initialized with custom configuration")
|
|
122
|
-
print(f"Project root: {custom_project_root}")
|
|
123
|
-
print(f"Persistence directory: {custom_persist_dir}")
|
|
124
|
-
|
|
125
|
-
# Use the manager with custom configuration
|
|
126
|
-
added_libs = manager.list_added_libraries()
|
|
127
|
-
print(f"Added libraries with custom config: {added_libs}")
|
|
128
|
-
|
|
129
|
-
if __name__ == "__main__":
|
|
130
|
-
# Run all examples
|
|
131
|
-
example_basic_usage()
|
|
132
|
-
example_library_management()
|
|
133
|
-
example_documentation_access()
|
|
134
|
-
example_repository_management()
|
|
135
|
-
example_data_access()
|
|
136
|
-
example_custom_configuration()
|
|
137
|
-
|
|
138
|
-
print("\n=== All examples completed ===")
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Test script for LLMFriendlyPackageManager
|
|
3
|
-
|
|
4
|
-
This script demonstrates the usage of the new LLMFriendlyPackageManager class.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
import sys
|
|
9
|
-
from pathlib import Path
|
|
10
|
-
|
|
11
|
-
# Add the project root to the Python path
|
|
12
|
-
project_root = Path(__file__).parent.parent.parent
|
|
13
|
-
sys.path.insert(0, str(project_root))
|
|
14
|
-
|
|
15
|
-
from autocoder.common.llm_friendly_package import LLMFriendlyPackageManager
|
|
16
|
-
|
|
17
|
-
def test_llm_friendly_package_manager():
|
|
18
|
-
"""Test the LLMFriendlyPackageManager functionality"""
|
|
19
|
-
|
|
20
|
-
# Initialize the manager
|
|
21
|
-
manager = LLMFriendlyPackageManager()
|
|
22
|
-
|
|
23
|
-
print("=== Testing LLMFriendlyPackageManager ===\n")
|
|
24
|
-
|
|
25
|
-
# Test 1: Display added libraries (should be empty initially)
|
|
26
|
-
print("1. Testing display_added_libraries():")
|
|
27
|
-
manager.display_added_libraries()
|
|
28
|
-
print()
|
|
29
|
-
|
|
30
|
-
# Test 2: List added libraries programmatically
|
|
31
|
-
print("2. Testing list_added_libraries():")
|
|
32
|
-
added_libs = manager.list_added_libraries()
|
|
33
|
-
print(f"Added libraries: {added_libs}")
|
|
34
|
-
print()
|
|
35
|
-
|
|
36
|
-
# Test 3: Show current proxy
|
|
37
|
-
print("3. Testing set_proxy() to get current proxy:")
|
|
38
|
-
current_proxy = manager.set_proxy()
|
|
39
|
-
print(f"Current proxy: {current_proxy}")
|
|
40
|
-
print()
|
|
41
|
-
|
|
42
|
-
# Test 4: Try to get docs (should be empty if no libraries added)
|
|
43
|
-
print("4. Testing get_docs():")
|
|
44
|
-
docs = manager.get_docs(return_paths=True)
|
|
45
|
-
print(f"Number of documentation files found: {len(docs)}")
|
|
46
|
-
if docs:
|
|
47
|
-
print("First few docs:")
|
|
48
|
-
for i, doc in enumerate(docs[:3]):
|
|
49
|
-
print(f" - {doc}")
|
|
50
|
-
print()
|
|
51
|
-
|
|
52
|
-
# Test 5: Display all available libraries (may require repository)
|
|
53
|
-
print("5. Testing display_all_libraries():")
|
|
54
|
-
try:
|
|
55
|
-
manager.display_all_libraries()
|
|
56
|
-
except Exception as e:
|
|
57
|
-
print(f"Could not display all libraries: {e}")
|
|
58
|
-
print()
|
|
59
|
-
|
|
60
|
-
print("=== Test completed ===")
|
|
61
|
-
|
|
62
|
-
if __name__ == "__main__":
|
|
63
|
-
test_llm_friendly_package_manager()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
|
|
@@ -1,484 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from pathlib import Path
|
|
3
|
-
from threading import Lock
|
|
4
|
-
import threading
|
|
5
|
-
from typing import Dict, List, Optional
|
|
6
|
-
from loguru import logger
|
|
7
|
-
import re
|
|
8
|
-
import yaml
|
|
9
|
-
import byzerllm # Added import
|
|
10
|
-
from pydantic import BaseModel, Field
|
|
11
|
-
from typing import List, Dict, Optional, Any # Added Any
|
|
12
|
-
from autocoder.common import AutoCoderArgs
|
|
13
|
-
import concurrent.futures # 添加线程池导入
|
|
14
|
-
|
|
15
|
-
# 尝试导入 FileMonitor
|
|
16
|
-
try:
|
|
17
|
-
from autocoder.common.file_monitor.monitor import FileMonitor, Change
|
|
18
|
-
except ImportError:
|
|
19
|
-
# 如果导入失败,提供一个空的实现
|
|
20
|
-
logger.warning("警告: 无法导入 FileMonitor,规则文件变更监控将不可用")
|
|
21
|
-
FileMonitor = None
|
|
22
|
-
Change = None
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class RuleFile(BaseModel):
|
|
26
|
-
"""规则文件的Pydantic模型"""
|
|
27
|
-
description: str = Field(default="", description="规则的描述")
|
|
28
|
-
globs: List[str] = Field(default_factory=list, description="文件匹配模式列表")
|
|
29
|
-
always_apply: bool = Field(default=False, description="是否总是应用规则")
|
|
30
|
-
content: str = Field(default="", description="规则文件的正文内容")
|
|
31
|
-
file_path: str = Field(default="", description="规则文件的路径")
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class AutocoderRulesManager:
|
|
35
|
-
"""
|
|
36
|
-
管理和监控 autocoderrules 目录中的规则文件。
|
|
37
|
-
|
|
38
|
-
实现单例模式,确保全局只有一个规则管理实例。
|
|
39
|
-
支持监控规则文件变化,当规则文件变化时自动重新加载。
|
|
40
|
-
"""
|
|
41
|
-
_instance = None
|
|
42
|
-
_lock = Lock()
|
|
43
|
-
|
|
44
|
-
def __new__(cls, project_root: Optional[str] = None):
|
|
45
|
-
if not cls._instance:
|
|
46
|
-
with cls._lock:
|
|
47
|
-
if not cls._instance:
|
|
48
|
-
cls._instance = super(AutocoderRulesManager, cls).__new__(cls)
|
|
49
|
-
cls._instance._initialized = False
|
|
50
|
-
return cls._instance
|
|
51
|
-
|
|
52
|
-
def __init__(self, project_root: Optional[str] = None):
|
|
53
|
-
if self._initialized:
|
|
54
|
-
return
|
|
55
|
-
self._initialized = True
|
|
56
|
-
|
|
57
|
-
self._rules: Dict[str, str] = {} # 存储规则文件内容: {file_path: content}
|
|
58
|
-
self._rules_dir: Optional[str] = None # 当前使用的规则目录
|
|
59
|
-
self._file_monitor = None # FileMonitor 实例
|
|
60
|
-
self._monitored_dirs: List[str] = [] # 被监控的目录列表
|
|
61
|
-
self._project_root = project_root if project_root is not None else os.getcwd() # 项目根目录
|
|
62
|
-
|
|
63
|
-
# 加载规则
|
|
64
|
-
self._load_rules()
|
|
65
|
-
# 设置文件监控
|
|
66
|
-
self._setup_file_monitor()
|
|
67
|
-
|
|
68
|
-
def _load_rules(self):
|
|
69
|
-
"""
|
|
70
|
-
按优先级顺序加载规则文件。
|
|
71
|
-
优先级顺序:
|
|
72
|
-
1. .autocoderrules/
|
|
73
|
-
2. .auto-coder/.autocoderrules/
|
|
74
|
-
3. .auto-coder/autocoderrules/
|
|
75
|
-
"""
|
|
76
|
-
self._rules = {}
|
|
77
|
-
project_root = self._project_root
|
|
78
|
-
|
|
79
|
-
# 按优先级顺序定义可能的规则目录
|
|
80
|
-
rules_dirs = [
|
|
81
|
-
os.path.join(project_root, ".autocoderrules"),
|
|
82
|
-
os.path.join(project_root, ".auto-coder", ".autocoderrules"),
|
|
83
|
-
os.path.join(project_root, ".auto-coder", "autocoderrules")
|
|
84
|
-
]
|
|
85
|
-
|
|
86
|
-
# 按优先级查找第一个存在的目录
|
|
87
|
-
found_dir = None
|
|
88
|
-
for rules_dir in rules_dirs:
|
|
89
|
-
if os.path.isdir(rules_dir):
|
|
90
|
-
found_dir = rules_dir
|
|
91
|
-
break
|
|
92
|
-
|
|
93
|
-
if not found_dir:
|
|
94
|
-
logger.info("未找到规则目录")
|
|
95
|
-
return
|
|
96
|
-
|
|
97
|
-
self._rules_dir = found_dir
|
|
98
|
-
logger.info(f"使用规则目录: {self._rules_dir}")
|
|
99
|
-
|
|
100
|
-
# 加载目录中的所有 .md 文件
|
|
101
|
-
try:
|
|
102
|
-
for fname in os.listdir(self._rules_dir):
|
|
103
|
-
if fname.endswith(".md"):
|
|
104
|
-
fpath = os.path.join(self._rules_dir, fname)
|
|
105
|
-
try:
|
|
106
|
-
with open(fpath, "r", encoding="utf-8") as f:
|
|
107
|
-
content = f.read()
|
|
108
|
-
self._rules[fpath] = content
|
|
109
|
-
logger.info(f"已加载规则文件: {fpath}")
|
|
110
|
-
except Exception as e:
|
|
111
|
-
logger.info(f"加载规则文件 {fpath} 时出错: {e}")
|
|
112
|
-
continue
|
|
113
|
-
except Exception as e:
|
|
114
|
-
logger.info(f"读取规则目录 {self._rules_dir} 时出错: {e}")
|
|
115
|
-
|
|
116
|
-
def _setup_file_monitor(self):
|
|
117
|
-
"""设置文件监控,当规则文件或目录变化时重新加载规则"""
|
|
118
|
-
if FileMonitor is None or not self._rules_dir:
|
|
119
|
-
return
|
|
120
|
-
|
|
121
|
-
try:
|
|
122
|
-
# 获取项目根目录
|
|
123
|
-
project_root = self._project_root
|
|
124
|
-
|
|
125
|
-
# 创建 FileMonitor 实例
|
|
126
|
-
self._file_monitor = FileMonitor(root_dir=project_root)
|
|
127
|
-
|
|
128
|
-
# 监控所有可能的规则目录
|
|
129
|
-
self._monitored_dirs = [
|
|
130
|
-
os.path.join(project_root, ".autocoderrules"),
|
|
131
|
-
os.path.join(project_root, ".auto-coder", ".autocoderrules"),
|
|
132
|
-
os.path.join(project_root, ".auto-coder", "autocoderrules")
|
|
133
|
-
]
|
|
134
|
-
|
|
135
|
-
# 注册目录监控
|
|
136
|
-
for dir_path in self._monitored_dirs:
|
|
137
|
-
# 创建目录(如果不存在)
|
|
138
|
-
os.makedirs(dir_path, exist_ok=True)
|
|
139
|
-
# 注册监控
|
|
140
|
-
self._file_monitor.register(dir_path, self._on_rules_changed)
|
|
141
|
-
logger.info(f"已注册规则目录监控: {dir_path}")
|
|
142
|
-
|
|
143
|
-
# 启动监控
|
|
144
|
-
if not self._file_monitor.is_running():
|
|
145
|
-
self._file_monitor.start()
|
|
146
|
-
logger.info("规则文件监控已启动")
|
|
147
|
-
|
|
148
|
-
except Exception as e:
|
|
149
|
-
logger.warning(f"设置规则文件监控时出错: {e}")
|
|
150
|
-
|
|
151
|
-
def _on_rules_changed(self, change_type: Change, changed_path: str):
|
|
152
|
-
"""当规则文件或目录发生变化时的回调函数"""
|
|
153
|
-
# 检查变化是否与规则相关
|
|
154
|
-
is_rule_related = False
|
|
155
|
-
|
|
156
|
-
# 检查是否是 .md 文件
|
|
157
|
-
if changed_path.endswith(".md"):
|
|
158
|
-
# 检查文件是否在监控的目录中
|
|
159
|
-
for dir_path in self._monitored_dirs:
|
|
160
|
-
if os.path.abspath(changed_path).startswith(os.path.abspath(dir_path)):
|
|
161
|
-
is_rule_related = True
|
|
162
|
-
break
|
|
163
|
-
else:
|
|
164
|
-
# 检查是否是监控的目录本身
|
|
165
|
-
for dir_path in self._monitored_dirs:
|
|
166
|
-
if os.path.abspath(changed_path) == os.path.abspath(dir_path):
|
|
167
|
-
is_rule_related = True
|
|
168
|
-
break
|
|
169
|
-
|
|
170
|
-
if is_rule_related:
|
|
171
|
-
logger.info(f"检测到规则相关变化 ({change_type.name}): {changed_path}")
|
|
172
|
-
# 重新加载规则
|
|
173
|
-
self._load_rules()
|
|
174
|
-
logger.info("已重新加载规则")
|
|
175
|
-
|
|
176
|
-
def parse_rule_file(self, file_path: str) -> RuleFile:
|
|
177
|
-
"""
|
|
178
|
-
解析规则文件并返回结构化的Pydantic模型对象
|
|
179
|
-
|
|
180
|
-
Args:
|
|
181
|
-
file_path: 规则文件的路径
|
|
182
|
-
|
|
183
|
-
Returns:
|
|
184
|
-
RuleFile: 包含规则文件结构化内容的Pydantic模型
|
|
185
|
-
"""
|
|
186
|
-
if not os.path.exists(file_path) or not file_path.endswith('.md'):
|
|
187
|
-
logger.warning(f"无效的规则文件路径: {file_path}")
|
|
188
|
-
return RuleFile(file_path=file_path)
|
|
189
|
-
|
|
190
|
-
try:
|
|
191
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
|
192
|
-
content = f.read()
|
|
193
|
-
|
|
194
|
-
# 解析YAML头部和Markdown内容
|
|
195
|
-
yaml_pattern = re.compile(r'^---\s*\n(.*?)\n---\s*\n', re.DOTALL)
|
|
196
|
-
yaml_match = yaml_pattern.search(content)
|
|
197
|
-
|
|
198
|
-
metadata = {}
|
|
199
|
-
markdown_content = content
|
|
200
|
-
|
|
201
|
-
if yaml_match:
|
|
202
|
-
yaml_content = yaml_match.group(1)
|
|
203
|
-
try:
|
|
204
|
-
metadata = yaml.safe_load(yaml_content)
|
|
205
|
-
# 移除YAML部分,仅保留Markdown内容
|
|
206
|
-
markdown_content = content[yaml_match.end():]
|
|
207
|
-
except Exception as e:
|
|
208
|
-
logger.warning(f"解析规则文件YAML头部时出错: {e}")
|
|
209
|
-
|
|
210
|
-
# 创建并返回Pydantic模型
|
|
211
|
-
rule = RuleFile(
|
|
212
|
-
description=metadata.get('description', ''),
|
|
213
|
-
globs=metadata.get('globs', []),
|
|
214
|
-
always_apply=metadata.get('alwaysApply', False),
|
|
215
|
-
content=markdown_content.strip(),
|
|
216
|
-
file_path=file_path
|
|
217
|
-
)
|
|
218
|
-
return rule
|
|
219
|
-
|
|
220
|
-
except Exception as e:
|
|
221
|
-
logger.warning(f"解析规则文件时出错: {file_path}, 错误: {e}")
|
|
222
|
-
return RuleFile(file_path=file_path)
|
|
223
|
-
|
|
224
|
-
def get_rules(self) -> Dict[str, str]:
|
|
225
|
-
"""获取所有规则文件内容"""
|
|
226
|
-
return self._rules.copy()
|
|
227
|
-
|
|
228
|
-
def get_parsed_rules(self) -> List[RuleFile]:
|
|
229
|
-
"""获取所有解析后的规则文件"""
|
|
230
|
-
parsed_rules = []
|
|
231
|
-
for file_path in self._rules:
|
|
232
|
-
parsed_rule = self.parse_rule_file(file_path)
|
|
233
|
-
parsed_rules.append(parsed_rule)
|
|
234
|
-
return parsed_rules
|
|
235
|
-
|
|
236
|
-
@classmethod
|
|
237
|
-
def reset_instance(cls):
|
|
238
|
-
"""
|
|
239
|
-
重置单例实例。
|
|
240
|
-
如果当前实例正在运行,则先取消注册监控的目录,然后重置实例。
|
|
241
|
-
"""
|
|
242
|
-
with cls._lock:
|
|
243
|
-
if cls._instance is not None:
|
|
244
|
-
# 取消注册监控的目录
|
|
245
|
-
if cls._instance._file_monitor:
|
|
246
|
-
for dir_path in cls._instance._monitored_dirs:
|
|
247
|
-
try:
|
|
248
|
-
cls._instance._file_monitor.unregister(dir_path)
|
|
249
|
-
logger.info(f"已取消注册目录监控: {dir_path}")
|
|
250
|
-
except Exception as e:
|
|
251
|
-
logger.warning(f"取消注册目录 {dir_path} 时出错: {e}")
|
|
252
|
-
cls._instance = None
|
|
253
|
-
logger.info("AutocoderRulesManager单例已被重置")
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
# 对外提供单例
|
|
257
|
-
_rules_manager = None
|
|
258
|
-
|
|
259
|
-
def get_rules(project_root: Optional[str] = None) -> Dict[str, str]:
|
|
260
|
-
"""获取所有规则文件内容,可指定项目根目录"""
|
|
261
|
-
global _rules_manager
|
|
262
|
-
if _rules_manager is None:
|
|
263
|
-
_rules_manager = AutocoderRulesManager(project_root=project_root)
|
|
264
|
-
return _rules_manager.get_rules()
|
|
265
|
-
|
|
266
|
-
def get_parsed_rules(project_root: Optional[str] = None) -> List[RuleFile]:
|
|
267
|
-
"""获取所有解析后的规则文件,可指定项目根目录"""
|
|
268
|
-
global _rules_manager
|
|
269
|
-
if _rules_manager is None:
|
|
270
|
-
_rules_manager = AutocoderRulesManager(project_root=project_root)
|
|
271
|
-
return _rules_manager.get_parsed_rules()
|
|
272
|
-
|
|
273
|
-
def parse_rule_file(file_path: str, project_root: Optional[str] = None) -> RuleFile:
|
|
274
|
-
"""解析指定的规则文件,可指定项目根目录"""
|
|
275
|
-
global _rules_manager
|
|
276
|
-
if _rules_manager is None:
|
|
277
|
-
_rules_manager = AutocoderRulesManager(project_root=project_root)
|
|
278
|
-
return _rules_manager.parse_rule_file(file_path)
|
|
279
|
-
|
|
280
|
-
def reset_rules_manager():
|
|
281
|
-
"""重置AutocoderRulesManager单例实例"""
|
|
282
|
-
AutocoderRulesManager.reset_instance()
|
|
283
|
-
global _rules_manager
|
|
284
|
-
_rules_manager = None
|
|
285
|
-
|
|
286
|
-
# 添加用于返回类型的Pydantic模型
|
|
287
|
-
class RuleRelevance(BaseModel):
|
|
288
|
-
"""用于规则相关性判断的返回模型"""
|
|
289
|
-
is_relevant: bool = Field(description="规则是否与当前任务相关")
|
|
290
|
-
reason: str = Field(default="", description="判断理由")
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
class RuleSelector:
|
|
294
|
-
"""
|
|
295
|
-
根据LLM的判断和规则元数据选择适用的规则。
|
|
296
|
-
"""
|
|
297
|
-
def __init__(self, llm: Optional[byzerllm.ByzerLLM], args: Optional[AutoCoderArgs] = None):
|
|
298
|
-
"""
|
|
299
|
-
初始化RuleSelector。
|
|
300
|
-
|
|
301
|
-
Args:
|
|
302
|
-
llm: ByzerLLM 实例,用于判断规则是否适用。如果为 None,则只选择 always_apply=True 的规则。
|
|
303
|
-
args: 传递给 Agent 的参数,可能包含用于规则选择的上下文信息。
|
|
304
|
-
"""
|
|
305
|
-
self.llm = llm
|
|
306
|
-
self.args = args
|
|
307
|
-
|
|
308
|
-
@byzerllm.prompt()
|
|
309
|
-
def _build_selection_prompt(self, rule: RuleFile, context: str = "") -> str:
|
|
310
|
-
"""
|
|
311
|
-
判断规则是否适用于当前任务。
|
|
312
|
-
|
|
313
|
-
规则描述:
|
|
314
|
-
{{ rule.description }}
|
|
315
|
-
|
|
316
|
-
规则内容摘要 (前200字符):
|
|
317
|
-
{{ rule.content[:200] }}
|
|
318
|
-
|
|
319
|
-
{% if context %}
|
|
320
|
-
任务上下文:
|
|
321
|
-
{{ context }}
|
|
322
|
-
{% endif %}
|
|
323
|
-
|
|
324
|
-
基于以上信息,判断这条规则 (路径: {{ rule.file_path }}) 是否与当前任务相关并应该被应用?
|
|
325
|
-
|
|
326
|
-
请以JSON格式返回结果:
|
|
327
|
-
```json
|
|
328
|
-
{
|
|
329
|
-
"is_relevant": true或false,
|
|
330
|
-
"reason": "判断理由"
|
|
331
|
-
}
|
|
332
|
-
```
|
|
333
|
-
"""
|
|
334
|
-
# 注意:确保 rule 对象和 context 字典能够被 Jinja2 正确访问。
|
|
335
|
-
# Pydantic模型可以直接在Jinja2中使用其属性。
|
|
336
|
-
return {
|
|
337
|
-
"rule": rule,
|
|
338
|
-
"context": context
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
def _evaluate_rule(self, rule: RuleFile, context: str) -> tuple[RuleFile, bool, Optional[str]]:
|
|
342
|
-
"""
|
|
343
|
-
评估单个规则是否适用于当前上下文。
|
|
344
|
-
|
|
345
|
-
Args:
|
|
346
|
-
rule: 要评估的规则
|
|
347
|
-
context: 上下文信息
|
|
348
|
-
|
|
349
|
-
Returns:
|
|
350
|
-
tuple: (规则, 是否选中, 理由)
|
|
351
|
-
"""
|
|
352
|
-
# 如果规则设置为总是应用,直接返回选中
|
|
353
|
-
if rule.always_apply:
|
|
354
|
-
return (rule, True, "规则设置为总是应用")
|
|
355
|
-
|
|
356
|
-
# 如果没有LLM,无法评估non-always规则
|
|
357
|
-
if self.llm is None:
|
|
358
|
-
return (rule, False, "未提供LLM,无法评估non-always规则")
|
|
359
|
-
|
|
360
|
-
try:
|
|
361
|
-
prompt = self._build_selection_prompt.prompt(rule=rule, context=context)
|
|
362
|
-
logger.debug(f"为规则 '{os.path.basename(rule.file_path)}' 生成的判断 Prompt (片段): {prompt[:200]}...")
|
|
363
|
-
|
|
364
|
-
result = None
|
|
365
|
-
try:
|
|
366
|
-
# 使用with_return_type方法获取结构化结果
|
|
367
|
-
result = self._build_selection_prompt.with_llm(self.llm).with_return_type(RuleRelevance).run(rule=rule, context=context)
|
|
368
|
-
if result and result.is_relevant:
|
|
369
|
-
return (rule, True, result.reason)
|
|
370
|
-
else:
|
|
371
|
-
return (rule, False, result.reason if result else "未提供理由")
|
|
372
|
-
except Exception as e:
|
|
373
|
-
logger.warning(f"LLM 未能为规则 '{os.path.basename(rule.file_path)}' 提供有效响应: {e}")
|
|
374
|
-
return (rule, False, f"LLM评估出错: {str(e)}")
|
|
375
|
-
|
|
376
|
-
except Exception as e:
|
|
377
|
-
logger.error(f"评估规则 '{os.path.basename(rule.file_path)}' 时出错: {e}", exc_info=True)
|
|
378
|
-
return (rule, False, f"评估过程出错: {str(e)}")
|
|
379
|
-
|
|
380
|
-
def select_rules(self, context: str) -> List[RuleFile]:
|
|
381
|
-
"""
|
|
382
|
-
选择适用于当前上下文的规则。使用线程池并发评估规则。
|
|
383
|
-
|
|
384
|
-
Args:
|
|
385
|
-
context: 可选的字典,包含用于规则选择的上下文信息 (例如,用户指令、目标文件等)。
|
|
386
|
-
|
|
387
|
-
Returns:
|
|
388
|
-
List[RuleFile]: 选定的规则列表。
|
|
389
|
-
"""
|
|
390
|
-
rules = get_parsed_rules()
|
|
391
|
-
selected_rules: List[RuleFile] = []
|
|
392
|
-
logger.info(f"开始选择规则,总规则数: {len(rules)}")
|
|
393
|
-
|
|
394
|
-
# 预先分类处理always_apply规则
|
|
395
|
-
always_apply_rules = []
|
|
396
|
-
need_llm_rules = []
|
|
397
|
-
|
|
398
|
-
for rule in rules:
|
|
399
|
-
if rule.always_apply:
|
|
400
|
-
always_apply_rules.append(rule)
|
|
401
|
-
elif self.llm is not None:
|
|
402
|
-
need_llm_rules.append(rule)
|
|
403
|
-
|
|
404
|
-
# 添加always_apply规则
|
|
405
|
-
for rule in always_apply_rules:
|
|
406
|
-
selected_rules.append(rule)
|
|
407
|
-
logger.debug(f"规则 '{os.path.basename(rule.file_path)}' (AlwaysApply=True) 已自动选择。")
|
|
408
|
-
|
|
409
|
-
# 如果没有需要LLM评估的规则,直接返回结果
|
|
410
|
-
if not need_llm_rules:
|
|
411
|
-
logger.info(f"规则选择完成,选中规则数: {len(selected_rules)}")
|
|
412
|
-
return selected_rules
|
|
413
|
-
|
|
414
|
-
# 使用线程池并发评估规则
|
|
415
|
-
with concurrent.futures.ThreadPoolExecutor() as executor:
|
|
416
|
-
# 提交所有评估任务
|
|
417
|
-
future_to_rule = {
|
|
418
|
-
executor.submit(self._evaluate_rule, rule, context): rule
|
|
419
|
-
for rule in need_llm_rules
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
# 收集评估结果
|
|
423
|
-
for future in concurrent.futures.as_completed(future_to_rule):
|
|
424
|
-
rule, is_selected, reason = future.result()
|
|
425
|
-
if is_selected:
|
|
426
|
-
selected_rules.append(rule)
|
|
427
|
-
logger.info(f"规则 '{os.path.basename(rule.file_path)}' (AlwaysApply=False) 已被 LLM 选择,原因: {reason}")
|
|
428
|
-
else:
|
|
429
|
-
logger.debug(f"规则 '{os.path.basename(rule.file_path)}' (AlwaysApply=False) 未被 LLM 选择,原因: {reason}")
|
|
430
|
-
|
|
431
|
-
logger.info(f"规则选择完成,选中规则数: {len(selected_rules)}")
|
|
432
|
-
return selected_rules
|
|
433
|
-
|
|
434
|
-
def get_selected_rules_content(self, context: Optional[Dict] = None) -> Dict[str, str]:
|
|
435
|
-
"""
|
|
436
|
-
获取选定规则的文件路径和内容字典。
|
|
437
|
-
|
|
438
|
-
Args:
|
|
439
|
-
context: 传递给 select_rules 的上下文。
|
|
440
|
-
|
|
441
|
-
Returns:
|
|
442
|
-
Dict[str, str]: 选定规则的 {file_path: content} 字典。
|
|
443
|
-
"""
|
|
444
|
-
selected_rules = self.select_rules(context=context)
|
|
445
|
-
# 使用 os.path.basename 获取文件名作为 key,如果需要的话
|
|
446
|
-
# return {os.path.basename(rule.file_path): rule.content for rule in selected_rules}
|
|
447
|
-
# 保持 file_path 作为 key
|
|
448
|
-
return {rule.file_path: rule.content for rule in selected_rules}
|
|
449
|
-
|
|
450
|
-
def auto_select_rules(context: str, llm: Optional[byzerllm.ByzerLLM] = None,args:Optional[AutoCoderArgs] = None) -> List[Dict[str, str]]:
|
|
451
|
-
"""
|
|
452
|
-
根据LLM的判断和规则元数据选择适用的规则。
|
|
453
|
-
"""
|
|
454
|
-
selector = RuleSelector(llm=llm, args=args)
|
|
455
|
-
return selector.get_selected_rules_content(context=context)
|
|
456
|
-
|
|
457
|
-
def get_required_and_index_rules() -> Dict[str, str]:
|
|
458
|
-
"""
|
|
459
|
-
获取所有必须应用的规则文件(always_apply=True)和Index.md文件。
|
|
460
|
-
|
|
461
|
-
Args:
|
|
462
|
-
project_root: 可选的项目根目录路径,用于初始化规则管理器。
|
|
463
|
-
|
|
464
|
-
Returns:
|
|
465
|
-
Dict[str, str]: 包含必须应用的规则和Index.md文件的{file_path: content}字典。
|
|
466
|
-
"""
|
|
467
|
-
# 获取所有解析后的规则文件
|
|
468
|
-
parsed_rules = get_parsed_rules()
|
|
469
|
-
result: Dict[str, str] = {}
|
|
470
|
-
logger.info(f"获取所有解析后的规则文件完成,总数: {len(parsed_rules)}")
|
|
471
|
-
|
|
472
|
-
for rule in parsed_rules:
|
|
473
|
-
# 检查是否是always_apply=True的规则
|
|
474
|
-
if rule.always_apply:
|
|
475
|
-
result[rule.file_path] = rule.content
|
|
476
|
-
logger.info(f"添加必须应用的规则: {os.path.basename(rule.file_path)}")
|
|
477
|
-
|
|
478
|
-
# 检查是否是Index.md文件
|
|
479
|
-
if os.path.basename(rule.file_path).lower() == "index.md":
|
|
480
|
-
result[rule.file_path] = rule.content
|
|
481
|
-
logger.info(f"添加Index.md文件: {rule.file_path}")
|
|
482
|
-
|
|
483
|
-
logger.info(f"获取必须应用的规则和Index.md文件完成,总数: {len(result)}")
|
|
484
|
-
return result
|