auto-coder 0.1.379__tar.gz → 0.1.381__tar.gz
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-0.1.379 → auto_coder-0.1.381}/PKG-INFO +2 -1
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/PKG-INFO +2 -1
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/SOURCES.txt +4 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/requires.txt +1 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/execute_command_tool_resolver.py +2 -3
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/manager.py +1 -1
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit.py +2 -36
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +48 -8
- auto_coder-0.1.381/src/autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +70 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/python_linter.py +2 -22
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/reactjs_linter.py +8 -1
- auto_coder-0.1.381/src/autocoder/linters/test_python_linter.py +166 -0
- auto_coder-0.1.381/src/autocoder/linters/test_reactjs_linter.py +183 -0
- auto_coder-0.1.381/src/autocoder/linters/test_vue_linter.py +217 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/vue_linter.py +9 -1
- auto_coder-0.1.381/src/autocoder/version.py +2 -0
- auto_coder-0.1.379/src/autocoder/version.py +0 -2
- {auto_coder-0.1.379 → auto_coder-0.1.381}/LICENSE +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/README.md +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/setup.cfg +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/setup.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_learn.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agent_hub.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agentic_lang.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agentic_tool_display.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/base_agent.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/default_tools.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/test_base_agent.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tool_registry.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/example_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/talk_to_group_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/talk_to_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/auto_coder.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/auto_coder_runner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat/conf_command.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat/models_command.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat/rules_command.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/auto_coder_lang.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_completer_v2.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/examples.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conversations/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conversations/compatibility.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conversations/conversation_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/conversations/example.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/test_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/backup.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/conversation_checkpoint.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/examples.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/store.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_backup.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_store.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_monitor/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/file_monitor/monitor.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/ignore_file_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/test_ignore_file_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/model_speed_tester.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/rulefiles/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/rulefiles/autocoderrules_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/run_cmd.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/save_formatted_log.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/test_run_cmd.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/utils_code_auto_generate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/list_code_definition_names_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/normal_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/helper/rag_doc_creator.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/normal_linter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/agentic_rag.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/failed_files_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/filter_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/image_loader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/long_context_rag.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/test_doc_filter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/test_long_context_rag.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/test_token_limiter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/tools/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/tools/recall_tool.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/tools/search_tool.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_planner.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.379 → auto_coder-0.1.381}/tests/test_symbols_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: auto-coder
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.381
|
|
4
4
|
Summary: AutoCoder: AutoCoder
|
|
5
5
|
Author: allwefantasy
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -43,6 +43,7 @@ Requires-Dist: python-docx
|
|
|
43
43
|
Requires-Dist: docx2txt
|
|
44
44
|
Requires-Dist: pdf2image
|
|
45
45
|
Requires-Dist: docx2pdf
|
|
46
|
+
Requires-Dist: pypdf
|
|
46
47
|
Requires-Dist: pyperclip
|
|
47
48
|
Requires-Dist: colorama
|
|
48
49
|
Requires-Dist: pylint
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: auto-coder
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.381
|
|
4
4
|
Summary: AutoCoder: AutoCoder
|
|
5
5
|
Author: allwefantasy
|
|
6
6
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -43,6 +43,7 @@ Requires-Dist: python-docx
|
|
|
43
43
|
Requires-Dist: docx2txt
|
|
44
44
|
Requires-Dist: pdf2image
|
|
45
45
|
Requires-Dist: docx2pdf
|
|
46
|
+
Requires-Dist: pypdf
|
|
46
47
|
Requires-Dist: pyperclip
|
|
47
48
|
Requires-Dist: colorama
|
|
48
49
|
Requires-Dist: pylint
|
|
@@ -196,6 +196,7 @@ src/autocoder/common/v2/agent/agentic_edit_tools/plan_mode_respond_tool_resolver
|
|
|
196
196
|
src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py
|
|
197
197
|
src/autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py
|
|
198
198
|
src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py
|
|
199
|
+
src/autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py
|
|
199
200
|
src/autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py
|
|
200
201
|
src/autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py
|
|
201
202
|
src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py
|
|
@@ -249,6 +250,9 @@ src/autocoder/linters/normal_linter.py
|
|
|
249
250
|
src/autocoder/linters/python_linter.py
|
|
250
251
|
src/autocoder/linters/reactjs_linter.py
|
|
251
252
|
src/autocoder/linters/shadow_linter.py
|
|
253
|
+
src/autocoder/linters/test_python_linter.py
|
|
254
|
+
src/autocoder/linters/test_reactjs_linter.py
|
|
255
|
+
src/autocoder/linters/test_vue_linter.py
|
|
252
256
|
src/autocoder/linters/vue_linter.py
|
|
253
257
|
src/autocoder/memory/__init__.py
|
|
254
258
|
src/autocoder/memory/active_context_manager.py
|
|
@@ -19,7 +19,6 @@ class ExecuteCommandToolResolver(BaseToolResolver):
|
|
|
19
19
|
self.tool: ExecuteCommandTool = tool # For type hinting
|
|
20
20
|
|
|
21
21
|
def resolve(self) -> ToolResult:
|
|
22
|
-
printer = Printer()
|
|
23
22
|
command = self.tool.command
|
|
24
23
|
requires_approval = self.tool.requires_approval
|
|
25
24
|
source_dir = self.args.source_dir or "."
|
|
@@ -35,11 +34,11 @@ class ExecuteCommandToolResolver(BaseToolResolver):
|
|
|
35
34
|
# Approval mechanism (simplified)
|
|
36
35
|
if requires_approval:
|
|
37
36
|
# In a real scenario, this would involve user interaction
|
|
38
|
-
|
|
37
|
+
logger.info(f"Command requires approval: {command}")
|
|
39
38
|
# For now, let's assume approval is granted in non-interactive mode or handled elsewhere
|
|
40
39
|
pass
|
|
41
40
|
|
|
42
|
-
|
|
41
|
+
logger.info(f"Executing command: {command} in {os.path.abspath(source_dir)}")
|
|
43
42
|
try:
|
|
44
43
|
# 使用封装的run_cmd方法执行命令
|
|
45
44
|
if get_run_context().is_web():
|
{auto_coder-0.1.379 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/manager.py
RENAMED
|
@@ -37,7 +37,7 @@ class CommandManager:
|
|
|
37
37
|
os.makedirs(self.commands_dir, exist_ok=True)
|
|
38
38
|
logger.info(f"已创建命令目录: {self.commands_dir}")
|
|
39
39
|
|
|
40
|
-
def list_command_files(self, recursive: bool =
|
|
40
|
+
def list_command_files(self, recursive: bool = True) -> ListCommandsResult:
|
|
41
41
|
"""
|
|
42
42
|
列出命令目录中的所有命令文件
|
|
43
43
|
|
|
@@ -391,20 +391,7 @@ class AgenticEdit:
|
|
|
391
391
|
Your final result description here
|
|
392
392
|
</result>
|
|
393
393
|
<command>Command to demonstrate result (optional)</command>
|
|
394
|
-
</attempt_completion>
|
|
395
|
-
|
|
396
|
-
## plan_mode_respond
|
|
397
|
-
Description: Respond to the user's inquiry in an effort to plan a solution to the user's task. This tool should be used when you need to provide a response to a question or statement from the user about how you plan to accomplish the task. This tool is only available in PLAN MODE. The environment_details will specify the current mode, if it is not PLAN MODE then you should not use this tool. Depending on the user's message, you may ask questions to get clarification about the user's request, architect a solution to the task, and to brainstorm ideas with the user. For example, if the user's task is to create a website, you may start by asking some clarifying questions, then present a detailed plan for how you will accomplish the task given the context, and perhaps engage in a back and forth to finalize the details before the user switches you to ACT MODE to implement the solution.
|
|
398
|
-
Parameters:
|
|
399
|
-
- response: (required) The response to provide to the user. Do not try to use tools in this parameter, this is simply a chat response. (You MUST use the response parameter, do not simply place the response text directly within <plan_mode_respond> tags.)
|
|
400
|
-
- options: (optional) An array of 2-5 options for the user to choose from. Each option should be a string describing a possible choice or path forward in the planning process. This can help guide the discussion and make it easier for the user to provide input on key decisions. You may not always need to provide options, but it may be helpful in many cases where it can save the user from having to type out a response manually. Do NOT present an option to toggle to Act mode, as this will be something you need to direct the user to do manually themselves.
|
|
401
|
-
Usage:
|
|
402
|
-
<plan_mode_respond>
|
|
403
|
-
<response>Your response here</response>
|
|
404
|
-
<options>
|
|
405
|
-
Array of options here (optional), e.g. ["Option 1", "Option 2", "Option 3"]
|
|
406
|
-
</options>
|
|
407
|
-
</plan_mode_respond>
|
|
394
|
+
</attempt_completion>
|
|
408
395
|
|
|
409
396
|
## mcp_tool
|
|
410
397
|
Description: Request to execute a tool via the Model Context Protocol (MCP) server. Use this when you need to execute a tool that is not natively supported by the agentic edit tools.
|
|
@@ -596,28 +583,7 @@ class AgenticEdit:
|
|
|
596
583
|
|
|
597
584
|
By thoughtfully selecting between write_to_file and replace_in_file, you can make your file editing process smoother, safer, and more efficient.
|
|
598
585
|
|
|
599
|
-
====
|
|
600
|
-
|
|
601
|
-
ACT MODE V.S. PLAN MODE
|
|
602
|
-
|
|
603
|
-
In each user message, the environment_details will specify the current mode. There are two modes:
|
|
604
|
-
|
|
605
|
-
- ACT MODE: In this mode, you have access to all tools EXCEPT the plan_mode_respond tool.
|
|
606
|
-
- In ACT MODE, you use tools to accomplish the user's task. Once you've completed the user's task, you use the attempt_completion tool to present the result of the task to the user.
|
|
607
|
-
- PLAN MODE: In this special mode, you have access to the plan_mode_respond tool.
|
|
608
|
-
- In PLAN MODE, the goal is to gather information and get context to create a detailed plan for accomplishing the task, which the user will review and approve before they switch you to ACT MODE to implement the solution.
|
|
609
|
-
- In PLAN MODE, when you need to converse with the user or present a plan, you should use the plan_mode_respond tool to deliver your response directly, rather than using <thinking> tags to analyze when to respond. Do not talk about using plan_mode_respond - just use it directly to share your thoughts and provide helpful answers.
|
|
610
|
-
|
|
611
|
-
## What is PLAN MODE?
|
|
612
|
-
|
|
613
|
-
- While you are usually in ACT MODE, the user may switch to PLAN MODE in order to have a back and forth with you to plan how to best accomplish the task.
|
|
614
|
-
- When starting in PLAN MODE, depending on the user's request, you may need to do some information gathering e.g. using read_file or search_files to get more context about the task. You may also ask the user clarifying questions to get a better understanding of the task. You may return mermaid diagrams to visually display your understanding.
|
|
615
|
-
- Once you've gained more context about the user's request, you should architect a detailed plan for how you will accomplish the task. Returning mermaid diagrams may be helpful here as well.
|
|
616
|
-
- Then you might ask the user if they are pleased with this plan, or if they would like to make any changes. Think of this as a brainstorming session where you can discuss the task and plan the best way to accomplish it.
|
|
617
|
-
- If at any point a mermaid diagram would make your plan clearer to help the user quickly see the structure, you are encouraged to include a Mermaid code block in the response. (Note: if you use colors in your mermaid diagrams, be sure to use high contrast colors so the text is readable.)
|
|
618
|
-
- Finally once it seems like you've reached a good plan, ask the user to switch you back to ACT MODE to implement the solution.
|
|
619
|
-
|
|
620
|
-
====
|
|
586
|
+
====
|
|
621
587
|
|
|
622
588
|
PACKAGE CONTEXT INFORMATION
|
|
623
589
|
|
|
@@ -8,6 +8,9 @@ from autocoder.common import shells
|
|
|
8
8
|
from autocoder.common.printer import Printer
|
|
9
9
|
from loguru import logger
|
|
10
10
|
import typing
|
|
11
|
+
from autocoder.common.context_pruner import PruneContext
|
|
12
|
+
from autocoder.rag.token_counter import count_tokens
|
|
13
|
+
from autocoder.common import SourceCode
|
|
11
14
|
from autocoder.common import AutoCoderArgs
|
|
12
15
|
from autocoder.events.event_manager_singleton import get_event_manager
|
|
13
16
|
from autocoder.run_context import get_run_context
|
|
@@ -18,9 +21,42 @@ class ExecuteCommandToolResolver(BaseToolResolver):
|
|
|
18
21
|
def __init__(self, agent: Optional['AgenticEdit'], tool: ExecuteCommandTool, args: AutoCoderArgs):
|
|
19
22
|
super().__init__(agent, tool, args)
|
|
20
23
|
self.tool: ExecuteCommandTool = tool # For type hinting
|
|
24
|
+
self.context_pruner = PruneContext(
|
|
25
|
+
max_tokens=self.args.context_prune_safe_zone_tokens,
|
|
26
|
+
args=self.args,
|
|
27
|
+
llm=self.agent.context_prune_llm
|
|
28
|
+
)
|
|
21
29
|
|
|
22
|
-
def
|
|
23
|
-
|
|
30
|
+
def _prune_file_content(self, content: str, file_path: str) -> str:
|
|
31
|
+
"""对文件内容进行剪枝处理"""
|
|
32
|
+
if not self.context_pruner:
|
|
33
|
+
return content
|
|
34
|
+
|
|
35
|
+
# 计算 token 数量
|
|
36
|
+
tokens = count_tokens(content)
|
|
37
|
+
if tokens <= self.args.context_prune_safe_zone_tokens:
|
|
38
|
+
return content
|
|
39
|
+
|
|
40
|
+
# 创建 SourceCode 对象
|
|
41
|
+
source_code = SourceCode(
|
|
42
|
+
module_name=file_path,
|
|
43
|
+
source_code=content,
|
|
44
|
+
tokens=tokens
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# 使用 context_pruner 进行剪枝
|
|
48
|
+
pruned_sources = self.context_pruner.handle_overflow(
|
|
49
|
+
file_sources=[source_code],
|
|
50
|
+
conversations=self.agent.current_conversations if self.agent else [],
|
|
51
|
+
strategy=self.args.context_prune_strategy
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
if not pruned_sources:
|
|
55
|
+
return content
|
|
56
|
+
|
|
57
|
+
return pruned_sources[0].source_code
|
|
58
|
+
|
|
59
|
+
def resolve(self) -> ToolResult:
|
|
24
60
|
command = self.tool.command
|
|
25
61
|
requires_approval = self.tool.requires_approval
|
|
26
62
|
source_dir = self.args.source_dir or "."
|
|
@@ -36,11 +72,11 @@ class ExecuteCommandToolResolver(BaseToolResolver):
|
|
|
36
72
|
# Approval mechanism (simplified)
|
|
37
73
|
if requires_approval:
|
|
38
74
|
# In a real scenario, this would involve user interaction
|
|
39
|
-
|
|
75
|
+
logger.info(f"Command requires approval: {command}")
|
|
40
76
|
# For now, let's assume approval is granted in non-interactive mode or handled elsewhere
|
|
41
77
|
pass
|
|
42
78
|
|
|
43
|
-
|
|
79
|
+
logger.info(f"Executing command: {command} in {os.path.abspath(source_dir)}")
|
|
44
80
|
try:
|
|
45
81
|
# 使用封装的run_cmd方法执行命令
|
|
46
82
|
if get_run_context().is_web():
|
|
@@ -56,13 +92,17 @@ class ExecuteCommandToolResolver(BaseToolResolver):
|
|
|
56
92
|
logger.info(f"Command executed: {command}")
|
|
57
93
|
logger.info(f"Return Code: {exit_code}")
|
|
58
94
|
if output:
|
|
59
|
-
logger.info(f"Output
|
|
95
|
+
logger.info(f"Original Output (length: {len(output)} chars)") # Avoid logging potentially huge output directly
|
|
96
|
+
|
|
97
|
+
final_output = self._prune_file_content(output, "command_output")
|
|
60
98
|
|
|
61
99
|
if exit_code == 0:
|
|
62
|
-
return ToolResult(success=True, message="Command executed successfully.", content=
|
|
100
|
+
return ToolResult(success=True, message="Command executed successfully.", content=final_output)
|
|
63
101
|
else:
|
|
64
|
-
|
|
65
|
-
|
|
102
|
+
# For the human-readable error message, we might prefer the original full output.
|
|
103
|
+
# For the agent-consumable content, we provide the (potentially pruned) final_output.
|
|
104
|
+
error_message_for_human = f"Command failed with return code {exit_code}.\nOutput:\n{output}"
|
|
105
|
+
return ToolResult(success=False, message=error_message_for_human, content={"output": final_output, "returncode": exit_code})
|
|
66
106
|
|
|
67
107
|
except FileNotFoundError:
|
|
68
108
|
return ToolResult(success=False, message=f"Error: The command '{command.split()[0]}' was not found. Please ensure it is installed and in the system's PATH.")
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
from unittest.mock import MagicMock, patch
|
|
3
|
+
from autocoder.common.v2.agent.agentic_edit_tools \
|
|
4
|
+
.execute_command_tool_resolver import ExecuteCommandToolResolver
|
|
5
|
+
from autocoder.common.v2.agent.agentic_edit_types import ExecuteCommandTool
|
|
6
|
+
from autocoder.common import AutoCoderArgs
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestExecuteCommandToolResolver:
|
|
10
|
+
@pytest.fixture
|
|
11
|
+
def mock_agent(self):
|
|
12
|
+
agent = MagicMock()
|
|
13
|
+
agent.args = AutoCoderArgs()
|
|
14
|
+
agent.args.context_prune_safe_zone_tokens = 1000
|
|
15
|
+
agent.context_prune_llm = None
|
|
16
|
+
agent.current_conversations = []
|
|
17
|
+
return agent
|
|
18
|
+
|
|
19
|
+
@pytest.fixture
|
|
20
|
+
def mock_tool(self):
|
|
21
|
+
return ExecuteCommandTool(
|
|
22
|
+
command="echo 'test output'",
|
|
23
|
+
requires_approval=False
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def test_command_execution_with_token_count(self, mock_agent, mock_tool):
|
|
28
|
+
"""测试命令执行并验证token统计功能"""
|
|
29
|
+
resolver = ExecuteCommandToolResolver(mock_agent, mock_tool, mock_agent.args)
|
|
30
|
+
|
|
31
|
+
# 模拟命令执行返回大量输出
|
|
32
|
+
with patch("autocoder.common.run_cmd.run_cmd_subprocess") as mock_run_cmd:
|
|
33
|
+
mock_run_cmd.return_value = (0, "test output " * 500) # 生成大量输出
|
|
34
|
+
|
|
35
|
+
result = resolver.resolve()
|
|
36
|
+
|
|
37
|
+
assert result.success
|
|
38
|
+
assert "test output" in result.content
|
|
39
|
+
|
|
40
|
+
# 验证token统计功能
|
|
41
|
+
# 这里需要修改ExecuteCommandToolResolver来添加token统计功能
|
|
42
|
+
# 测试将失败,符合TDD的红色阶段
|
|
43
|
+
|
|
44
|
+
def test_output_pruning_when_exceeds_token_limit(self, mock_agent, mock_tool):
|
|
45
|
+
"""测试当输出超过token限制时的裁剪功能"""
|
|
46
|
+
resolver = ExecuteCommandToolResolver(mock_agent, mock_tool, mock_agent.args)
|
|
47
|
+
|
|
48
|
+
# 模拟命令执行返回大量输出
|
|
49
|
+
with patch("autocoder.common.run_cmd.run_cmd_subprocess") as mock_run_cmd:
|
|
50
|
+
mock_run_cmd.return_value = (0, "test output " * 500) # 生成大量输出
|
|
51
|
+
|
|
52
|
+
result = resolver.resolve()
|
|
53
|
+
|
|
54
|
+
assert result.success
|
|
55
|
+
# 验证输出是否被裁剪
|
|
56
|
+
# 这里需要修改ExecuteCommandToolResolver来添加裁剪功能
|
|
57
|
+
# 测试将失败,符合TDD的红色阶段
|
|
58
|
+
|
|
59
|
+
def test_command_execution_failure(self, mock_agent, mock_tool):
|
|
60
|
+
"""测试命令执行失败的情况"""
|
|
61
|
+
resolver = ExecuteCommandToolResolver(mock_agent, mock_tool, mock_agent.args)
|
|
62
|
+
|
|
63
|
+
# 模拟命令执行失败
|
|
64
|
+
with patch("autocoder.common.run_cmd.run_cmd_subprocess") as mock_run_cmd:
|
|
65
|
+
mock_run_cmd.return_value = (1, "command failed")
|
|
66
|
+
|
|
67
|
+
result = resolver.resolve()
|
|
68
|
+
|
|
69
|
+
assert not result.success
|
|
70
|
+
assert "command failed" in result.message
|
|
@@ -332,17 +332,7 @@ class PythonLinter(BaseLinter):
|
|
|
332
332
|
result['warning_count'] += pylint_result['warning_count']
|
|
333
333
|
except Exception as e:
|
|
334
334
|
if self.verbose:
|
|
335
|
-
print(f"Error running pylint: {str(e)}")
|
|
336
|
-
|
|
337
|
-
# Run flake8
|
|
338
|
-
try:
|
|
339
|
-
flake8_result = self._run_flake8(file_path)
|
|
340
|
-
result['issues'].extend(flake8_result['issues'])
|
|
341
|
-
result['error_count'] += flake8_result['error_count']
|
|
342
|
-
result['warning_count'] += flake8_result['warning_count']
|
|
343
|
-
except Exception as e:
|
|
344
|
-
if self.verbose:
|
|
345
|
-
print(f"Error running flake8: {str(e)}")
|
|
335
|
+
print(f"Error running pylint: {str(e)}")
|
|
346
336
|
|
|
347
337
|
# Mark as successful
|
|
348
338
|
result['success'] = True
|
|
@@ -400,17 +390,7 @@ class PythonLinter(BaseLinter):
|
|
|
400
390
|
except Exception as e:
|
|
401
391
|
if self.verbose:
|
|
402
392
|
print(f"Error running pylint: {str(e)}")
|
|
403
|
-
|
|
404
|
-
# Run flake8
|
|
405
|
-
try:
|
|
406
|
-
flake8_result = self._run_flake8(project_path)
|
|
407
|
-
result['issues'].extend(flake8_result['issues'])
|
|
408
|
-
result['error_count'] += flake8_result['error_count']
|
|
409
|
-
result['warning_count'] += flake8_result['warning_count']
|
|
410
|
-
except Exception as e:
|
|
411
|
-
if self.verbose:
|
|
412
|
-
print(f"Error running flake8: {str(e)}")
|
|
413
|
-
|
|
393
|
+
|
|
414
394
|
# Mark as successful
|
|
415
395
|
result['success'] = True
|
|
416
396
|
|
|
@@ -243,11 +243,18 @@ class ReactJSLinter(BaseLinter):
|
|
|
243
243
|
|
|
244
244
|
# Process individual messages
|
|
245
245
|
for message in file_result.get('messages', []):
|
|
246
|
+
severity = "info"
|
|
247
|
+
if message.get('severity', 1) == 2:
|
|
248
|
+
severity = "error"
|
|
249
|
+
elif message.get('severity', 1) == 1:
|
|
250
|
+
severity = "warning"
|
|
251
|
+
elif message.get('severity', 1) == 0:
|
|
252
|
+
severity = "info"
|
|
246
253
|
issue = {
|
|
247
254
|
'file': file_rel_path,
|
|
248
255
|
'line': message.get('line', 0),
|
|
249
256
|
'column': message.get('column', 0),
|
|
250
|
-
'severity':
|
|
257
|
+
'severity': severity,
|
|
251
258
|
'message': message.get('message', ''),
|
|
252
259
|
'rule': message.get('ruleId', 'unknown')
|
|
253
260
|
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pytest
|
|
3
|
+
import json
|
|
4
|
+
from unittest.mock import patch, MagicMock
|
|
5
|
+
from autocoder.linters.python_linter import PythonLinter
|
|
6
|
+
|
|
7
|
+
class TestPythonLinter:
|
|
8
|
+
"""测试PythonLinter类"""
|
|
9
|
+
|
|
10
|
+
def setup_method(self):
|
|
11
|
+
"""每个测试方法前的设置"""
|
|
12
|
+
self.linter = PythonLinter(verbose=True)
|
|
13
|
+
|
|
14
|
+
def test_lint_file_nonexistent_file(self):
|
|
15
|
+
"""测试不存在的文件"""
|
|
16
|
+
result = self.linter.lint_file("nonexistent_file.py")
|
|
17
|
+
|
|
18
|
+
assert result['success'] == False
|
|
19
|
+
assert "不存在" in result.get('error', '') or "does not exist" in result.get('error', '')
|
|
20
|
+
|
|
21
|
+
def test_lint_file_unsupported_file(self):
|
|
22
|
+
"""测试不支持的文件类型"""
|
|
23
|
+
# 创建一个临时文件
|
|
24
|
+
with open("temp.txt", "w") as f:
|
|
25
|
+
f.write("这不是Python文件")
|
|
26
|
+
|
|
27
|
+
try:
|
|
28
|
+
result = self.linter.lint_file("temp.txt")
|
|
29
|
+
|
|
30
|
+
assert result['success'] == False
|
|
31
|
+
assert "不支持" in result.get('error', '') or "Unsupported" in result.get('error', '')
|
|
32
|
+
finally:
|
|
33
|
+
# 清理
|
|
34
|
+
if os.path.exists("temp.txt"):
|
|
35
|
+
os.remove("temp.txt")
|
|
36
|
+
|
|
37
|
+
@patch.object(PythonLinter, '_check_dependencies')
|
|
38
|
+
@patch.object(PythonLinter, '_install_dependencies_if_needed')
|
|
39
|
+
def test_lint_file_missing_dependencies(self, mock_install, mock_check):
|
|
40
|
+
"""测试缺少依赖项的情况"""
|
|
41
|
+
# 模拟依赖检查失败
|
|
42
|
+
mock_check.return_value = False
|
|
43
|
+
# 模拟安装依赖失败
|
|
44
|
+
mock_install.return_value = False
|
|
45
|
+
|
|
46
|
+
# 创建一个临时Python文件
|
|
47
|
+
with open("temp.py", "w") as f:
|
|
48
|
+
f.write("print('Hello, World!')")
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
result = self.linter.lint_file("temp.py")
|
|
52
|
+
|
|
53
|
+
assert result['success'] == False
|
|
54
|
+
assert "依赖" in result.get('error', '') or "dependencies" in result.get('error', '')
|
|
55
|
+
finally:
|
|
56
|
+
# 清理
|
|
57
|
+
if os.path.exists("temp.py"):
|
|
58
|
+
os.remove("temp.py")
|
|
59
|
+
|
|
60
|
+
@patch.object(PythonLinter, '_check_dependencies')
|
|
61
|
+
@patch.object(PythonLinter, '_run_pylint')
|
|
62
|
+
def test_lint_file_successful(self, mock_pylint, mock_check):
|
|
63
|
+
"""测试成功的lint过程"""
|
|
64
|
+
# 模拟依赖检查成功
|
|
65
|
+
mock_check.return_value = True
|
|
66
|
+
|
|
67
|
+
# 模拟pylint结果
|
|
68
|
+
mock_pylint.return_value = {
|
|
69
|
+
'error_count': 1,
|
|
70
|
+
'warning_count': 2,
|
|
71
|
+
'issues': [
|
|
72
|
+
{
|
|
73
|
+
'file': 'test.py',
|
|
74
|
+
'line': 10,
|
|
75
|
+
'column': 5,
|
|
76
|
+
'severity': 'error',
|
|
77
|
+
'message': '未定义变量',
|
|
78
|
+
'rule': 'undefined-variable',
|
|
79
|
+
'tool': 'pylint'
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
'file': 'test.py',
|
|
83
|
+
'line': 15,
|
|
84
|
+
'column': 1,
|
|
85
|
+
'severity': 'warning',
|
|
86
|
+
'message': '不必要的空行',
|
|
87
|
+
'rule': 'trailing-whitespace',
|
|
88
|
+
'tool': 'pylint'
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# 创建一个临时Python文件
|
|
94
|
+
with open("test.py", "w") as f:
|
|
95
|
+
f.write("print('Hello, World!')")
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
result = self.linter.lint_file("test.py")
|
|
99
|
+
|
|
100
|
+
assert result['success'] == True
|
|
101
|
+
assert result['language'] == 'python'
|
|
102
|
+
assert result['files_analyzed'] == 1
|
|
103
|
+
assert result['error_count'] == 1
|
|
104
|
+
assert result['warning_count'] == 2 # 只有pylint的警告
|
|
105
|
+
assert len(result['issues']) == 2 # 总共2个问题
|
|
106
|
+
finally:
|
|
107
|
+
# 清理
|
|
108
|
+
if os.path.exists("test.py"):
|
|
109
|
+
os.remove("test.py")
|
|
110
|
+
|
|
111
|
+
# python -m pytest src/autocoder/linters/test_python_linter.py::TestPythonLinter::test_lint_real_file -v -s
|
|
112
|
+
@pytest.mark.integration
|
|
113
|
+
def test_lint_real_file(self):
|
|
114
|
+
"""测试对实际文件的lint功能"""
|
|
115
|
+
# 实际存在的Python文件路径
|
|
116
|
+
file_path = "/Users/allwefantasy/projects/auto-coder/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py"
|
|
117
|
+
|
|
118
|
+
# 检查文件是否存在,如果不存在则跳过测试
|
|
119
|
+
if not os.path.exists(file_path):
|
|
120
|
+
pytest.skip(f"测试文件 {file_path} 不存在")
|
|
121
|
+
|
|
122
|
+
# 执行lint操作
|
|
123
|
+
result = self.linter.lint_file(file_path)
|
|
124
|
+
|
|
125
|
+
# 基本断言
|
|
126
|
+
assert result['success'] == True
|
|
127
|
+
assert result['language'] == 'python'
|
|
128
|
+
assert result['files_analyzed'] == 1
|
|
129
|
+
|
|
130
|
+
# 打印完整的lint结果
|
|
131
|
+
print("\n==== Lint结果概述 ====")
|
|
132
|
+
print(f"文件: {file_path}")
|
|
133
|
+
print(f"错误数: {result['error_count']}")
|
|
134
|
+
print(f"警告数: {result['warning_count']}")
|
|
135
|
+
print(f"问题总数: {len(result['issues'])}")
|
|
136
|
+
|
|
137
|
+
print("\n==== 详细问题列表 ====")
|
|
138
|
+
if not result['issues']:
|
|
139
|
+
print("没有发现问题!")
|
|
140
|
+
else:
|
|
141
|
+
for i, issue in enumerate(result['issues'], 1):
|
|
142
|
+
print(f"\n问题 #{i}:")
|
|
143
|
+
print(f" 文件: {issue['file']}")
|
|
144
|
+
print(f" 位置: 第{issue['line']}行, 第{issue['column']}列")
|
|
145
|
+
print(f" 严重性: {issue['severity']}")
|
|
146
|
+
print(f" 信息: {issue['message']}")
|
|
147
|
+
print(f" 规则: {issue['rule']}")
|
|
148
|
+
print(f" 工具: {issue['tool']}")
|
|
149
|
+
|
|
150
|
+
# 可选:打印完整的JSON格式结果
|
|
151
|
+
print("\n==== 完整JSON结果 ====")
|
|
152
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|
|
153
|
+
|
|
154
|
+
# 验证结果中包含issues字段,且为列表类型
|
|
155
|
+
assert 'issues' in result
|
|
156
|
+
assert isinstance(result['issues'], list)
|
|
157
|
+
|
|
158
|
+
# 如果有issues,验证其结构
|
|
159
|
+
if result['issues']:
|
|
160
|
+
issue = result['issues'][0]
|
|
161
|
+
assert 'file' in issue
|
|
162
|
+
assert 'line' in issue
|
|
163
|
+
assert 'severity' in issue
|
|
164
|
+
assert 'message' in issue
|
|
165
|
+
assert 'rule' in issue
|
|
166
|
+
assert 'tool' in issue
|