auto-coder 1.0.0__py3-none-any.whl → 2.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of auto-coder might be problematic. Click here for more details.

Files changed (574) hide show
  1. auto_coder-2.0.1.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.1.dist-info/METADATA +558 -0
  3. auto_coder-2.0.1.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/entry_points.txt +3 -3
  6. autocoder/__init__.py +31 -0
  7. autocoder/agent/auto_filegroup.py +32 -13
  8. autocoder/agent/auto_learn_from_commit.py +9 -1
  9. autocoder/agent/base_agentic/__init__.py +3 -0
  10. autocoder/agent/base_agentic/agent_hub.py +1 -1
  11. autocoder/agent/base_agentic/base_agent.py +235 -136
  12. autocoder/agent/base_agentic/default_tools.py +119 -118
  13. autocoder/agent/base_agentic/test_base_agent.py +1 -1
  14. autocoder/agent/base_agentic/tool_registry.py +32 -20
  15. autocoder/agent/base_agentic/tools/read_file_tool_resolver.py +24 -3
  16. autocoder/agent/base_agentic/tools/write_to_file_tool_resolver.py +24 -11
  17. autocoder/agent/base_agentic/types.py +42 -0
  18. autocoder/agent/entry_command_agent/chat.py +77 -73
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +962 -2345
  22. autocoder/auto_coder_terminal.py +26 -0
  23. autocoder/auto_coder_terminal_v3.py +190 -0
  24. autocoder/chat/conf_command.py +224 -124
  25. autocoder/chat/models_command.py +361 -299
  26. autocoder/chat/rules_command.py +79 -31
  27. autocoder/chat_auto_coder.py +988 -398
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +25 -8
  30. autocoder/commands/auto_web.py +1 -1
  31. autocoder/commands/tools.py +44 -44
  32. autocoder/common/__init__.py +150 -128
  33. autocoder/common/ac_style_command_parser/__init__.py +39 -2
  34. autocoder/common/ac_style_command_parser/config.py +422 -0
  35. autocoder/common/ac_style_command_parser/parser.py +292 -78
  36. autocoder/common/ac_style_command_parser/test_parser.py +241 -16
  37. autocoder/common/ac_style_command_parser/test_typed_parser.py +342 -0
  38. autocoder/common/ac_style_command_parser/typed_parser.py +653 -0
  39. autocoder/common/action_yml_file_manager.py +25 -13
  40. autocoder/common/agent_events/__init__.py +52 -0
  41. autocoder/common/agent_events/agent_event_emitter.py +193 -0
  42. autocoder/common/agent_events/event_factory.py +177 -0
  43. autocoder/common/agent_events/examples.py +307 -0
  44. autocoder/common/agent_events/types.py +113 -0
  45. autocoder/common/agent_events/utils.py +68 -0
  46. autocoder/common/agent_hooks/__init__.py +44 -0
  47. autocoder/common/agent_hooks/examples.py +582 -0
  48. autocoder/common/agent_hooks/hook_executor.py +217 -0
  49. autocoder/common/agent_hooks/hook_manager.py +288 -0
  50. autocoder/common/agent_hooks/types.py +133 -0
  51. autocoder/common/agent_hooks/utils.py +99 -0
  52. autocoder/common/agent_query_queue/queue_executor.py +324 -0
  53. autocoder/common/agent_query_queue/queue_manager.py +325 -0
  54. autocoder/common/agents/__init__.py +11 -0
  55. autocoder/common/agents/agent_manager.py +323 -0
  56. autocoder/common/agents/agent_parser.py +189 -0
  57. autocoder/common/agents/example_usage.py +344 -0
  58. autocoder/common/agents/integration_example.py +330 -0
  59. autocoder/common/agents/test_agent_parser.py +545 -0
  60. autocoder/common/async_utils.py +101 -0
  61. autocoder/common/auto_coder_lang.py +23 -972
  62. autocoder/common/autocoderargs_parser/__init__.py +14 -0
  63. autocoder/common/autocoderargs_parser/parser.py +184 -0
  64. autocoder/common/autocoderargs_parser/tests/__init__.py +1 -0
  65. autocoder/common/autocoderargs_parser/tests/test_args_parser.py +235 -0
  66. autocoder/common/autocoderargs_parser/tests/test_token_parser.py +195 -0
  67. autocoder/common/autocoderargs_parser/token_parser.py +290 -0
  68. autocoder/common/buildin_tokenizer.py +2 -4
  69. autocoder/common/code_auto_generate.py +149 -74
  70. autocoder/common/code_auto_generate_diff.py +163 -70
  71. autocoder/common/code_auto_generate_editblock.py +179 -89
  72. autocoder/common/code_auto_generate_strict_diff.py +167 -72
  73. autocoder/common/code_auto_merge_editblock.py +13 -6
  74. autocoder/common/code_modification_ranker.py +1 -1
  75. autocoder/common/command_completer.py +3 -3
  76. autocoder/common/command_file_manager/manager.py +183 -47
  77. autocoder/common/command_file_manager/test_command_file_manager.py +507 -0
  78. autocoder/common/command_templates.py +1 -1
  79. autocoder/common/conf_utils.py +2 -4
  80. autocoder/common/conversations/config.py +11 -3
  81. autocoder/common/conversations/get_conversation_manager.py +100 -2
  82. autocoder/common/conversations/llm_stats_models.py +264 -0
  83. autocoder/common/conversations/manager.py +112 -28
  84. autocoder/common/conversations/models.py +16 -2
  85. autocoder/common/conversations/storage/index_manager.py +134 -10
  86. autocoder/common/core_config/__init__.py +63 -0
  87. autocoder/common/core_config/agentic_mode_manager.py +109 -0
  88. autocoder/common/core_config/base_manager.py +123 -0
  89. autocoder/common/core_config/compatibility.py +151 -0
  90. autocoder/common/core_config/config_manager.py +156 -0
  91. autocoder/common/core_config/conversation_manager.py +31 -0
  92. autocoder/common/core_config/exclude_manager.py +72 -0
  93. autocoder/common/core_config/file_manager.py +177 -0
  94. autocoder/common/core_config/human_as_model_manager.py +129 -0
  95. autocoder/common/core_config/lib_manager.py +54 -0
  96. autocoder/common/core_config/main_manager.py +81 -0
  97. autocoder/common/core_config/mode_manager.py +126 -0
  98. autocoder/common/core_config/models.py +70 -0
  99. autocoder/common/core_config/test_memory_manager.py +1056 -0
  100. autocoder/common/env_manager.py +282 -0
  101. autocoder/common/env_manager_usage_example.py +211 -0
  102. autocoder/common/file_checkpoint/conversation_checkpoint.py +19 -19
  103. autocoder/common/file_checkpoint/manager.py +264 -48
  104. autocoder/common/file_checkpoint/test_backup.py +1 -18
  105. autocoder/common/file_checkpoint/test_manager.py +270 -1
  106. autocoder/common/file_checkpoint/test_store.py +1 -17
  107. autocoder/common/file_handler/__init__.py +23 -0
  108. autocoder/common/file_handler/active_context_handler.py +159 -0
  109. autocoder/common/file_handler/add_files_handler.py +409 -0
  110. autocoder/common/file_handler/chat_handler.py +180 -0
  111. autocoder/common/file_handler/coding_handler.py +409 -0
  112. autocoder/common/file_handler/commit_handler.py +200 -0
  113. autocoder/common/file_handler/lib_handler.py +156 -0
  114. autocoder/common/file_handler/list_files_handler.py +111 -0
  115. autocoder/common/file_handler/mcp_handler.py +268 -0
  116. autocoder/common/file_handler/models_handler.py +493 -0
  117. autocoder/common/file_handler/remove_files_handler.py +172 -0
  118. autocoder/common/git_utils.py +44 -8
  119. autocoder/common/global_cancel.py +15 -6
  120. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  121. autocoder/common/international/__init__.py +31 -0
  122. autocoder/common/international/demo_international.py +92 -0
  123. autocoder/common/international/message_manager.py +157 -0
  124. autocoder/common/international/messages/__init__.py +56 -0
  125. autocoder/common/international/messages/async_command_messages.py +507 -0
  126. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  127. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  128. autocoder/common/international/messages/command_help_messages.py +986 -0
  129. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  130. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  131. autocoder/common/international/messages/queue_command_messages.py +751 -0
  132. autocoder/common/international/messages/rules_command_messages.py +77 -0
  133. autocoder/common/international/messages/sdk_messages.py +1707 -0
  134. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  135. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  136. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  137. autocoder/common/international/test_international.py +612 -0
  138. autocoder/common/linter_core/__init__.py +28 -0
  139. autocoder/common/linter_core/base_linter.py +61 -0
  140. autocoder/common/linter_core/config_loader.py +271 -0
  141. autocoder/common/linter_core/formatters/__init__.py +0 -0
  142. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  143. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  144. autocoder/common/linter_core/linter.py +166 -0
  145. autocoder/common/linter_core/linter_factory.py +216 -0
  146. autocoder/common/linter_core/linter_manager.py +333 -0
  147. autocoder/common/linter_core/linters/__init__.py +9 -0
  148. autocoder/common/linter_core/linters/java_linter.py +342 -0
  149. autocoder/common/linter_core/linters/python_linter.py +115 -0
  150. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  151. autocoder/common/linter_core/models/__init__.py +7 -0
  152. autocoder/common/linter_core/models/lint_result.py +91 -0
  153. autocoder/common/linter_core/models.py +33 -0
  154. autocoder/common/linter_core/tests/__init__.py +3 -0
  155. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  156. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  157. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  158. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  159. autocoder/common/linter_core/tests/test_integration.py +317 -0
  160. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  161. autocoder/common/linter_core/tests/test_linters.py +265 -0
  162. autocoder/common/linter_core/tests/test_models.py +81 -0
  163. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  164. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  165. autocoder/common/llm_friendly_package/__init__.py +31 -0
  166. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  167. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  168. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  169. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  170. autocoder/common/llm_friendly_package/models.py +40 -0
  171. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  172. autocoder/common/llms/__init__.py +15 -0
  173. autocoder/common/llms/demo_error_handling.py +85 -0
  174. autocoder/common/llms/factory.py +142 -0
  175. autocoder/common/llms/manager.py +264 -0
  176. autocoder/common/llms/pricing.py +121 -0
  177. autocoder/common/llms/registry.py +316 -0
  178. autocoder/common/llms/schema.py +77 -0
  179. autocoder/common/llms/simple_demo.py +45 -0
  180. autocoder/common/llms/test_quick_model.py +116 -0
  181. autocoder/common/llms/test_remove_functionality.py +182 -0
  182. autocoder/common/llms/tests/__init__.py +1 -0
  183. autocoder/common/llms/tests/test_manager.py +330 -0
  184. autocoder/common/llms/tests/test_registry.py +364 -0
  185. autocoder/common/mcp_tools/__init__.py +62 -0
  186. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  187. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  188. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  189. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  190. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  191. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  192. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  193. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  194. autocoder/common/model_speed_tester.py +32 -26
  195. autocoder/common/priority_directory_finder/__init__.py +142 -0
  196. autocoder/common/priority_directory_finder/examples.py +230 -0
  197. autocoder/common/priority_directory_finder/finder.py +283 -0
  198. autocoder/common/priority_directory_finder/models.py +236 -0
  199. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  200. autocoder/common/project_scanner/__init__.py +18 -0
  201. autocoder/common/project_scanner/compat.py +77 -0
  202. autocoder/common/project_scanner/scanner.py +436 -0
  203. autocoder/common/project_tracker/__init__.py +27 -0
  204. autocoder/common/project_tracker/api.py +228 -0
  205. autocoder/common/project_tracker/demo.py +272 -0
  206. autocoder/common/project_tracker/tracker.py +487 -0
  207. autocoder/common/project_tracker/types.py +53 -0
  208. autocoder/common/pruner/__init__.py +67 -0
  209. autocoder/common/pruner/agentic_conversation_pruner.py +651 -102
  210. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  211. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  212. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  213. autocoder/common/pruner/conversation_normalizer.py +347 -0
  214. autocoder/common/pruner/conversation_pruner.py +26 -6
  215. autocoder/common/pruner/test_agentic_conversation_pruner.py +554 -112
  216. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  217. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  218. autocoder/common/pruner/tool_content_detector.py +227 -0
  219. autocoder/common/pruner/tools/__init__.py +18 -0
  220. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  221. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  222. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  223. autocoder/common/pull_requests/__init__.py +9 -1
  224. autocoder/common/pull_requests/utils.py +122 -1
  225. autocoder/common/rag_manager/rag_manager.py +36 -40
  226. autocoder/common/rulefiles/__init__.py +53 -1
  227. autocoder/common/rulefiles/api.py +250 -0
  228. autocoder/common/rulefiles/core/__init__.py +14 -0
  229. autocoder/common/rulefiles/core/manager.py +241 -0
  230. autocoder/common/rulefiles/core/selector.py +805 -0
  231. autocoder/common/rulefiles/models/__init__.py +20 -0
  232. autocoder/common/rulefiles/models/index.py +16 -0
  233. autocoder/common/rulefiles/models/init_rule.py +18 -0
  234. autocoder/common/rulefiles/models/rule_file.py +18 -0
  235. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  236. autocoder/common/rulefiles/models/summary.py +16 -0
  237. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  238. autocoder/common/rulefiles/utils/__init__.py +34 -0
  239. autocoder/common/rulefiles/utils/monitor.py +86 -0
  240. autocoder/common/rulefiles/utils/parser.py +230 -0
  241. autocoder/common/save_formatted_log.py +67 -10
  242. autocoder/common/search_replace.py +8 -1
  243. autocoder/common/search_replace_patch/__init__.py +24 -0
  244. autocoder/common/search_replace_patch/base.py +115 -0
  245. autocoder/common/search_replace_patch/manager.py +248 -0
  246. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  247. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  248. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  249. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  250. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  251. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  252. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  253. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  254. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  255. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  256. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  257. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  258. autocoder/common/shell_commands/__init__.py +197 -0
  259. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  260. autocoder/common/shell_commands/command_executor.py +1127 -0
  261. autocoder/common/shell_commands/error_recovery.py +541 -0
  262. autocoder/common/shell_commands/exceptions.py +120 -0
  263. autocoder/common/shell_commands/interactive_executor.py +476 -0
  264. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  265. autocoder/common/shell_commands/interactive_process.py +744 -0
  266. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  267. autocoder/common/shell_commands/monitoring.py +529 -0
  268. autocoder/common/shell_commands/process_cleanup.py +386 -0
  269. autocoder/common/shell_commands/process_manager.py +606 -0
  270. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  271. autocoder/common/shell_commands/tests/__init__.py +6 -0
  272. autocoder/common/shell_commands/tests/conftest.py +118 -0
  273. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  274. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  275. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  276. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  277. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  278. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  279. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  280. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  281. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  282. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  283. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  284. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  285. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  286. autocoder/common/shell_commands/timeout_config.py +315 -0
  287. autocoder/common/shell_commands/timeout_manager.py +352 -0
  288. autocoder/common/terminal_paste/__init__.py +14 -0
  289. autocoder/common/terminal_paste/demo.py +145 -0
  290. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  291. autocoder/common/terminal_paste/paste_handler.py +200 -0
  292. autocoder/common/terminal_paste/paste_manager.py +118 -0
  293. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  294. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  295. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  296. autocoder/common/terminal_paste/utils.py +163 -0
  297. autocoder/common/test_autocoder_args.py +232 -0
  298. autocoder/common/test_env_manager.py +173 -0
  299. autocoder/common/test_env_manager_integration.py +159 -0
  300. autocoder/common/text_similarity/__init__.py +9 -0
  301. autocoder/common/text_similarity/demo.py +216 -0
  302. autocoder/common/text_similarity/examples.py +266 -0
  303. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  304. autocoder/common/text_similarity/text_similarity.py +194 -0
  305. autocoder/common/text_similarity/utils.py +125 -0
  306. autocoder/common/todos/__init__.py +61 -0
  307. autocoder/common/todos/cache/__init__.py +16 -0
  308. autocoder/common/todos/cache/base_cache.py +89 -0
  309. autocoder/common/todos/cache/cache_manager.py +228 -0
  310. autocoder/common/todos/cache/memory_cache.py +225 -0
  311. autocoder/common/todos/config.py +155 -0
  312. autocoder/common/todos/exceptions.py +35 -0
  313. autocoder/common/todos/get_todo_manager.py +161 -0
  314. autocoder/common/todos/manager.py +537 -0
  315. autocoder/common/todos/models.py +239 -0
  316. autocoder/common/todos/storage/__init__.py +14 -0
  317. autocoder/common/todos/storage/base_storage.py +76 -0
  318. autocoder/common/todos/storage/file_storage.py +278 -0
  319. autocoder/common/tokens/counter.py +24 -2
  320. autocoder/common/tools_manager/__init__.py +17 -0
  321. autocoder/common/tools_manager/examples.py +162 -0
  322. autocoder/common/tools_manager/manager.py +385 -0
  323. autocoder/common/tools_manager/models.py +39 -0
  324. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  325. autocoder/common/tools_manager/utils.py +191 -0
  326. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  327. autocoder/common/v2/agent/agentic_edit.py +2699 -1856
  328. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  329. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +35 -1
  330. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  331. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +10 -1
  332. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +564 -29
  338. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  340. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  344. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +356 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +243 -50
  346. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  347. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +410 -86
  349. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  350. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  352. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +207 -192
  353. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +80 -63
  354. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +237 -233
  355. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  356. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  359. autocoder/common/v2/agent/agentic_edit_types.py +343 -9
  360. autocoder/common/v2/agent/runner/__init__.py +3 -3
  361. autocoder/common/v2/agent/runner/base_runner.py +12 -26
  362. autocoder/common/v2/agent/runner/{event_runner.py → file_based_event_runner.py} +3 -2
  363. autocoder/common/v2/agent/runner/sdk_runner.py +150 -8
  364. autocoder/common/v2/agent/runner/terminal_runner.py +170 -57
  365. autocoder/common/v2/agent/runner/tool_display.py +557 -159
  366. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  367. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  368. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  369. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  370. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  371. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  372. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  373. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  374. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  375. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  376. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  377. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  378. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  379. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  380. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  381. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  382. autocoder/common/v2/code_auto_generate.py +136 -78
  383. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  384. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  385. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  386. autocoder/common/v2/code_auto_merge.py +1 -1
  387. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  388. autocoder/common/v2/code_diff_manager.py +3 -3
  389. autocoder/common/v2/code_editblock_manager.py +4 -14
  390. autocoder/common/v2/code_manager.py +1 -1
  391. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  392. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  393. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  394. autocoder/common/wrap_llm_hint/utils.py +432 -0
  395. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  396. autocoder/completer/__init__.py +8 -0
  397. autocoder/completer/command_completer_v2.py +1094 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +400 -129
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +117 -125
  403. autocoder/{agent → index/filter}/agentic_filter.py +322 -333
  404. autocoder/index/filter/normal_filter.py +5 -11
  405. autocoder/index/filter/quick_filter.py +1 -1
  406. autocoder/index/index.py +36 -9
  407. autocoder/index/tests/__init__.py +1 -0
  408. autocoder/index/tests/run_tests.py +195 -0
  409. autocoder/index/tests/test_entry.py +303 -0
  410. autocoder/index/tests/test_index_manager.py +314 -0
  411. autocoder/index/tests/test_module_integration.py +300 -0
  412. autocoder/index/tests/test_symbols_utils.py +183 -0
  413. autocoder/inner/__init__.py +4 -0
  414. autocoder/inner/agentic.py +923 -0
  415. autocoder/inner/async_command_handler.py +992 -0
  416. autocoder/inner/conversation_command_handlers.py +623 -0
  417. autocoder/inner/merge_command_handler.py +213 -0
  418. autocoder/inner/queue_command_handler.py +684 -0
  419. autocoder/models.py +95 -266
  420. autocoder/plugins/git_helper_plugin.py +31 -29
  421. autocoder/plugins/token_helper_plugin.py +65 -46
  422. autocoder/pyproject/__init__.py +32 -29
  423. autocoder/rag/agentic_rag.py +215 -75
  424. autocoder/rag/cache/simple_cache.py +1 -2
  425. autocoder/rag/loaders/image_loader.py +1 -1
  426. autocoder/rag/long_context_rag.py +42 -26
  427. autocoder/rag/qa_conversation_strategy.py +1 -1
  428. autocoder/rag/terminal/__init__.py +17 -0
  429. autocoder/rag/terminal/args.py +581 -0
  430. autocoder/rag/terminal/bootstrap.py +61 -0
  431. autocoder/rag/terminal/command_handlers.py +653 -0
  432. autocoder/rag/terminal/formatters/__init__.py +20 -0
  433. autocoder/rag/terminal/formatters/base.py +70 -0
  434. autocoder/rag/terminal/formatters/json_format.py +66 -0
  435. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  436. autocoder/rag/terminal/formatters/text.py +28 -0
  437. autocoder/rag/terminal/init.py +120 -0
  438. autocoder/rag/terminal/utils.py +106 -0
  439. autocoder/rag/test_agentic_rag.py +389 -0
  440. autocoder/rag/test_doc_filter.py +3 -3
  441. autocoder/rag/test_long_context_rag.py +1 -1
  442. autocoder/rag/test_token_limiter.py +517 -10
  443. autocoder/rag/token_counter.py +3 -0
  444. autocoder/rag/token_limiter.py +19 -15
  445. autocoder/rag/tools/__init__.py +26 -2
  446. autocoder/rag/tools/bochaai_example.py +343 -0
  447. autocoder/rag/tools/bochaai_sdk.py +541 -0
  448. autocoder/rag/tools/metaso_example.py +268 -0
  449. autocoder/rag/tools/metaso_sdk.py +417 -0
  450. autocoder/rag/tools/recall_tool.py +28 -7
  451. autocoder/rag/tools/run_integration_tests.py +204 -0
  452. autocoder/rag/tools/test_all_providers.py +318 -0
  453. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  454. autocoder/rag/tools/test_final_integration.py +215 -0
  455. autocoder/rag/tools/test_metaso_integration.py +424 -0
  456. autocoder/rag/tools/test_metaso_real.py +171 -0
  457. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  458. autocoder/rag/tools/test_web_search_tool.py +509 -0
  459. autocoder/rag/tools/todo_read_tool.py +202 -0
  460. autocoder/rag/tools/todo_write_tool.py +412 -0
  461. autocoder/rag/tools/web_crawl_tool.py +634 -0
  462. autocoder/rag/tools/web_search_tool.py +558 -0
  463. autocoder/rag/tools/web_tools_example.py +119 -0
  464. autocoder/rag/types.py +16 -0
  465. autocoder/rag/variable_holder.py +4 -2
  466. autocoder/rags.py +86 -79
  467. autocoder/regexproject/__init__.py +23 -21
  468. autocoder/sdk/__init__.py +46 -190
  469. autocoder/sdk/api.py +370 -0
  470. autocoder/sdk/async_runner/__init__.py +26 -0
  471. autocoder/sdk/async_runner/async_executor.py +650 -0
  472. autocoder/sdk/async_runner/async_handler.py +356 -0
  473. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  474. autocoder/sdk/async_runner/task_metadata.py +284 -0
  475. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  476. autocoder/sdk/cli/__init__.py +2 -5
  477. autocoder/sdk/cli/formatters.py +28 -204
  478. autocoder/sdk/cli/handlers.py +77 -44
  479. autocoder/sdk/cli/main.py +154 -171
  480. autocoder/sdk/cli/options.py +95 -22
  481. autocoder/sdk/constants.py +139 -51
  482. autocoder/sdk/core/auto_coder_core.py +484 -109
  483. autocoder/sdk/core/bridge.py +297 -115
  484. autocoder/sdk/exceptions.py +18 -12
  485. autocoder/sdk/formatters/__init__.py +19 -0
  486. autocoder/sdk/formatters/input.py +64 -0
  487. autocoder/sdk/formatters/output.py +247 -0
  488. autocoder/sdk/formatters/stream.py +54 -0
  489. autocoder/sdk/models/__init__.py +6 -5
  490. autocoder/sdk/models/options.py +55 -18
  491. autocoder/sdk/utils/formatters.py +27 -195
  492. autocoder/suffixproject/__init__.py +28 -25
  493. autocoder/terminal/__init__.py +14 -0
  494. autocoder/terminal/app.py +454 -0
  495. autocoder/terminal/args.py +32 -0
  496. autocoder/terminal/bootstrap.py +178 -0
  497. autocoder/terminal/command_processor.py +521 -0
  498. autocoder/terminal/command_registry.py +57 -0
  499. autocoder/terminal/help.py +97 -0
  500. autocoder/terminal/tasks/__init__.py +5 -0
  501. autocoder/terminal/tasks/background.py +77 -0
  502. autocoder/terminal/tasks/task_event.py +70 -0
  503. autocoder/terminal/ui/__init__.py +13 -0
  504. autocoder/terminal/ui/completer.py +268 -0
  505. autocoder/terminal/ui/keybindings.py +75 -0
  506. autocoder/terminal/ui/session.py +41 -0
  507. autocoder/terminal/ui/toolbar.py +64 -0
  508. autocoder/terminal/utils/__init__.py +13 -0
  509. autocoder/terminal/utils/errors.py +18 -0
  510. autocoder/terminal/utils/paths.py +19 -0
  511. autocoder/terminal/utils/shell.py +43 -0
  512. autocoder/terminal_v3/__init__.py +10 -0
  513. autocoder/terminal_v3/app.py +201 -0
  514. autocoder/terminal_v3/handlers/__init__.py +5 -0
  515. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  516. autocoder/terminal_v3/models/__init__.py +6 -0
  517. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  518. autocoder/terminal_v3/models/message.py +50 -0
  519. autocoder/terminal_v3/models/tool_display.py +247 -0
  520. autocoder/terminal_v3/ui/__init__.py +7 -0
  521. autocoder/terminal_v3/ui/keybindings.py +56 -0
  522. autocoder/terminal_v3/ui/layout.py +141 -0
  523. autocoder/terminal_v3/ui/styles.py +43 -0
  524. autocoder/tsproject/__init__.py +23 -23
  525. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  526. autocoder/utils/llms.py +88 -80
  527. autocoder/utils/math_utils.py +101 -0
  528. autocoder/utils/model_provider_selector.py +16 -4
  529. autocoder/utils/operate_config_api.py +33 -5
  530. autocoder/utils/thread_utils.py +2 -2
  531. autocoder/version.py +4 -2
  532. autocoder/workflow_agents/__init__.py +84 -0
  533. autocoder/workflow_agents/agent.py +143 -0
  534. autocoder/workflow_agents/exceptions.py +573 -0
  535. autocoder/workflow_agents/executor.py +665 -0
  536. autocoder/workflow_agents/loader.py +749 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +173 -0
  539. autocoder/workflow_agents/utils.py +434 -0
  540. autocoder/workflow_agents/workflow_manager.py +211 -0
  541. auto_coder-1.0.0.dist-info/METADATA +0 -396
  542. auto_coder-1.0.0.dist-info/RECORD +0 -442
  543. auto_coder-1.0.0.dist-info/licenses/LICENSE +0 -201
  544. autocoder/auto_coder_server.py +0 -672
  545. autocoder/benchmark.py +0 -138
  546. autocoder/common/ac_style_command_parser/example.py +0 -7
  547. autocoder/common/cleaner.py +0 -31
  548. autocoder/common/command_completer_v2.py +0 -615
  549. autocoder/common/context_pruner.py +0 -477
  550. autocoder/common/conversation_pruner.py +0 -132
  551. autocoder/common/directory_cache/__init__.py +0 -1
  552. autocoder/common/directory_cache/cache.py +0 -192
  553. autocoder/common/directory_cache/test_cache.py +0 -190
  554. autocoder/common/file_checkpoint/examples.py +0 -217
  555. autocoder/common/llm_friendly_package_example.py +0 -138
  556. autocoder/common/llm_friendly_package_test.py +0 -63
  557. autocoder/common/pull_requests/test_module.py +0 -1
  558. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  559. autocoder/common/text.py +0 -30
  560. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  561. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  562. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  563. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  564. autocoder/plugins/dynamic_completion_example.py +0 -148
  565. autocoder/plugins/sample_plugin.py +0 -160
  566. autocoder/sdk/cli/__main__.py +0 -26
  567. autocoder/sdk/cli/completion_wrapper.py +0 -38
  568. autocoder/sdk/cli/install_completion.py +0 -301
  569. autocoder/sdk/models/messages.py +0 -209
  570. autocoder/sdk/session/__init__.py +0 -32
  571. autocoder/sdk/session/session.py +0 -106
  572. autocoder/sdk/session/session_manager.py +0 -56
  573. {auto_coder-1.0.0.dist-info → auto_coder-2.0.1.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,438 @@
1
+
2
+
3
+ """
4
+ Git Worktree 管理器模块
5
+
6
+ 提供 Git worktree 的创建、管理和清理功能。
7
+ """
8
+
9
+ import os
10
+ import subprocess
11
+ import shutil
12
+ from dataclasses import dataclass
13
+ from pathlib import Path
14
+ from typing import List, Optional, Dict, Any
15
+ from autocoder.common.international import get_message, get_message_with_format
16
+ from .task_metadata import TaskMetadataManager
17
+
18
+
19
+ @dataclass
20
+ class WorktreeInfo:
21
+ """Worktree 信息"""
22
+ name: str
23
+ path: str
24
+ branch: str
25
+ temp_file: str = ""
26
+
27
+
28
+ class WorktreeManager:
29
+ """Git Worktree 管理器,用于创建和管理 Git worktree"""
30
+
31
+ def __init__(self, base_work_dir: str, from_branch: str = "", original_project_path: str = ""):
32
+ """
33
+ 初始化 worktree 管理器
34
+
35
+ Args:
36
+ base_work_dir: 基础工作目录(将在其中创建tasks和meta子目录)
37
+ from_branch: 基础分支
38
+ original_project_path: 原始项目路径
39
+ """
40
+ self.base_work_dir = Path(base_work_dir)
41
+ self.tasks_dir = self.base_work_dir / "tasks"
42
+ self.meta_dir = self.base_work_dir / "meta"
43
+ self.from_branch = from_branch
44
+ self.original_project_path = original_project_path or os.getcwd()
45
+
46
+ # 创建必要的目录
47
+ self.base_work_dir.mkdir(parents=True, exist_ok=True)
48
+ self.tasks_dir.mkdir(parents=True, exist_ok=True)
49
+ self.meta_dir.mkdir(parents=True, exist_ok=True)
50
+
51
+ # 初始化元数据管理器
52
+ self.metadata_manager = TaskMetadataManager(str(self.meta_dir))
53
+
54
+ @property
55
+ def work_dir(self) -> str:
56
+ """保持兼容性的work_dir属性"""
57
+ return str(self.tasks_dir)
58
+
59
+ def create_worktree(self, name: str, user_query: str = "", model: str = "", split_mode: str = "") -> WorktreeInfo:
60
+ """
61
+ 创建新的 git worktree 并记录元数据
62
+
63
+ Args:
64
+ name: worktree 名称
65
+ user_query: 用户查询内容
66
+ model: 使用的模型
67
+ split_mode: 分割模式
68
+
69
+ Returns:
70
+ WorktreeInfo: worktree 信息
71
+
72
+ Raises:
73
+ Exception: 创建失败时抛出异常
74
+ """
75
+ # 在tasks目录中创建worktree
76
+ full_path = self.tasks_dir / name
77
+
78
+ # 检查目录是否已存在
79
+ if full_path.exists():
80
+ print(get_message_with_format("reusing_existing_worktree", path=str(full_path)))
81
+
82
+ # 尝试获取现有目录的分支信息
83
+ current_branch = name # 默认使用 name 作为分支
84
+ try:
85
+ # 尝试获取当前分支
86
+ result = subprocess.run(
87
+ ["git", "branch", "--show-current"],
88
+ cwd=str(full_path),
89
+ capture_output=True,
90
+ text=True,
91
+ check=False
92
+ )
93
+ if result.returncode == 0 and result.stdout.strip():
94
+ current_branch = result.stdout.strip()
95
+ except Exception:
96
+ # 如果获取分支失败,使用默认值
97
+ pass
98
+
99
+ # 直接创建 WorktreeInfo 对象,复用现有目录
100
+ worktree_info = WorktreeInfo(
101
+ name=name,
102
+ path=str(full_path),
103
+ branch=current_branch
104
+ )
105
+ else:
106
+ # 目录不存在,创建新的 git worktree
107
+ # 确定基础分支
108
+ base_branch = self.from_branch
109
+ if not base_branch:
110
+ # 如果没有指定分支,自动检测默认分支
111
+ base_branch = self._detect_default_branch()
112
+
113
+ # 创建 git worktree
114
+ try:
115
+ cmd = ["git", "worktree", "add", str(full_path), "-b", name, base_branch]
116
+ result = subprocess.run(
117
+ cmd,
118
+ check=True,
119
+ capture_output=True,
120
+ text=True
121
+ )
122
+
123
+ print(get_message_with_format("create_git_worktree", name=name))
124
+ if result.stdout:
125
+ print(result.stdout)
126
+
127
+ except subprocess.CalledProcessError as e:
128
+ error_msg = get_message_with_format("create_git_worktree_failed", error=str(e))
129
+ if e.stderr:
130
+ error_msg += f"\n{e.stderr}"
131
+ raise Exception(error_msg)
132
+
133
+ worktree_info = WorktreeInfo(
134
+ name=name,
135
+ path=str(full_path),
136
+ branch=name
137
+ )
138
+
139
+ # 创建任务元数据
140
+ if user_query: # 只有提供了查询内容才创建元数据
141
+ self.metadata_manager.create_task_metadata(
142
+ task_id=name,
143
+ user_query=user_query,
144
+ worktree_path=str(full_path),
145
+ original_project_path=self.original_project_path,
146
+ model=model,
147
+ split_mode=split_mode
148
+ )
149
+
150
+ return worktree_info
151
+
152
+ def _detect_default_branch(self) -> str:
153
+ """
154
+ 自动检测 git 仓库的默认分支
155
+
156
+ Returns:
157
+ 默认分支名称
158
+
159
+ Raises:
160
+ Exception: 无法检测到分支时抛出异常
161
+ """
162
+ # 首先尝试获取当前分支
163
+ try:
164
+ result = subprocess.run(
165
+ ["git", "branch", "--show-current"],
166
+ check=True,
167
+ capture_output=True,
168
+ text=True
169
+ )
170
+ current_branch = result.stdout.strip()
171
+ if current_branch:
172
+ print(get_message_with_format("using_current_branch", branch=current_branch))
173
+ return current_branch
174
+ except subprocess.CalledProcessError:
175
+ pass
176
+
177
+ # 如果无法获取当前分支,检查本地分支中是否有 main 或 master
178
+ try:
179
+ result = subprocess.run(
180
+ ["git", "branch", "--list"],
181
+ check=True,
182
+ capture_output=True,
183
+ text=True
184
+ )
185
+
186
+ branches = []
187
+ for line in result.stdout.split('\n'):
188
+ branch = line.strip().lstrip('*').strip()
189
+ if branch:
190
+ branches.append(branch)
191
+
192
+ print(get_message_with_format("detected_branches", branches=str(branches)))
193
+
194
+ # 优先查找 main 或 master
195
+ if "main" in branches:
196
+ print(get_message("using_main_branch"))
197
+ return "main"
198
+ if "master" in branches:
199
+ print(get_message("using_master_branch"))
200
+ return "master"
201
+
202
+ # 如果找不到 main 或 master,返回第一个分支
203
+ if branches:
204
+ first_branch = branches[0]
205
+ print(get_message_with_format("using_first_available_branch", branch=first_branch))
206
+ return first_branch
207
+
208
+ except subprocess.CalledProcessError as e:
209
+ print(get_message_with_format("get_branch_list_failed", error=str(e)))
210
+
211
+ # 最后尝试使用 git symbolic-ref 获取默认分支
212
+ try:
213
+ result = subprocess.run(
214
+ ["git", "symbolic-ref", "refs/remotes/origin/HEAD"],
215
+ check=True,
216
+ capture_output=True,
217
+ text=True
218
+ )
219
+ ref = result.stdout.strip()
220
+ if ref.startswith("refs/remotes/origin/"):
221
+ default_branch = ref.replace("refs/remotes/origin/", "")
222
+ print(get_message_with_format("using_remote_default_branch", branch=default_branch))
223
+ return default_branch
224
+ except subprocess.CalledProcessError:
225
+ pass
226
+
227
+ raise Exception(get_message("cannot_detect_any_branch"))
228
+
229
+ def cleanup_worktree(self, info: WorktreeInfo) -> None:
230
+ """
231
+ 清理指定的 worktree
232
+
233
+ Args:
234
+ info: worktree 信息
235
+
236
+ Raises:
237
+ Exception: 清理失败时抛出异常
238
+ """
239
+ # 删除 worktree
240
+ try:
241
+ subprocess.run(
242
+ ["git", "worktree", "remove", info.path, "--force"],
243
+ check=True,
244
+ capture_output=True,
245
+ text=True
246
+ )
247
+ except subprocess.CalledProcessError:
248
+ # 如果命令失败,尝试手动删除目录
249
+ try:
250
+ shutil.rmtree(info.path)
251
+ except OSError as e:
252
+ raise Exception(get_message_with_format("cleanup_worktree_failed", error=str(e)))
253
+
254
+ # 删除分支(如果存在)
255
+ try:
256
+ subprocess.run(
257
+ ["git", "branch", "-D", info.branch],
258
+ check=True,
259
+ capture_output=True,
260
+ text=True
261
+ )
262
+ except subprocess.CalledProcessError:
263
+ # 忽略错误,因为分支可能不存在
264
+ pass
265
+
266
+ def list_worktrees(self) -> List[WorktreeInfo]:
267
+ """
268
+ 列出所有 worktree
269
+
270
+ Returns:
271
+ WorktreeInfo 列表
272
+
273
+ Raises:
274
+ Exception: 获取列表失败时抛出异常
275
+ """
276
+ try:
277
+ result = subprocess.run(
278
+ ["git", "worktree", "list", "--porcelain"],
279
+ check=True,
280
+ capture_output=True,
281
+ text=True
282
+ )
283
+ except subprocess.CalledProcessError as e:
284
+ raise Exception(get_message_with_format("get_worktree_list_failed", error=str(e)))
285
+
286
+ worktrees = []
287
+ lines = result.stdout.split('\n')
288
+
289
+ current = WorktreeInfo(name="", path="", branch="")
290
+ for line in lines:
291
+ line = line.strip()
292
+ if not line:
293
+ if current.path:
294
+ worktrees.append(current)
295
+ current = WorktreeInfo(name="", path="", branch="")
296
+ continue
297
+
298
+ if line.startswith("worktree "):
299
+ current.path = line.replace("worktree ", "", 1)
300
+ current.name = Path(current.path).name
301
+ elif line.startswith("branch "):
302
+ current.branch = line.replace("branch ", "", 1)
303
+
304
+ # 添加最后一个 worktree(如果有)
305
+ if current.path:
306
+ worktrees.append(current)
307
+
308
+ return worktrees
309
+
310
+ def cleanup_all_worktrees(self, pattern: str = "") -> None:
311
+ """
312
+ 清理所有匹配模式的 worktree
313
+
314
+ Args:
315
+ pattern: 匹配模式,为空时清理所有
316
+ """
317
+ try:
318
+ worktrees = self.list_worktrees()
319
+ except Exception as e:
320
+ print(get_message_with_format("get_worktree_list_failed", error=str(e)))
321
+ return
322
+
323
+ for wt in worktrees:
324
+ # 只清理在我们工作目录中的 worktree
325
+ if wt.path.startswith(self.work_dir):
326
+ if not pattern or pattern in wt.name:
327
+ print(get_message_with_format("cleaning_worktree", name=wt.name))
328
+ try:
329
+ self.cleanup_worktree(wt)
330
+ except Exception as e:
331
+ print(get_message_with_format("cleanup_worktree_warning", error=str(e)))
332
+
333
+ def write_content_to_worktree(self, info: WorktreeInfo, filename: str, content: str) -> None:
334
+ """
335
+ 在 worktree 中写入内容到文件
336
+
337
+ Args:
338
+ info: worktree 信息
339
+ filename: 文件名
340
+ content: 文件内容
341
+
342
+ Raises:
343
+ Exception: 写入失败时抛出异常
344
+ """
345
+ file_path = Path(info.path) / filename
346
+
347
+ try:
348
+ with open(file_path, 'w', encoding='utf-8') as f:
349
+ f.write(content)
350
+ info.temp_file = filename
351
+ except OSError as e:
352
+ raise Exception(get_message_with_format("write_file_failed", error=str(e)))
353
+
354
+ def get_managed_worktrees(self) -> List[WorktreeInfo]:
355
+ """
356
+ 获取由此管理器管理的 worktree(在工作目录中的)
357
+
358
+ Returns:
359
+ 管理的 WorktreeInfo 列表
360
+ """
361
+ try:
362
+ all_worktrees = self.list_worktrees()
363
+ managed = []
364
+
365
+ for wt in all_worktrees:
366
+ if wt.path.startswith(self.work_dir):
367
+ managed.append(wt)
368
+
369
+ return managed
370
+ except Exception:
371
+ return []
372
+
373
+ def worktree_exists(self, name: str) -> bool:
374
+ """
375
+ 检查指定名称的 worktree 是否存在
376
+
377
+ Args:
378
+ name: worktree 名称
379
+
380
+ Returns:
381
+ 是否存在
382
+ """
383
+ full_path = Path(self.work_dir) / name
384
+ return full_path.exists()
385
+
386
+ def get_worktree_info(self, name: str) -> Optional[WorktreeInfo]:
387
+ """
388
+ 获取指定名称的 worktree 信息
389
+
390
+ Args:
391
+ name: worktree 名称
392
+
393
+ Returns:
394
+ WorktreeInfo 或 None
395
+ """
396
+ try:
397
+ worktrees = self.list_worktrees()
398
+ for wt in worktrees:
399
+ if wt.name == name and wt.path.startswith(self.work_dir):
400
+ return wt
401
+ except Exception:
402
+ pass
403
+
404
+ return None
405
+
406
+ def update_task_status(self, task_id: str, status: str, error_message: str = "", log_file: str = "", execution_result: Optional[Dict[str, Any]] = None) -> bool:
407
+ """
408
+ 更新任务状态
409
+
410
+ Args:
411
+ task_id: 任务ID
412
+ status: 新状态
413
+ error_message: 错误信息
414
+ log_file: 日志文件路径
415
+ execution_result: 执行结果
416
+
417
+ Returns:
418
+ bool: 是否更新成功
419
+ """
420
+ return self.metadata_manager.update_task_status(
421
+ task_id=task_id,
422
+ status=status,
423
+ error_message=error_message,
424
+ log_file=log_file,
425
+ execution_result=execution_result
426
+ )
427
+
428
+ def get_task_metadata(self, task_id: str):
429
+ """获取任务元数据"""
430
+ return self.metadata_manager.load_task_metadata(task_id)
431
+
432
+ def list_all_tasks(self, status_filter: Optional[str] = None):
433
+ """列出所有任务"""
434
+ return self.metadata_manager.list_tasks(status_filter)
435
+
436
+ def get_tasks_summary(self):
437
+ """获取任务汇总"""
438
+ return self.metadata_manager.get_task_summary()
@@ -4,12 +4,9 @@ Auto-Coder CLI 模块
4
4
  提供命令行接口,允许用户通过终端使用 Auto-Coder 的核心功能。
5
5
  """
6
6
 
7
- from .main import AutoCoderCLI
8
- from .options import CLIOptions, CLIResult
9
-
10
- # 导出main函数作为入口点
11
7
  def main():
12
8
  """CLI主入口点函数"""
9
+ from .main import AutoCoderCLI
13
10
  return AutoCoderCLI.main()
14
11
 
15
- __all__ = ["AutoCoderCLI", "CLIOptions", "CLIResult", "main"]
12
+ __all__ = ["main"]
@@ -1,211 +1,35 @@
1
1
  """
2
- 输出格式化器模块
2
+ 输出格式化器模块 - 向后兼容代理
3
3
 
4
- 提供不同格式的输出处理,支持文本、JSON和流式JSON格式。
4
+ 此模块已被弃用,请使用 autocoder.sdk.formatters
5
5
  """
6
6
 
7
- import json
8
- import asyncio
9
- from typing import Any, Dict, AsyncIterator, Union, Optional
7
+ import warnings
10
8
 
9
+ # 在模块导入时发出弃用警告
10
+ warnings.warn(
11
+ "autocoder.sdk.cli.formatters is deprecated, use autocoder.sdk.formatters instead",
12
+ DeprecationWarning,
13
+ stacklevel=2
14
+ )
11
15
 
12
- class OutputFormatter:
13
- """输出格式化器,处理不同格式的输出。"""
14
-
15
- def __init__(self, verbose: bool = False):
16
- """
17
- 初始化输出格式化器。
18
-
19
- Args:
20
- verbose: 是否输出详细信息
21
- """
22
- self.verbose = verbose
23
-
24
- def format_text(self, content: Union[str, Dict[str, Any]]) -> str:
25
- """
26
- 格式化为文本输出。
27
-
28
- Args:
29
- content: 要格式化的内容,可以是字符串或字典
30
-
31
- Returns:
32
- 格式化后的文本
33
- """
34
- if isinstance(content, dict):
35
- # 如果是字典,提取主要内容
36
- if "content" in content:
37
- result = content["content"]
38
- else:
39
- result = str(content)
40
- else:
41
- result = str(content)
42
-
43
- if self.verbose:
44
- # 在详细模式下添加调试信息
45
- debug_info = self._get_debug_info(content)
46
- if debug_info:
47
- result += f"\n\n[DEBUG]\n{debug_info}"
48
-
49
- return result
50
-
51
- def format_json(self, content: Any) -> str:
52
- """
53
- 格式化为JSON输出。
54
-
55
- Args:
56
- content: 要格式化的内容
57
-
58
- Returns:
59
- JSON格式的字符串
60
- """
61
- # 确保内容可以被序列化为JSON
62
- if isinstance(content, str):
63
- try:
64
- # 尝试解析为JSON
65
- parsed = json.loads(content)
66
- content = parsed
67
- except json.JSONDecodeError:
68
- # 如果不是有效的JSON,则包装为字典
69
- content = {"content": content}
70
-
71
- # 添加调试信息(如果启用详细模式)
72
- if self.verbose and isinstance(content, dict):
73
- content["debug"] = self._get_debug_info_dict(content)
74
-
75
- return json.dumps(content, ensure_ascii=False, indent=2)
76
-
77
- async def format_stream_json(self, stream: AsyncIterator[Any]) -> AsyncIterator[str]:
78
- """
79
- 格式化为流式JSON输出。
80
-
81
- Args:
82
- stream: 异步迭代器,提供流式内容
83
-
84
- Yields:
85
- JSON格式的字符串,每行一个JSON对象
86
- """
87
- async for item in stream:
88
- # 处理不同类型的项
89
- if isinstance(item, dict):
90
- output = item
91
- elif isinstance(item, str):
92
- try:
93
- output = json.loads(item)
94
- except json.JSONDecodeError:
95
- output = {"content": item, "type": "text"}
96
- else:
97
- output = {"content": str(item), "type": "text"}
98
-
99
- # 添加调试信息(如果启用详细模式)
100
- if self.verbose:
101
- output["debug"] = self._get_debug_info_dict(output)
102
-
103
- yield json.dumps(output, ensure_ascii=False)
104
-
105
- def _get_debug_info(self, content: Any) -> str:
106
- """
107
- 获取调试信息的文本表示。
108
-
109
- Args:
110
- content: 内容对象
111
-
112
- Returns:
113
- 调试信息文本
114
- """
115
- debug_dict = self._get_debug_info_dict(content)
116
- if debug_dict:
117
- return json.dumps(debug_dict, ensure_ascii=False, indent=2)
118
- return ""
119
-
120
- def _get_debug_info_dict(self, content: Any) -> Dict[str, Any]:
121
- """
122
- 获取调试信息的字典表示。
123
-
124
- Args:
125
- content: 内容对象
126
-
127
- Returns:
128
- 调试信息字典
129
- """
130
- debug_info = {}
131
-
132
- # 从内容中提取元数据
133
- if isinstance(content, dict):
134
- if "metadata" in content:
135
- debug_info["metadata"] = content["metadata"]
136
-
137
- # 提取令牌计数信息
138
- if "tokens" in content:
139
- debug_info["tokens"] = content["tokens"]
140
- elif "metadata" in content and "tokens" in content["metadata"]:
141
- debug_info["tokens"] = content["metadata"]["tokens"]
142
-
143
- # 提取模型信息
144
- if "model" in content:
145
- debug_info["model"] = content["model"]
146
- elif "metadata" in content and "model" in content["metadata"]:
147
- debug_info["model"] = content["metadata"]["model"]
148
-
149
- # 提取时间信息
150
- if "timestamp" in content:
151
- debug_info["timestamp"] = content["timestamp"]
152
- elif "metadata" in content and "timestamp" in content["metadata"]:
153
- debug_info["timestamp"] = content["metadata"]["timestamp"]
154
-
155
- return debug_info
16
+ # 从新位置导入所有内容
17
+ from ..formatters import (
18
+ OutputFormatter,
19
+ InputFormatter,
20
+ format_output,
21
+ format_stream_output,
22
+ format_table_output,
23
+ format_error_output,
24
+ format_progress_output,
25
+ )
156
26
 
157
-
158
- class InputFormatter:
159
- """输入格式化器,处理不同格式的输入。"""
160
-
161
- def format_text(self, content: str) -> str:
162
- """
163
- 格式化文本输入。
164
-
165
- Args:
166
- content: 输入文本
167
-
168
- Returns:
169
- 格式化后的文本
170
- """
171
- return content.strip()
172
-
173
- def format_json(self, content: str) -> Dict[str, Any]:
174
- """
175
- 格式化JSON输入。
176
-
177
- Args:
178
- content: JSON格式的输入字符串
179
-
180
- Returns:
181
- 解析后的字典
182
-
183
- Raises:
184
- ValueError: 如果输入不是有效的JSON
185
- """
186
- try:
187
- return json.loads(content)
188
- except json.JSONDecodeError as e:
189
- raise ValueError(f"无效的JSON输入: {str(e)}")
190
-
191
- async def format_stream_json(self, content: str) -> AsyncIterator[Dict[str, Any]]:
192
- """
193
- 格式化流式JSON输入。
194
-
195
- Args:
196
- content: 包含多行JSON对象的字符串
197
-
198
- Yields:
199
- 解析后的字典
200
-
201
- Raises:
202
- ValueError: 如果某行不是有效的JSON
203
- """
204
- for line in content.strip().split("\n"):
205
- if not line.strip():
206
- continue
207
-
208
- try:
209
- yield json.loads(line)
210
- except json.JSONDecodeError as e:
211
- raise ValueError(f"无效的JSON行: {line}, 错误: {str(e)}")
27
+ __all__ = [
28
+ "OutputFormatter",
29
+ "InputFormatter",
30
+ "format_output",
31
+ "format_stream_output",
32
+ "format_table_output",
33
+ "format_error_output",
34
+ "format_progress_output",
35
+ ]