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

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

Potentially problematic release.


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

Files changed (574) hide show
  1. auto_coder-2.0.0.dist-info/LICENSE +158 -0
  2. auto_coder-2.0.0.dist-info/METADATA +558 -0
  3. auto_coder-2.0.0.dist-info/RECORD +795 -0
  4. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-1.0.0.dist-info → auto_coder-2.0.0.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 +73 -59
  19. autocoder/auto_coder.py +31 -40
  20. autocoder/auto_coder_rag.py +11 -1084
  21. autocoder/auto_coder_runner.py +970 -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 +401 -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 +288 -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 +349 -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 +1051 -0
  398. autocoder/default_project/__init__.py +501 -0
  399. autocoder/dispacher/__init__.py +4 -12
  400. autocoder/dispacher/actions/action.py +165 -7
  401. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  402. autocoder/index/entry.py +116 -124
  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 +932 -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 +489 -0
  536. autocoder/workflow_agents/loader.py +737 -0
  537. autocoder/workflow_agents/runner.py +267 -0
  538. autocoder/workflow_agents/types.py +172 -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.0.dist-info}/top_level.txt +0 -0
  574. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -10,10 +10,13 @@ from pathlib import Path
10
10
  from typing import Optional, Dict, Any, List, Union
11
11
 
12
12
  from ..core import AutoCoderCore
13
- from ..models import AutoCodeOptions, Message
13
+ from ..models import AutoCodeOptions
14
+ from ..models.responses import CLIResult # 从正确的位置导入
14
15
  from ..exceptions import AutoCoderSDKError
15
- from .options import CLIOptions, CLIResult
16
- from .formatters import OutputFormatter, InputFormatter
16
+ from .options import CLIOptions
17
+ from ..formatters import OutputFormatter, InputFormatter, format_stream_output # 使用新的 formatters 模块
18
+ from autocoder.common.international import get_message
19
+ from autocoder.common.llm_friendly_package import get_package_manager
17
20
 
18
21
 
19
22
  class CommandHandler:
@@ -39,9 +42,18 @@ class CommandHandler:
39
42
  Returns:
40
43
  AutoCodeOptions实例
41
44
  """
45
+ # 处理 system_prompt 和 system_prompt_path
46
+ system_prompt = self.options.system_prompt
47
+ if self.options.system_prompt_path:
48
+ try:
49
+ with open(self.options.system_prompt_path, 'r', encoding='utf-8') as f:
50
+ system_prompt = f.read().strip()
51
+ except Exception as e:
52
+ raise ValueError(f"无法读取系统提示文件 {self.options.system_prompt_path}: {str(e)}")
53
+
42
54
  return AutoCodeOptions(
43
55
  max_turns=self.options.max_turns,
44
- system_prompt=self.options.system_prompt,
56
+ system_prompt=system_prompt,
45
57
  cwd=str(self.cwd),
46
58
  allowed_tools=self.options.allowed_tools,
47
59
  permission_mode=self.options.permission_mode,
@@ -50,7 +62,14 @@ class CommandHandler:
50
62
  session_id=self.options.resume_session,
51
63
  continue_session=self.options.continue_session,
52
64
  model=self.options.model,
53
- pr=self.options.pr
65
+ verbose=self.options.verbose,
66
+ include_rules=self.options.include_rules,
67
+ pr=self.options.pr,
68
+ is_sub_agent=self.options.is_sub_agent,
69
+ loop=self.options.loop,
70
+ loop_keep_conversation=self.options.loop_keep_conversation,
71
+ loop_additional_prompt=self.options.loop_additional_prompt,
72
+ include_libs=self.options.include_libs
54
73
  )
55
74
 
56
75
  def _get_prompt(self) -> str:
@@ -70,7 +89,7 @@ class CommandHandler:
70
89
  if not sys.stdin.isatty():
71
90
  content = sys.stdin.read()
72
91
  if not content.strip():
73
- raise ValueError("未提供提示内容且标准输入为空")
92
+ raise ValueError(get_message("prompt_not_provided_empty_stdin"))
74
93
 
75
94
  # 根据输入格式处理
76
95
  if self.options.input_format == "text":
@@ -92,7 +111,20 @@ class CommandHandler:
92
111
  # 对于流式输入,暂时只支持直接传递
93
112
  return content
94
113
  else:
95
- raise ValueError("未提供提示内容且没有标准输入")
114
+ raise ValueError(get_message("prompt_not_provided_no_stdin"))
115
+
116
+ def _add_libraries(self) -> None:
117
+ """自动添加指定的 LLM friendly packages"""
118
+ try:
119
+ manager = get_package_manager(str(self.cwd))
120
+
121
+ for lib_name in self.options.include_libs:
122
+ if lib_name.strip(): # 确保库名不为空
123
+ manager.add_library(lib_name.strip())
124
+
125
+ except Exception:
126
+ # 不抛出异常,只是静默失败,因为这不应该阻止主要功能
127
+ pass
96
128
 
97
129
 
98
130
  class PrintModeHandler(CommandHandler):
@@ -107,11 +139,16 @@ class PrintModeHandler(CommandHandler):
107
139
  """
108
140
  try:
109
141
  prompt = self._get_prompt()
142
+
143
+ # 自动添加指定的 LLM friendly packages
144
+ if self.options.include_libs:
145
+ self._add_libraries()
146
+
110
147
  core_options = self._create_core_options()
111
148
  core = AutoCoderCore(core_options)
112
149
 
113
150
  # 根据会话参数构建完整的 prompt
114
- final_prompt = self._build_prompt_with_session_context(prompt)
151
+ final_prompt = prompt
115
152
 
116
153
  # 根据输出格式选择不同的处理方式
117
154
  if self.options.output_format == "stream-json":
@@ -119,57 +156,53 @@ class PrintModeHandler(CommandHandler):
119
156
  result = asyncio.run(self._handle_stream(core, final_prompt))
120
157
  else:
121
158
  # 同步查询
122
- response = core.query_sync(final_prompt)
123
-
124
- # 格式化输出
125
159
  if self.options.output_format == "json":
126
- result = self.output_formatter.format_json(response)
127
- else:
128
- result = self.output_formatter.format_text(response)
160
+ # JSON格式:使用事件流方式,禁用终端输出
161
+ events = core.query_sync(final_prompt, show_terminal=False)
162
+ json_data = {
163
+ "events": [event.to_dict() for event in events],
164
+ "summary": {
165
+ "total_events": len(events),
166
+ "start_events": len([e for e in events if e.event_type == "start"]),
167
+ "completion_events": len([e for e in events if e.event_type == "completion"]),
168
+ "error_events": len([e for e in events if e.event_type == "error"])
169
+ }
170
+ }
171
+ result = self.output_formatter.format_json(json_data)
172
+ else:
173
+ events = core.query_sync(final_prompt, show_terminal=self.options.verbose)
174
+ completion_content = ""
175
+ for event in events:
176
+ if event.event_type == "tool_call" and event.data["tool_name"] == "AttemptCompletionTool":
177
+ completion_content = event.data["args"]["result"]
178
+ break
179
+
180
+ result = self.output_formatter.format_text(completion_content)
129
181
 
130
182
  return CLIResult(success=True, output=result)
131
183
 
132
184
  except Exception as e:
133
- return CLIResult(success=False, error=str(e))
134
-
135
- def _build_prompt_with_session_context(self, prompt: str) -> str:
136
- """
137
- 根据会话参数构建完整的 prompt。
185
+ return CLIResult(success=False, output="", error=str(e))
138
186
 
139
- Args:
140
- prompt: 原始提示内容
141
-
142
- Returns:
143
- str: 构建后的完整提示
144
- """
145
- if self.options.continue_session:
146
- # 继续当前对话
147
- return f"{prompt}" if prompt else ""
148
- elif self.options.resume_session:
149
- # 恢复特定会话
150
- return f"/resume {self.options.resume_session} {prompt}" if prompt else f"/resume {self.options.resume_session}"
151
- else:
152
- # 创建新对话
153
- return f"/new {prompt}"
154
187
 
155
188
  async def _handle_stream(self, core: AutoCoderCore, prompt: str) -> str:
156
189
  """
157
- 处理流式输出。
190
+ 处理流式输出,正常打印所有事件。
158
191
 
159
192
  Args:
160
193
  core: AutoCoderCore实例
161
194
  prompt: 提示内容
162
195
 
163
196
  Returns:
164
- 处理结果
197
+ 空字符串
165
198
  """
166
- result = []
167
- async for message in core.query_stream(prompt):
168
- formatted = await anext(self.output_formatter.format_stream_json([message]))
169
- result.append(formatted)
170
- # 实时输出到stdout
171
- print(formatted, flush=True)
172
-
173
- return "\n".join(result)
199
+ # 使用 query_stream 方法获取 StreamEvent 流,正常打印所有事件
200
+ async for event in core.query_stream(prompt, show_terminal=True):
201
+ # 所有事件都会通过 core.query_stream 的内部渲染机制正常打印
202
+ # 这里不需要额外的打印逻辑
203
+ pass
204
+
205
+ # 返回空字符串
206
+ return ""
174
207
 
175
208
 
autocoder/sdk/cli/main.py CHANGED
@@ -3,22 +3,17 @@ CLI 主入口点模块
3
3
 
4
4
  提供命令行接口的主要实现,处理参数解析和命令执行。
5
5
  """
6
-
7
6
  import sys
7
+ import os
8
8
  import argparse
9
- from pathlib import Path
10
- from typing import Optional, List, Dict, Any, Union
11
-
12
- try:
13
- import argcomplete
14
- ARGCOMPLETE_AVAILABLE = True
15
- except ImportError:
16
- ARGCOMPLETE_AVAILABLE = False
17
-
18
- from .options import CLIOptions, CLIResult
9
+ from typing import Optional, List
10
+ from .options import CLIOptions, get_default_async_workdir
11
+ from ..models.responses import CLIResult
19
12
  from .handlers import PrintModeHandler
20
- from ..exceptions import AutoCoderSDKError
21
13
  from autocoder.run_context import get_run_context,RunMode
14
+ from autocoder.common.international import get_message, get_message_with_format
15
+ from autocoder.common.file_monitor import FileMonitor
16
+ import os
22
17
 
23
18
  # 设置运行模式为终端模式
24
19
  get_run_context().set_mode(RunMode.CLI)
@@ -34,7 +29,7 @@ class AutoCoderCLI:
34
29
 
35
30
  def run(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
36
31
  """
37
- 运行CLI命令 - 统一使用 Print Mode。
32
+ 运行CLI命令。
38
33
 
39
34
  Args:
40
35
  options: CLI选项
@@ -44,14 +39,57 @@ class AutoCoderCLI:
44
39
  命令执行结果
45
40
  """
46
41
  try:
47
- # 验证选项
48
- options.validate()
42
+ # 验证选项
43
+ options.validate()
44
+
45
+ # 根据命令类型分发处理
46
+ if options.command == "config":
47
+ return self.handle_config_command(options, cwd)
48
+ else:
49
+ # 默认处理代码生成命令
50
+ return self.handle_print_mode(options, cwd)
51
+
52
+ except Exception as e:
53
+ return CLIResult(success=False, output="", error=str(e))
54
+
55
+ def handle_config_command(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
56
+ """
57
+ 处理 config 命令。
58
+
59
+ Args:
60
+ options: CLI选项
61
+ cwd: 当前工作目录
62
+
63
+ Returns:
64
+ 命令执行结果
65
+ """
66
+ try:
67
+ from autocoder.auto_coder_runner import configure
68
+
69
+ if not options.config_args:
70
+ return CLIResult(success=False, output="", error="配置参数不能为空。用法: auto-coder.run config model=v3_chat")
49
71
 
50
- # 移除模式判断,直接使用 PrintModeHandler
51
- return self.handle_print_mode(options, cwd)
72
+ # 处理每个配置参数
73
+ results = []
74
+ for config_arg in options.config_args:
75
+ if "=" not in config_arg:
76
+ return CLIResult(success=False, output="", error=f"配置参数格式错误: {config_arg}。应使用 key=value 格式")
52
77
 
78
+ # 将 key=value 转换为 key:value 格式(configure 函数需要的格式)
79
+ key, value = config_arg.split("=", 1)
80
+ config_str = f"{key.strip()}:{value.strip()}"
81
+
82
+ try:
83
+ configure(config_str, skip_print=True)
84
+ results.append(f"✓ 配置成功: {key.strip()} = {value.strip()}")
85
+ except Exception as e:
86
+ return CLIResult(success=False, output="", error=f"配置失败 {config_str}: {str(e)}")
87
+
88
+ output = "\n".join(results)
89
+ return CLIResult(success=True, output=output)
90
+
53
91
  except Exception as e:
54
- return CLIResult(success=False, error=str(e))
92
+ return CLIResult(success=False, output="", error=get_message_with_format("config_command_failed", error=str(e)))
55
93
 
56
94
  def handle_print_mode(self, options: CLIOptions, cwd: Optional[str] = None) -> CLIResult:
57
95
  """
@@ -64,8 +102,14 @@ class AutoCoderCLI:
64
102
  Returns:
65
103
  命令执行结果
66
104
  """
67
- handler = PrintModeHandler(options, cwd)
68
- return handler.handle()
105
+ # 检查是否启用异步模式
106
+ if options.async_mode:
107
+ from ..async_runner.async_handler import AsyncAgentHandler
108
+ handler = AsyncAgentHandler(options, cwd)
109
+ return handler.handle()
110
+ else:
111
+ handler = PrintModeHandler(options, cwd)
112
+ return handler.handle()
69
113
 
70
114
 
71
115
  @classmethod
@@ -80,65 +124,80 @@ class AutoCoderCLI:
80
124
  解析后的CLI选项
81
125
  """
82
126
  parser = argparse.ArgumentParser(
83
- description="Auto-Coder 命令行工具",
127
+ description=get_message("cli_description"),
84
128
  formatter_class=argparse.RawDescriptionHelpFormatter,
85
- epilog="""
86
- 示例:
87
- # 基本使用
88
- auto-coder.run "Write a function to calculate Fibonacci numbers" --model gpt-4
89
-
90
- # 通过管道提供输入
91
- echo "Explain this code" | auto-coder.run --model gpt-4
92
-
93
- # 指定输出格式
94
- auto-coder.run "Generate a hello world function" --output-format json --model gpt-4
95
-
96
- # 继续最近的对话
97
- auto-coder.run --continue "继续修改代码" --model gpt-4
98
-
99
- # 恢复特定会话
100
- auto-coder.run --resume 550e8400-e29b-41d4-a716-446655440000 "新的请求" --model gpt-4
101
-
102
- # 组合使用多个选项
103
- auto-coder.run "Optimize this code" --model claude-3-sonnet --max-turns 5 --verbose
104
- """
129
+ epilog=get_message("cli_examples")
105
130
  )
106
131
 
132
+ # 创建子命令解析器
133
+ subparsers = parser.add_subparsers(dest="command", help=get_message("help_available_commands"))
134
+
135
+ # config 子命令
136
+ config_parser = subparsers.add_parser("config", help=get_message("help_config_command"))
137
+ config_parser.add_argument("config_args", nargs="*", help=get_message("help_config_args"))
138
+
139
+ # 默认命令(代码生成)- 当没有子命令时使用
107
140
  # 会话选项(移除模式选择,--continue 和 --resume 作为独立参数)
108
141
  parser.add_argument("-c", "--continue", dest="continue_session", action="store_true",
109
- help="继续最近的对话")
142
+ help=get_message("help_continue_session"))
110
143
  parser.add_argument("-r", "--resume", dest="resume_session", metavar="SESSION_ID",
111
- help="恢复特定会话")
144
+ help=get_message("help_resume_session"))
112
145
 
113
146
  # 输入输出选项
114
- parser.add_argument("prompt", nargs="?", help="提示内容,如果未提供则从stdin读取")
147
+ parser.add_argument("prompt", nargs="?", help=get_message("help_prompt"))
115
148
  parser.add_argument("--output-format", choices=["text", "json", "stream-json"],
116
- default="text", help="输出格式 (默认: text)")
149
+ default="text", help=get_message("help_output_format"))
117
150
  parser.add_argument("--input-format", choices=["text", "json", "stream-json"],
118
- default="text", help="输入格式 (默认: text)")
119
- parser.add_argument("-v", "--verbose", action="store_true", help="输出详细信息")
151
+ default="text", help=get_message("help_input_format"))
152
+ parser.add_argument("-v", "--verbose", action="store_true", help=get_message("help_verbose"))
120
153
 
121
154
  # 高级选项
122
- advanced = parser.add_argument_group("高级选项")
123
- advanced.add_argument("--max-turns", type=int, default= -1, help="最大对话轮数 (默认: -1 不限制)")
124
- advanced.add_argument("--system-prompt", help="系统提示")
125
- advanced.add_argument("--allowed-tools", nargs="+", help="允许使用的工具列表")
155
+ advanced = parser.add_argument_group(get_message("help_advanced_options"))
156
+ advanced.add_argument("--max-turns", type=int, default= 10000, help=get_message("help_max_turns"))
157
+ advanced.add_argument("--system-prompt", help=get_message("help_system_prompt"))
158
+ advanced.add_argument("--system-prompt-path", help=get_message("help_system_prompt_path"))
159
+ advanced.add_argument("--allowed-tools", nargs="+", help=get_message("help_allowed_tools"))
126
160
  advanced.add_argument("--permission-mode", choices=["manual", "acceptEdits"],
127
- default="manual", help="权限模式 (默认: manual)")
128
- advanced.add_argument("--model", required=True, help="指定使用的模型名称 (如: gpt-4, gpt-3.5-turbo, claude-3-sonnet 等)")
129
- advanced.add_argument("--pr", action="store_true", help="创建 Pull Request")
161
+ default="manual", help=get_message("help_permission_mode"))
162
+ advanced.add_argument("--model", required=False, help=get_message("help_model"))
163
+ advanced.add_argument("--include-rules", action="store_true", help=get_message("help_include_rules"))
164
+ advanced.add_argument("--pr", action="store_true", help=get_message("help_pr"))
165
+ advanced.add_argument("--is-sub-agent", action="store_true", help=get_message("help_is_sub_agent"))
166
+ advanced.add_argument("--loop", type=int, default=1, help=get_message("help_loop"))
167
+ advanced.add_argument("--loop-keep-conversation", dest="loop_keep_conversation", action="store_true", help=get_message("help_loop_keep_conversation"))
168
+ advanced.add_argument("--loop-additional-prompt", dest="loop_additional_prompt", help=get_message("help_loop_additional_prompt"))
169
+ advanced.add_argument("--include-libs", dest="include_libs", help=get_message("help_include_libs"))
130
170
 
131
- # 启用自动补全
132
- if ARGCOMPLETE_AVAILABLE:
133
- # 添加自定义补全器
134
- cls._setup_completers(parser)
135
- argcomplete.autocomplete(parser)
171
+ # 异步代理运行器选项
172
+ async_group = parser.add_argument_group(get_message("help_async_group_title"))
173
+ async_group.add_argument("--async", dest="async_mode", action="store_true",
174
+ help=get_message("help_async_mode"))
175
+ async_group.add_argument("--split", dest="split_mode", choices=["h1", "h2", "h3", "any", "delimiter"],
176
+ default="h1", help=get_message("help_split_mode"))
177
+ async_group.add_argument("--delimiter", default="===",
178
+ help=get_message("help_delimiter"))
179
+ async_group.add_argument("--min-level", type=int, default=1,
180
+ help=get_message("help_min_level"))
181
+ async_group.add_argument("--max-level", type=int, default=3,
182
+ help=get_message("help_max_level"))
183
+ async_group.add_argument("--workdir", default=get_default_async_workdir(),
184
+ help=get_message("help_workdir"))
185
+ async_group.add_argument("--from", dest="from_branch", default="",
186
+ help=get_message("help_from_branch"))
187
+ async_group.add_argument("--bg", dest="bg_mode", action="store_true",
188
+ help=get_message("help_bg_mode"))
189
+ async_group.add_argument("--task-prefix", dest="task_prefix", default="",
190
+ help=get_message("help_task_prefix"))
191
+ async_group.add_argument("--worktree-name", dest="worktree_name",
192
+ help=get_message("help_worktree_name"))
136
193
 
137
194
  # 解析参数
138
195
  parsed_args = parser.parse_args(args)
139
196
 
140
197
  # 转换为CLIOptions
141
198
  options = CLIOptions(
199
+ command=getattr(parsed_args, 'command', None),
200
+ config_args=getattr(parsed_args, 'config_args', []),
142
201
  continue_session=parsed_args.continue_session,
143
202
  resume_session=parsed_args.resume_session,
144
203
  prompt=parsed_args.prompt,
@@ -147,120 +206,32 @@ class AutoCoderCLI:
147
206
  verbose=parsed_args.verbose,
148
207
  max_turns=parsed_args.max_turns,
149
208
  system_prompt=parsed_args.system_prompt,
209
+ system_prompt_path=getattr(parsed_args, 'system_prompt_path', None),
150
210
  allowed_tools=parsed_args.allowed_tools or [],
151
211
  permission_mode=parsed_args.permission_mode,
152
212
  model=parsed_args.model,
153
- pr=parsed_args.pr
213
+ include_rules=parsed_args.include_rules,
214
+ pr=parsed_args.pr,
215
+ is_sub_agent=parsed_args.is_sub_agent,
216
+ loop=parsed_args.loop,
217
+ loop_keep_conversation=parsed_args.loop_keep_conversation,
218
+ loop_additional_prompt=parsed_args.loop_additional_prompt,
219
+ include_libs=[lib.strip() for lib in parsed_args.include_libs.split(',')] if parsed_args.include_libs else [],
220
+ # 异步代理运行器相关参数
221
+ async_mode=parsed_args.async_mode,
222
+ split_mode=parsed_args.split_mode,
223
+ delimiter=parsed_args.delimiter,
224
+ min_level=parsed_args.min_level,
225
+ max_level=parsed_args.max_level,
226
+ workdir=parsed_args.workdir,
227
+ from_branch=parsed_args.from_branch,
228
+ bg_mode=parsed_args.bg_mode,
229
+ task_prefix=parsed_args.task_prefix,
230
+ worktree_name=parsed_args.worktree_name
154
231
  )
155
232
 
156
233
  return options
157
234
 
158
- @classmethod
159
- def _setup_completers(cls, parser: argparse.ArgumentParser) -> None:
160
- """设置自定义补全器"""
161
- if not ARGCOMPLETE_AVAILABLE:
162
- return
163
-
164
- # 为 --allowed-tools 参数设置补全器
165
- def tools_completer(prefix, parsed_args, **kwargs):
166
- """工具名称补全器"""
167
- available_tools = [
168
- "execute_command",
169
- "read_file",
170
- "write_to_file",
171
- "replace_in_file",
172
- "search_files",
173
- "list_files",
174
- "list_code_definition_names",
175
- "ask_followup_question",
176
- "attempt_completion",
177
- "list_package_info",
178
- "mcp_tool",
179
- "rag_tool"
180
- ]
181
- return [tool for tool in available_tools if tool.startswith(prefix)]
182
-
183
- # 为 --resume 参数设置会话ID补全器
184
- def session_id_completer(prefix, parsed_args, **kwargs):
185
- """会话ID补全器"""
186
- try:
187
- # 这里可以从会话存储中获取可用的会话ID
188
- # 目前返回示例会话ID格式
189
- return [
190
- "550e8400-e29b-41d4-a716-446655440000",
191
- "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
192
- "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
193
- ]
194
- except Exception:
195
- return []
196
-
197
- # 为 prompt 参数设置示例补全器
198
- def prompt_completer(prefix, parsed_args, **kwargs):
199
- """提示内容补全器"""
200
- common_prompts = [
201
- "Write a function to calculate Fibonacci numbers",
202
- "Explain this code",
203
- "Generate a hello world function",
204
- "Create a simple web page",
205
- "Write unit tests for this code",
206
- "Refactor this function",
207
- "Add error handling",
208
- "Optimize this algorithm",
209
- "Document this code",
210
- "Fix the bug in this code"
211
- ]
212
- return [prompt for prompt in common_prompts if prompt.lower().startswith(prefix.lower())]
213
-
214
- # 为 --model 参数设置模型名称补全器
215
- def model_completer(prefix, parsed_args, **kwargs):
216
- """模型名称补全器"""
217
- common_models = [
218
- # OpenAI models
219
- "gpt-4",
220
- "gpt-4-turbo",
221
- "gpt-4-turbo-preview",
222
- "gpt-4-0125-preview",
223
- "gpt-4-1106-preview",
224
- "gpt-3.5-turbo",
225
- "gpt-3.5-turbo-16k",
226
- "gpt-3.5-turbo-1106",
227
- # Anthropic models
228
- "claude-3-opus",
229
- "claude-3-sonnet",
230
- "claude-3-haiku",
231
- "claude-2.1",
232
- "claude-2.0",
233
- "claude-instant-1.2",
234
- # Google models
235
- "gemini-pro",
236
- "gemini-pro-vision",
237
- # Local/Open source models
238
- "llama2-7b",
239
- "llama2-13b",
240
- "llama2-70b",
241
- "codellama-7b",
242
- "codellama-13b",
243
- "codellama-34b",
244
- "mistral-7b",
245
- "mixtral-8x7b",
246
- # Azure OpenAI
247
- "azure-gpt-4",
248
- "azure-gpt-35-turbo",
249
- ]
250
- return [model for model in common_models if model.lower().startswith(prefix.lower())]
251
-
252
- # 应用补全器到对应的参数
253
- for action in parser._actions:
254
- if hasattr(action, 'dest'):
255
- if action.dest == 'allowed_tools':
256
- action.completer = tools_completer
257
- elif action.dest == 'resume_session':
258
- action.completer = session_id_completer
259
- elif action.dest == 'prompt':
260
- action.completer = prompt_completer
261
- elif action.dest == 'model':
262
- action.completer = model_completer
263
-
264
235
  @classmethod
265
236
  def main(cls) -> int:
266
237
  """
@@ -268,9 +239,9 @@ class AutoCoderCLI:
268
239
 
269
240
  Returns:
270
241
  退出码,0表示成功,非0表示失败
271
- """
272
- try:
273
- options = cls.parse_args()
242
+ """
243
+ try:
244
+ options = cls.parse_args()
274
245
  cli = cls()
275
246
  result = cli.run(options)
276
247
 
@@ -279,12 +250,24 @@ class AutoCoderCLI:
279
250
  print(result.output)
280
251
  return 0
281
252
  else:
282
- print(f"错误: {result.error}", file=sys.stderr)
253
+ print(get_message_with_format("error_prefix", error=result.error), file=sys.stderr)
283
254
  return 1
284
255
 
285
256
  except Exception as e:
286
- print(f"未处理的错误: {str(e)}", file=sys.stderr)
257
+ # 如果是 verbose 模式,打印完整的异常堆栈
258
+ if hasattr(options, 'verbose') and options.verbose:
259
+ import traceback
260
+ print(f"[DEBUG] Unhandled exception:", file=sys.stderr)
261
+ traceback.print_exc(file=sys.stderr)
262
+ print(get_message_with_format("unhandled_error", error=str(e)), file=sys.stderr)
287
263
  return 1
264
+
265
+ finally:
266
+ try:
267
+ FileMonitor(os.getcwd()).stop()
268
+ except Exception as e:
269
+ pass
270
+
288
271
 
289
272
 
290
273
  if __name__ == "__main__":