auto-coder 0.1.380__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.380 → auto_coder-0.1.381}/PKG-INFO +1 -1
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/PKG-INFO +1 -1
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/SOURCES.txt +3 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/execute_command_tool_resolver.py +2 -3
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +48 -8
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/python_linter.py +2 -22
- {auto_coder-0.1.380 → 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.380 → 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.380/src/autocoder/version.py +0 -2
- {auto_coder-0.1.380 → auto_coder-0.1.381}/LICENSE +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/README.md +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/setup.cfg +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/setup.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/dependency_links.txt +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/entry_points.txt +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/requires.txt +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/auto_coder.egg-info/top_level.txt +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/agentic_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_demand_organizer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_filegroup.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_guess_query.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_learn.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_learn_from_commit.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_review_commit.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/auto_tool.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agent_hub.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agentic_lang.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/agentic_tool_display.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/base_agent.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/default_tools.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/test_base_agent.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tool_registry.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/ask_followup_question_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/example_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/plan_mode_respond_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/replace_in_file_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/talk_to_group_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/talk_to_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/base_agentic/utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/coder.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/designer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/planner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/agent/project_reader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/auto_coder.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/auto_coder_rag.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/auto_coder_runner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/auto_coder_server.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/benchmark.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat/conf_command.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat/models_command.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat/rules_command.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat_auto_coder.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/chat_auto_coder_lang.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/command_args.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/command_parser.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/commands/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/commands/auto_command.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/commands/auto_web.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/commands/tools.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/JupyterClient.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/ShellClient.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/action_yml_file_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/anything2images.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/anything2img.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/audio.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/auto_coder_lang.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/auto_configure.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/buildin_tokenizer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/chunk_validation.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/cleaner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_execute.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/code_modification_ranker.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_completer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_completer_v2.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/examples.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_file_manager/utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_generator.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/command_templates.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/computer_use.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conf_import_export.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conf_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conf_validator.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/const.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/context_pruner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conversation_pruner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conversations/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conversations/compatibility.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conversations/conversation_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/conversations/example.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/directory_cache/test_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/backup.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/conversation_checkpoint.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/examples.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/store.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_backup.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_store.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/test_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_checkpoint/utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_monitor/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/file_monitor/monitor.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/files.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/git_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/global_cancel.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/ignore_file_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/ignorefiles/test_ignore_file_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/image_to_page.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/index_import_export.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/interpreter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_hub.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_server.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_server_install.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_server_types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/mcp_server_gpt4o_mini_search.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_servers/mcp_server_perplexity.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/mcp_tools.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/memory_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/model_speed_tester.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/openai_content.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/printer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/recall_validation.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/result_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/rulefiles/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/rulefiles/autocoderrules_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/run_cmd.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/save_formatted_log.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/screenshots.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/search.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/search_replace.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/shells.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/stats_panel.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/stream_out_type.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/sys_prompt.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/test_run_cmd.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/text.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/token_cost_caculate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/utils_code_auto_generate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/__init__.py +0 -0
- {auto_coder-0.1.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/attempt_completion_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → 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.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → 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.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +0 -0
- {auto_coder-0.1.380 → 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.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_edit_types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/agent/agentic_tool_display.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_agentic_editblock_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_editblock.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_generate_strict_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_auto_merge_strict_diff.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_diff_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_editblock_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/common/v2/code_strict_diff_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/base_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_config_api.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_config_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/compiler_factory.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/java_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/normal_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/provided_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/python_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/reactjs_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/shadow_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/compilers/vue_compiler.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/data/byzerllm.md +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/data/tokenizer.json +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/db/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/db/store.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/action.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/copilot.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/plugins/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/dispacher/actions/plugins/action_regex_project.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/event_content.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/event_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/event_manager_singleton.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/event_store.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/events/event_types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/helper/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/helper/project_creator.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/helper/rag_doc_creator.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/entry.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/filter/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/filter/normal_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/filter/quick_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/for_command.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/index.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/symbols_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/index/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/lang.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/base_linter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/linter_factory.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/normal_linter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/linters/shadow_linter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/memory/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/memory/active_context_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/memory/active_package.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/memory/async_processor.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/memory/directory_mapper.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/models.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/dynamic_completion_example.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/git_helper_plugin.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/sample_plugin.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/token_helper_plugin.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/plugins/utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/privacy/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/privacy/model_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/pyproject/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/agentic_rag.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/api_server.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/base_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/byzer_storage_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/cache_result_merge.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/failed_files_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/file_monitor_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/local_byzer_storage_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/local_duckdb_storage_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/rag_file_meta.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/cache/simple_cache.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/conversation_to_queries.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/doc_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/document_retriever.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/lang.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/llm_wrapper.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/docx_loader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/excel_loader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/filter_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/image_loader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/pdf_loader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/loaders/ppt_loader.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/long_context_rag.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/qa_conversation_strategy.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/rag_config.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/rag_entry.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/relevant_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/searchable.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/event_writer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/stream_event/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/test_doc_filter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/test_long_context_rag.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/test_token_limiter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/token_checker.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/token_counter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/token_limiter.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/token_limiter_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/tools/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/tools/recall_tool.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/tools/search_tool.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/rag/variable_holder.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/regexproject/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/run_context.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/shadows/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/shadows/shadow_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/suffixproject/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/tsproject/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/_markitdown.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/auto_coder_utils/chat_stream_out.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/auto_project_type.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/chat_auto_coder_utils/__init__.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/conversation_store.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/llm_client_interceptors.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/llms.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/log_capture.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/model_provider_selector.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/multi_turn.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/operate_config_api.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/print_table.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/project_structure.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/queue_communicate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/request_event_queue.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/request_queue.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/rest.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/stream_thinking.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/thread_utils.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/src/autocoder/utils/types.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_action_regex_project.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_action_yml_file_manager.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_chat_auto_coder.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_code_auto_merge_editblock.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_command_completer.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_planner.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_plugins.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_privacy.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_queue_communicate.py +0 -0
- {auto_coder-0.1.380 → auto_coder-0.1.381}/tests/test_symbols_utils.py +0 -0
|
@@ -250,6 +250,9 @@ src/autocoder/linters/normal_linter.py
|
|
|
250
250
|
src/autocoder/linters/python_linter.py
|
|
251
251
|
src/autocoder/linters/reactjs_linter.py
|
|
252
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
|
|
253
256
|
src/autocoder/linters/vue_linter.py
|
|
254
257
|
src/autocoder/memory/__init__.py
|
|
255
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():
|
|
@@ -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.")
|
|
@@ -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
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import pytest
|
|
3
|
+
import json
|
|
4
|
+
from unittest.mock import patch, MagicMock
|
|
5
|
+
from autocoder.linters.reactjs_linter import ReactJSLinter
|
|
6
|
+
|
|
7
|
+
# python -m pytest src/autocoder/linters/test_reactjs_linter.py::TestReactJSLinter::test_lint_real_file -v -s
|
|
8
|
+
class TestReactJSLinter:
|
|
9
|
+
"""测试ReactJSLinter类"""
|
|
10
|
+
|
|
11
|
+
def setup_method(self):
|
|
12
|
+
"""每个测试方法前的设置"""
|
|
13
|
+
self.linter = ReactJSLinter(verbose=True)
|
|
14
|
+
|
|
15
|
+
def test_lint_file_nonexistent_file(self):
|
|
16
|
+
"""测试不存在的文件"""
|
|
17
|
+
result = self.linter.lint_file("nonexistent_file.jsx")
|
|
18
|
+
|
|
19
|
+
assert result['success'] == False
|
|
20
|
+
assert "不存在" in result.get('error', '') or "does not exist" in result.get('error', '')
|
|
21
|
+
|
|
22
|
+
def test_lint_file_unsupported_file(self):
|
|
23
|
+
"""测试不支持的文件类型"""
|
|
24
|
+
# 创建一个临时文件
|
|
25
|
+
with open("temp.txt", "w") as f:
|
|
26
|
+
f.write("这不是React文件")
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
result = self.linter.lint_file("temp.txt")
|
|
30
|
+
|
|
31
|
+
assert result['success'] == False
|
|
32
|
+
assert "不支持" in result.get('error', '') or "Unsupported" in result.get('error', '')
|
|
33
|
+
finally:
|
|
34
|
+
# 清理
|
|
35
|
+
if os.path.exists("temp.txt"):
|
|
36
|
+
os.remove("temp.txt")
|
|
37
|
+
|
|
38
|
+
@patch.object(ReactJSLinter, '_check_dependencies')
|
|
39
|
+
def test_lint_file_missing_dependencies(self, mock_check):
|
|
40
|
+
"""测试缺少依赖项的情况"""
|
|
41
|
+
# 模拟依赖检查失败
|
|
42
|
+
mock_check.return_value = False
|
|
43
|
+
|
|
44
|
+
# 创建一个临时React文件
|
|
45
|
+
with open("temp.jsx", "w") as f:
|
|
46
|
+
f.write("import React from 'react';\nfunction App() { return <div>Hello</div>; }")
|
|
47
|
+
|
|
48
|
+
try:
|
|
49
|
+
result = self.linter.lint_file("temp.jsx")
|
|
50
|
+
|
|
51
|
+
assert result['success'] == False
|
|
52
|
+
assert "依赖" in result.get('error', '') or "dependencies" in result.get('error', '')
|
|
53
|
+
finally:
|
|
54
|
+
# 清理
|
|
55
|
+
if os.path.exists("temp.jsx"):
|
|
56
|
+
os.remove("temp.jsx")
|
|
57
|
+
|
|
58
|
+
@patch.object(ReactJSLinter, '_detect_file_type')
|
|
59
|
+
def test_lint_file_not_react_file(self, mock_detect):
|
|
60
|
+
"""测试非React文件"""
|
|
61
|
+
# 模拟文件类型检测失败
|
|
62
|
+
mock_detect.return_value = False
|
|
63
|
+
|
|
64
|
+
# 创建一个临时JS文件
|
|
65
|
+
with open("temp.js", "w") as f:
|
|
66
|
+
f.write("function hello() { console.log('Hello'); }")
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
result = self.linter.lint_file("temp.js")
|
|
70
|
+
|
|
71
|
+
assert result['success'] == False
|
|
72
|
+
assert "Not a React file" in result.get('error', '')
|
|
73
|
+
finally:
|
|
74
|
+
# 清理
|
|
75
|
+
if os.path.exists("temp.js"):
|
|
76
|
+
os.remove("temp.js")
|
|
77
|
+
|
|
78
|
+
@patch.object(ReactJSLinter, '_check_dependencies')
|
|
79
|
+
@patch.object(ReactJSLinter, '_detect_file_type')
|
|
80
|
+
@patch.object(ReactJSLinter, '_install_eslint_if_needed')
|
|
81
|
+
@patch('subprocess.run')
|
|
82
|
+
def test_lint_file_successful(self, mock_run, mock_install, mock_detect, mock_check):
|
|
83
|
+
"""测试成功的lint过程"""
|
|
84
|
+
# 模拟依赖检查成功
|
|
85
|
+
mock_check.return_value = True
|
|
86
|
+
# 模拟文件类型检测成功
|
|
87
|
+
mock_detect.return_value = True
|
|
88
|
+
# 模拟安装ESLint成功
|
|
89
|
+
mock_install.return_value = True
|
|
90
|
+
|
|
91
|
+
# 模拟subprocess.run的结果
|
|
92
|
+
mock_process = MagicMock()
|
|
93
|
+
mock_process.stdout = json.dumps([
|
|
94
|
+
{
|
|
95
|
+
'filePath': os.path.abspath('test.jsx'),
|
|
96
|
+
'errorCount': 1,
|
|
97
|
+
'warningCount': 2,
|
|
98
|
+
'messages': [
|
|
99
|
+
{
|
|
100
|
+
'line': 10,
|
|
101
|
+
'column': 5,
|
|
102
|
+
'severity': 2,
|
|
103
|
+
'message': '未使用的变量',
|
|
104
|
+
'ruleId': 'no-unused-vars'
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
'line': 15,
|
|
108
|
+
'column': 1,
|
|
109
|
+
'severity': 1,
|
|
110
|
+
'message': '缺少分号',
|
|
111
|
+
'ruleId': 'semi'
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
'line': 20,
|
|
115
|
+
'column': 10,
|
|
116
|
+
'severity': 1,
|
|
117
|
+
'message': '建议使用解构赋值',
|
|
118
|
+
'ruleId': 'prefer-destructuring'
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
])
|
|
123
|
+
mock_run.return_value = mock_process
|
|
124
|
+
|
|
125
|
+
# 创建一个临时React文件
|
|
126
|
+
with open("test.jsx", "w") as f:
|
|
127
|
+
f.write("import React from 'react';\nfunction App() { return <div>Hello</div>; }")
|
|
128
|
+
|
|
129
|
+
try:
|
|
130
|
+
result = self.linter.lint_file("test.jsx")
|
|
131
|
+
|
|
132
|
+
assert result['success'] == True
|
|
133
|
+
assert result['framework'] == 'reactjs'
|
|
134
|
+
assert result['files_analyzed'] == 1
|
|
135
|
+
assert result['error_count'] == 1
|
|
136
|
+
assert result['warning_count'] == 2
|
|
137
|
+
assert len(result['issues']) == 3
|
|
138
|
+
finally:
|
|
139
|
+
# 清理
|
|
140
|
+
if os.path.exists("test.jsx"):
|
|
141
|
+
os.remove("test.jsx")
|
|
142
|
+
|
|
143
|
+
# python -m pytest src/autocoder/linters/test_reactjs_linter.py::TestReactJSLinter::test_lint_real_file -v -s
|
|
144
|
+
@pytest.mark.integration
|
|
145
|
+
def test_lint_real_file(self):
|
|
146
|
+
"""测试对实际文件的lint功能"""
|
|
147
|
+
# 检查是否有React示例文件可用
|
|
148
|
+
file_path = "/Users/allwefantasy/projects/auto-coder.web/frontend/src/components/Sidebar/ChatPanel.tsx"
|
|
149
|
+
|
|
150
|
+
# 执行lint操作
|
|
151
|
+
result = self.linter.lint_file(file_path)
|
|
152
|
+
|
|
153
|
+
# 基本断言
|
|
154
|
+
assert 'success' in result
|
|
155
|
+
assert 'framework' in result
|
|
156
|
+
assert 'files_analyzed' in result
|
|
157
|
+
|
|
158
|
+
# 打印完整的lint结果
|
|
159
|
+
print("\n==== Lint结果概述 ====")
|
|
160
|
+
print(f"文件: {file_path}")
|
|
161
|
+
print(f"成功: {result.get('success', False)}")
|
|
162
|
+
if 'error' in result:
|
|
163
|
+
print(f"错误: {result['error']}")
|
|
164
|
+
else:
|
|
165
|
+
print(f"错误数: {result.get('error_count', 0)}")
|
|
166
|
+
print(f"警告数: {result.get('warning_count', 0)}")
|
|
167
|
+
print(f"问题总数: {len(result.get('issues', []))}")
|
|
168
|
+
|
|
169
|
+
print("\n==== 详细问题列表 ====")
|
|
170
|
+
if not result.get('issues', []):
|
|
171
|
+
print("没有发现问题或执行失败!")
|
|
172
|
+
else:
|
|
173
|
+
for i, issue in enumerate(result['issues'], 1):
|
|
174
|
+
print(f"\n问题 #{i}:")
|
|
175
|
+
print(f" 文件: {issue['file']}")
|
|
176
|
+
print(f" 位置: 第{issue['line']}行, 第{issue['column']}列")
|
|
177
|
+
print(f" 严重性: {issue['severity']}")
|
|
178
|
+
print(f" 信息: {issue['message']}")
|
|
179
|
+
print(f" 规则: {issue['rule']}")
|
|
180
|
+
|
|
181
|
+
# 可选:打印完整的JSON格式结果
|
|
182
|
+
print("\n==== 完整JSON结果 ====")
|
|
183
|
+
print(json.dumps(result, indent=2, ensure_ascii=False))
|