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
|
@@ -1,231 +1,76 @@
|
|
|
1
1
|
"""
|
|
2
|
-
LLM Friendly Package Manager
|
|
2
|
+
Main LLM Friendly Package Manager
|
|
3
3
|
|
|
4
|
-
This module provides
|
|
5
|
-
|
|
4
|
+
This module provides the complete package management functionality,
|
|
5
|
+
integrating with the core_config module for state management.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
|
-
import
|
|
10
|
-
from typing import List, Dict, Any, Optional, Tuple
|
|
11
|
-
from dataclasses import dataclass
|
|
9
|
+
from typing import List, Optional, Dict, Any
|
|
12
10
|
from rich.console import Console
|
|
13
11
|
from rich.table import Table
|
|
14
12
|
import git
|
|
15
|
-
from
|
|
13
|
+
from git import GitCommandError
|
|
16
14
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class LibraryInfo:
|
|
20
|
-
"""Information about a library"""
|
|
21
|
-
domain: str
|
|
22
|
-
username: str
|
|
23
|
-
lib_name: str
|
|
24
|
-
full_path: str
|
|
25
|
-
is_added: bool
|
|
26
|
-
has_md_files: bool = True
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@dataclass
|
|
30
|
-
class PackageDoc:
|
|
31
|
-
"""Package documentation information"""
|
|
32
|
-
file_path: str
|
|
33
|
-
content: Optional[str] = None
|
|
15
|
+
from autocoder.common.core_config import get_memory_manager
|
|
16
|
+
from .models import LibraryInfo, LibraryList, DocsList, RepositoryInfo
|
|
34
17
|
|
|
35
18
|
|
|
36
19
|
class LLMFriendlyPackageManager:
|
|
37
|
-
"""
|
|
20
|
+
"""
|
|
21
|
+
Complete LLM Friendly Package Manager
|
|
22
|
+
|
|
23
|
+
This class provides all package management functionality including:
|
|
24
|
+
- Library management (add, remove, list)
|
|
25
|
+
- Documentation management (get docs, paths)
|
|
26
|
+
- Repository management (clone, refresh, proxy)
|
|
27
|
+
- Display management (tables, output)
|
|
28
|
+
"""
|
|
38
29
|
|
|
39
|
-
def __init__(self, project_root: str = None
|
|
30
|
+
def __init__(self, project_root: Optional[str] = None):
|
|
40
31
|
"""
|
|
41
32
|
Initialize the package manager
|
|
42
33
|
|
|
43
34
|
Args:
|
|
44
35
|
project_root: Project root directory, defaults to current working directory
|
|
45
|
-
base_persist_dir: Base directory for persistence, defaults to .auto-coder/plugins/chat-auto-coder
|
|
46
36
|
"""
|
|
47
37
|
self.project_root = project_root or os.getcwd()
|
|
48
|
-
self.
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
self.memory_manager = get_memory_manager(self.project_root)
|
|
39
|
+
self.console = Console()
|
|
40
|
+
|
|
41
|
+
# Set up directory paths
|
|
51
42
|
self.lib_dir = os.path.join(self.project_root, ".auto-coder", "libs")
|
|
52
43
|
self.llm_friendly_packages_dir = os.path.join(self.lib_dir, "llm_friendly_packages")
|
|
53
|
-
self.console = Console()
|
|
54
44
|
|
|
55
45
|
# Ensure directories exist
|
|
56
|
-
|
|
57
|
-
os.makedirs(self.base_persist_dir, exist_ok=True)
|
|
58
|
-
|
|
59
|
-
def _get_memory_path(self) -> str:
|
|
60
|
-
"""Get memory file path"""
|
|
61
|
-
return os.path.join(self.base_persist_dir, "memory.json")
|
|
46
|
+
self._ensure_dirs()
|
|
62
47
|
|
|
63
|
-
def
|
|
64
|
-
"""
|
|
65
|
-
|
|
66
|
-
lock_path = memory_path + ".lock"
|
|
67
|
-
|
|
68
|
-
default_memory = {
|
|
69
|
-
"conversation": [],
|
|
70
|
-
"current_files": {"files": [], "groups": {}},
|
|
71
|
-
"conf": {},
|
|
72
|
-
"exclude_dirs": [],
|
|
73
|
-
"mode": "auto_detect",
|
|
74
|
-
"libs": {}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if not os.path.exists(memory_path):
|
|
78
|
-
return default_memory
|
|
79
|
-
|
|
80
|
-
try:
|
|
81
|
-
with FileLock(lock_path, timeout=30):
|
|
82
|
-
with open(memory_path, "r", encoding="utf-8") as f:
|
|
83
|
-
memory = json.load(f)
|
|
84
|
-
# Ensure libs key exists
|
|
85
|
-
if "libs" not in memory:
|
|
86
|
-
memory["libs"] = {}
|
|
87
|
-
return memory
|
|
88
|
-
except Exception:
|
|
89
|
-
return default_memory
|
|
48
|
+
def _ensure_dirs(self):
|
|
49
|
+
"""Ensure required directories exist"""
|
|
50
|
+
os.makedirs(self.lib_dir, exist_ok=True)
|
|
90
51
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
with FileLock(lock_path, timeout=30):
|
|
97
|
-
with open(memory_path, "w", encoding="utf-8") as f:
|
|
98
|
-
json.dump(memory, f, indent=2, ensure_ascii=False)
|
|
52
|
+
@property
|
|
53
|
+
def default_proxy_url(self) -> str:
|
|
54
|
+
"""Get default proxy URL"""
|
|
55
|
+
return "https://github.com/allwefantasy/llm_friendly_packages"
|
|
99
56
|
|
|
100
57
|
def _get_current_proxy(self) -> str:
|
|
101
|
-
"""Get current proxy URL"""
|
|
102
|
-
|
|
103
|
-
return memory.get("lib-proxy", "https://github.com/allwefantasy/llm_friendly_packages")
|
|
104
|
-
|
|
105
|
-
def _clone_repository(self) -> bool:
|
|
106
|
-
"""Clone the llm_friendly_packages repository"""
|
|
107
|
-
if os.path.exists(self.llm_friendly_packages_dir):
|
|
108
|
-
return True
|
|
109
|
-
|
|
110
|
-
self.console.print("Cloning llm_friendly_packages repository...")
|
|
111
|
-
try:
|
|
112
|
-
proxy_url = self._get_current_proxy()
|
|
113
|
-
git.Repo.clone_from(proxy_url, self.llm_friendly_packages_dir)
|
|
114
|
-
self.console.print("Successfully cloned llm_friendly_packages repository")
|
|
115
|
-
return True
|
|
116
|
-
except git.exc.GitCommandError as e:
|
|
117
|
-
self.console.print(f"Error cloning repository: {e}")
|
|
118
|
-
return False
|
|
119
|
-
|
|
120
|
-
def get_docs(self, package_name: Optional[str] = None, return_paths: bool = False) -> List[str]:
|
|
121
|
-
"""
|
|
122
|
-
Get documentation for packages
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
package_name: Specific package name to get docs for, None for all packages
|
|
126
|
-
return_paths: If True, return file paths; if False, return file contents
|
|
127
|
-
|
|
128
|
-
Returns:
|
|
129
|
-
List of documentation content or file paths
|
|
130
|
-
"""
|
|
131
|
-
docs = []
|
|
132
|
-
|
|
133
|
-
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
134
|
-
return docs
|
|
135
|
-
|
|
136
|
-
memory = self._load_memory()
|
|
137
|
-
libs = list(memory.get("libs", {}).keys())
|
|
138
|
-
|
|
139
|
-
for domain in os.listdir(self.llm_friendly_packages_dir):
|
|
140
|
-
domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
|
|
141
|
-
if not os.path.isdir(domain_path):
|
|
142
|
-
continue
|
|
143
|
-
|
|
144
|
-
for username in os.listdir(domain_path):
|
|
145
|
-
username_path = os.path.join(domain_path, username)
|
|
146
|
-
if not os.path.isdir(username_path):
|
|
147
|
-
continue
|
|
148
|
-
|
|
149
|
-
for lib_name in os.listdir(username_path):
|
|
150
|
-
lib_path = os.path.join(username_path, lib_name)
|
|
151
|
-
|
|
152
|
-
# Check if this is the requested package
|
|
153
|
-
if not os.path.isdir(lib_path):
|
|
154
|
-
continue
|
|
155
|
-
|
|
156
|
-
if package_name is not None:
|
|
157
|
-
if not (lib_name == package_name or
|
|
158
|
-
package_name == os.path.join(username, lib_name)):
|
|
159
|
-
continue
|
|
160
|
-
|
|
161
|
-
# Check if library is added
|
|
162
|
-
if lib_name not in libs:
|
|
163
|
-
continue
|
|
164
|
-
|
|
165
|
-
# Collect markdown files
|
|
166
|
-
for root, _, files in os.walk(lib_path):
|
|
167
|
-
for file in files:
|
|
168
|
-
if file.endswith(".md"):
|
|
169
|
-
file_path = os.path.join(root, file)
|
|
170
|
-
if return_paths:
|
|
171
|
-
docs.append(file_path)
|
|
172
|
-
else:
|
|
173
|
-
try:
|
|
174
|
-
with open(file_path, "r", encoding="utf-8") as f:
|
|
175
|
-
docs.append(f.read())
|
|
176
|
-
except Exception as e:
|
|
177
|
-
self.console.print(f"Error reading {file_path}: {e}")
|
|
178
|
-
|
|
179
|
-
return docs
|
|
58
|
+
"""Get current proxy URL from memory"""
|
|
59
|
+
return self.memory_manager.get_config("lib-proxy", self.default_proxy_url)
|
|
180
60
|
|
|
181
|
-
|
|
182
|
-
"""
|
|
183
|
-
Get the full path of a package by its name
|
|
184
|
-
|
|
185
|
-
Args:
|
|
186
|
-
package_name: Package name (can be just lib_name or username/lib_name)
|
|
187
|
-
|
|
188
|
-
Returns:
|
|
189
|
-
Full path to the package directory, or None if not found
|
|
190
|
-
"""
|
|
191
|
-
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
192
|
-
return None
|
|
193
|
-
|
|
194
|
-
for domain in os.listdir(self.llm_friendly_packages_dir):
|
|
195
|
-
domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
|
|
196
|
-
if not os.path.isdir(domain_path):
|
|
197
|
-
continue
|
|
198
|
-
|
|
199
|
-
for username in os.listdir(domain_path):
|
|
200
|
-
username_path = os.path.join(domain_path, username)
|
|
201
|
-
if not os.path.isdir(username_path):
|
|
202
|
-
continue
|
|
203
|
-
|
|
204
|
-
for lib_name in os.listdir(username_path):
|
|
205
|
-
lib_path = os.path.join(username_path, lib_name)
|
|
206
|
-
if not os.path.isdir(lib_path):
|
|
207
|
-
continue
|
|
208
|
-
|
|
209
|
-
# Check if this matches the requested package
|
|
210
|
-
if (lib_name == package_name or
|
|
211
|
-
package_name == os.path.join(username, lib_name)):
|
|
212
|
-
return lib_path
|
|
213
|
-
|
|
214
|
-
return None
|
|
61
|
+
# ======== Library Management ========
|
|
215
62
|
|
|
216
63
|
def list_added_libraries(self) -> List[str]:
|
|
217
64
|
"""List all added libraries"""
|
|
218
|
-
|
|
219
|
-
return list(memory.get("libs", {}).keys())
|
|
65
|
+
return list(self.memory_manager.get_libs().keys())
|
|
220
66
|
|
|
221
|
-
def list_all_available_libraries(self) ->
|
|
67
|
+
def list_all_available_libraries(self) -> LibraryList:
|
|
222
68
|
"""List all available libraries in the repository"""
|
|
223
69
|
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
224
70
|
return []
|
|
225
71
|
|
|
226
72
|
available_libs = []
|
|
227
|
-
|
|
228
|
-
added_libs = set(memory.get("libs", {}).keys())
|
|
73
|
+
added_libs = set(self.memory_manager.get_libs().keys())
|
|
229
74
|
|
|
230
75
|
for domain in os.listdir(self.llm_friendly_packages_dir):
|
|
231
76
|
domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
|
|
@@ -277,14 +122,11 @@ class LLMFriendlyPackageManager:
|
|
|
277
122
|
if not self._clone_repository():
|
|
278
123
|
return False
|
|
279
124
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
if lib_name in memory["libs"]:
|
|
125
|
+
if self.memory_manager.has_lib(lib_name):
|
|
283
126
|
self.console.print(f"Library {lib_name} is already added")
|
|
284
127
|
return False
|
|
285
128
|
|
|
286
|
-
|
|
287
|
-
self._save_memory(memory)
|
|
129
|
+
self.memory_manager.add_lib(lib_name, {})
|
|
288
130
|
self.console.print(f"Added library: {lib_name}")
|
|
289
131
|
return True
|
|
290
132
|
|
|
@@ -298,50 +140,146 @@ class LLMFriendlyPackageManager:
|
|
|
298
140
|
Returns:
|
|
299
141
|
True if successful, False otherwise
|
|
300
142
|
"""
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
if lib_name not in memory["libs"]:
|
|
143
|
+
if not self.memory_manager.has_lib(lib_name):
|
|
304
144
|
self.console.print(f"Library {lib_name} is not in the list")
|
|
305
145
|
return False
|
|
306
146
|
|
|
307
|
-
|
|
308
|
-
self._save_memory(memory)
|
|
147
|
+
self.memory_manager.remove_lib(lib_name)
|
|
309
148
|
self.console.print(f"Removed library: {lib_name}")
|
|
310
149
|
return True
|
|
311
150
|
|
|
312
|
-
def
|
|
151
|
+
def has_library(self, lib_name: str) -> bool:
|
|
152
|
+
"""Check if library is added"""
|
|
153
|
+
return self.memory_manager.has_lib(lib_name)
|
|
154
|
+
|
|
155
|
+
def get_package_path(self, package_name: str) -> Optional[str]:
|
|
313
156
|
"""
|
|
314
|
-
|
|
157
|
+
Get the full path of a package by its name
|
|
315
158
|
|
|
316
159
|
Args:
|
|
317
|
-
|
|
160
|
+
package_name: Package name (can be just lib_name or username/lib_name)
|
|
318
161
|
|
|
319
162
|
Returns:
|
|
320
|
-
|
|
163
|
+
Full path to the package directory, or None if not found
|
|
321
164
|
"""
|
|
322
|
-
|
|
165
|
+
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
166
|
+
return None
|
|
323
167
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
168
|
+
for domain in os.listdir(self.llm_friendly_packages_dir):
|
|
169
|
+
domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
|
|
170
|
+
if not os.path.isdir(domain_path):
|
|
171
|
+
continue
|
|
172
|
+
|
|
173
|
+
for username in os.listdir(domain_path):
|
|
174
|
+
username_path = os.path.join(domain_path, username)
|
|
175
|
+
if not os.path.isdir(username_path):
|
|
176
|
+
continue
|
|
177
|
+
|
|
178
|
+
for lib_name in os.listdir(username_path):
|
|
179
|
+
lib_path = os.path.join(username_path, lib_name)
|
|
180
|
+
if not os.path.isdir(lib_path):
|
|
181
|
+
continue
|
|
182
|
+
|
|
183
|
+
# Check if this matches the requested package
|
|
184
|
+
if (lib_name == package_name or
|
|
185
|
+
package_name == os.path.join(username, lib_name)):
|
|
186
|
+
return lib_path
|
|
328
187
|
|
|
329
|
-
|
|
330
|
-
self._save_memory(memory)
|
|
331
|
-
self.console.print(f"Set proxy to: {proxy_url}")
|
|
332
|
-
return proxy_url
|
|
188
|
+
return None
|
|
333
189
|
|
|
334
|
-
|
|
190
|
+
# ======== Documentation Management ========
|
|
191
|
+
|
|
192
|
+
def get_docs(self, package_name: Optional[str] = None, return_paths: bool = False) -> DocsList:
|
|
335
193
|
"""
|
|
336
|
-
|
|
194
|
+
Get documentation for packages
|
|
337
195
|
|
|
196
|
+
Args:
|
|
197
|
+
package_name: Specific package name to get docs for, None for all packages
|
|
198
|
+
return_paths: If True, return file paths; if False, return file contents
|
|
199
|
+
|
|
338
200
|
Returns:
|
|
339
|
-
|
|
201
|
+
List of documentation content or file paths
|
|
340
202
|
"""
|
|
203
|
+
docs = []
|
|
204
|
+
|
|
205
|
+
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
206
|
+
return docs
|
|
207
|
+
|
|
208
|
+
libs = list(self.memory_manager.get_libs().keys())
|
|
209
|
+
|
|
210
|
+
for domain in os.listdir(self.llm_friendly_packages_dir):
|
|
211
|
+
domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
|
|
212
|
+
if not os.path.isdir(domain_path):
|
|
213
|
+
continue
|
|
214
|
+
|
|
215
|
+
for username in os.listdir(domain_path):
|
|
216
|
+
username_path = os.path.join(domain_path, username)
|
|
217
|
+
if not os.path.isdir(username_path):
|
|
218
|
+
continue
|
|
219
|
+
|
|
220
|
+
for lib_name in os.listdir(username_path):
|
|
221
|
+
lib_path = os.path.join(username_path, lib_name)
|
|
222
|
+
|
|
223
|
+
# Check if this is the requested package
|
|
224
|
+
if not os.path.isdir(lib_path):
|
|
225
|
+
continue
|
|
226
|
+
|
|
227
|
+
if package_name is not None:
|
|
228
|
+
if not (lib_name == package_name or
|
|
229
|
+
package_name == os.path.join(username, lib_name)):
|
|
230
|
+
continue
|
|
231
|
+
|
|
232
|
+
# Check if library is added
|
|
233
|
+
if lib_name not in libs:
|
|
234
|
+
continue
|
|
235
|
+
|
|
236
|
+
# Collect markdown files
|
|
237
|
+
for root, _, files in os.walk(lib_path):
|
|
238
|
+
for file in files:
|
|
239
|
+
if file.endswith(".md"):
|
|
240
|
+
file_path = os.path.join(root, file)
|
|
241
|
+
if return_paths:
|
|
242
|
+
docs.append(file_path)
|
|
243
|
+
else:
|
|
244
|
+
try:
|
|
245
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
246
|
+
docs.append(f.read())
|
|
247
|
+
except Exception as e:
|
|
248
|
+
self.console.print(f"Error reading {file_path}: {e}")
|
|
249
|
+
|
|
250
|
+
return docs
|
|
251
|
+
|
|
252
|
+
def get_library_docs_paths(self, package_name: str) -> List[str]:
|
|
253
|
+
"""Get documentation file paths for a specific package"""
|
|
254
|
+
return self.get_docs(package_name, return_paths=True)
|
|
255
|
+
|
|
256
|
+
def get_library_docs_content(self, package_name: str) -> List[str]:
|
|
257
|
+
"""Get documentation content for a specific package"""
|
|
258
|
+
return self.get_docs(package_name, return_paths=False)
|
|
259
|
+
|
|
260
|
+
# ======== Repository Management ========
|
|
261
|
+
|
|
262
|
+
def _clone_repository(self) -> bool:
|
|
263
|
+
"""Clone the llm_friendly_packages repository"""
|
|
264
|
+
if os.path.exists(self.llm_friendly_packages_dir):
|
|
265
|
+
return True
|
|
266
|
+
|
|
267
|
+
self.console.print("Cloning llm_friendly_packages repository...")
|
|
268
|
+
try:
|
|
269
|
+
proxy_url = self._get_current_proxy()
|
|
270
|
+
git.Repo.clone_from(proxy_url, self.llm_friendly_packages_dir)
|
|
271
|
+
self.console.print("Successfully cloned llm_friendly_packages repository")
|
|
272
|
+
return True
|
|
273
|
+
except GitCommandError as e:
|
|
274
|
+
self.console.print(f"Error cloning repository: {e}")
|
|
275
|
+
return False
|
|
276
|
+
|
|
277
|
+
def refresh_repository(self) -> bool:
|
|
278
|
+
"""Refresh the repository by pulling latest changes"""
|
|
341
279
|
if not os.path.exists(self.llm_friendly_packages_dir):
|
|
342
280
|
self.console.print(
|
|
343
281
|
"llm_friendly_packages repository does not exist. "
|
|
344
|
-
"Please
|
|
282
|
+
"Please call add_library() first to clone it."
|
|
345
283
|
)
|
|
346
284
|
return False
|
|
347
285
|
|
|
@@ -350,8 +288,7 @@ class LLMFriendlyPackageManager:
|
|
|
350
288
|
origin = repo.remotes.origin
|
|
351
289
|
|
|
352
290
|
# Update remote URL if proxy is set
|
|
353
|
-
|
|
354
|
-
proxy_url = memory.get("lib-proxy")
|
|
291
|
+
proxy_url = self._get_current_proxy()
|
|
355
292
|
current_url = origin.url
|
|
356
293
|
|
|
357
294
|
if proxy_url and proxy_url != current_url:
|
|
@@ -362,21 +299,42 @@ class LLMFriendlyPackageManager:
|
|
|
362
299
|
self.console.print("Successfully updated llm_friendly_packages repository")
|
|
363
300
|
return True
|
|
364
301
|
|
|
365
|
-
except
|
|
302
|
+
except GitCommandError as e:
|
|
366
303
|
self.console.print(f"Error updating repository: {e}")
|
|
367
304
|
return False
|
|
368
305
|
|
|
369
|
-
def
|
|
370
|
-
"""
|
|
371
|
-
|
|
306
|
+
def set_proxy(self, proxy_url: Optional[str] = None) -> str:
|
|
307
|
+
"""Set or get proxy URL"""
|
|
308
|
+
if proxy_url is None:
|
|
309
|
+
current_proxy = self._get_current_proxy()
|
|
310
|
+
self.console.print(f"Current proxy: {current_proxy}")
|
|
311
|
+
return current_proxy
|
|
372
312
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
"""
|
|
379
|
-
|
|
313
|
+
self.memory_manager.set_config("lib-proxy", proxy_url)
|
|
314
|
+
self.console.print(f"Set proxy to: {proxy_url}")
|
|
315
|
+
return proxy_url
|
|
316
|
+
|
|
317
|
+
def get_repository_info(self) -> RepositoryInfo:
|
|
318
|
+
"""Get repository information"""
|
|
319
|
+
exists = os.path.exists(self.llm_friendly_packages_dir)
|
|
320
|
+
proxy_url = self._get_current_proxy()
|
|
321
|
+
|
|
322
|
+
last_updated = None
|
|
323
|
+
if exists:
|
|
324
|
+
try:
|
|
325
|
+
repo = git.Repo(self.llm_friendly_packages_dir)
|
|
326
|
+
last_commit = repo.head.commit
|
|
327
|
+
last_updated = last_commit.committed_datetime.isoformat()
|
|
328
|
+
except Exception:
|
|
329
|
+
pass
|
|
330
|
+
|
|
331
|
+
return RepositoryInfo(
|
|
332
|
+
exists=exists,
|
|
333
|
+
url=proxy_url,
|
|
334
|
+
last_updated=last_updated
|
|
335
|
+
)
|
|
336
|
+
|
|
337
|
+
# ======== Display Management ========
|
|
380
338
|
|
|
381
339
|
def display_added_libraries(self) -> None:
|
|
382
340
|
"""Display added libraries in a table"""
|
|
@@ -440,4 +398,19 @@ class LLMFriendlyPackageManager:
|
|
|
440
398
|
table.add_column("File Path", style="cyan")
|
|
441
399
|
|
|
442
400
|
for doc in docs:
|
|
443
|
-
table.add_row(doc)
|
|
401
|
+
table.add_row(doc)
|
|
402
|
+
|
|
403
|
+
self.console.print(table)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
def get_package_manager(project_root: Optional[str] = None) -> LLMFriendlyPackageManager:
|
|
407
|
+
"""
|
|
408
|
+
Get package manager instance
|
|
409
|
+
|
|
410
|
+
Args:
|
|
411
|
+
project_root: Project root directory
|
|
412
|
+
|
|
413
|
+
Returns:
|
|
414
|
+
LLMFriendlyPackageManager instance
|
|
415
|
+
"""
|
|
416
|
+
return LLMFriendlyPackageManager(project_root)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Data models for LLM Friendly Package Manager
|
|
3
|
+
|
|
4
|
+
This module defines the core data structures used throughout the package manager.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from typing import Optional, List, Dict, Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class LibraryInfo:
|
|
13
|
+
"""Information about a library in the repository"""
|
|
14
|
+
domain: str
|
|
15
|
+
username: str
|
|
16
|
+
lib_name: str
|
|
17
|
+
full_path: str
|
|
18
|
+
is_added: bool
|
|
19
|
+
has_md_files: bool = True
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class PackageDoc:
|
|
24
|
+
"""Package documentation information"""
|
|
25
|
+
file_path: str
|
|
26
|
+
content: Optional[str] = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class RepositoryInfo:
|
|
31
|
+
"""Information about the repository state"""
|
|
32
|
+
exists: bool
|
|
33
|
+
url: str
|
|
34
|
+
last_updated: Optional[str] = None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Type aliases for better type hints
|
|
38
|
+
LibraryList = List[LibraryInfo]
|
|
39
|
+
DocsList = List[str]
|
|
40
|
+
ConfigDict = Dict[str, Any]
|