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,162 @@
1
+
2
+
3
+
4
+ """
5
+ Tools Manager Usage Examples
6
+
7
+ 工具管理器的使用示例和演示代码。
8
+ """
9
+
10
+ import os
11
+ import tempfile
12
+ from pathlib import Path
13
+ from autocoder.common.tools_manager import ToolsManager
14
+
15
+
16
+ def example_basic_usage():
17
+ """基本使用示例"""
18
+ print("=== 基本使用示例 ===")
19
+
20
+ # 创建工具管理器实例
21
+ manager = ToolsManager()
22
+
23
+ # 加载工具
24
+ result = manager.load_tools()
25
+
26
+ print(f"加载结果: {'成功' if result.success else '失败'}")
27
+ print(f"工具总数: {result.total_count}")
28
+ print(f"失败数量: {result.failed_count}")
29
+
30
+ if result.success:
31
+ print("\n工具列表:")
32
+ for tool in result.tools:
33
+ print(f"- {tool.name}: {tool.path}")
34
+
35
+ print()
36
+
37
+
38
+ def example_get_tools_prompt():
39
+ """获取工具prompt示例"""
40
+ print("=== 获取工具Prompt示例 ===")
41
+
42
+ manager = ToolsManager()
43
+
44
+ # 获取工具prompt
45
+ prompt = manager.get_tools_prompt.prompt()
46
+ print("生成的Prompt:")
47
+ print(prompt)
48
+ print()
49
+
50
+
51
+ def example_find_specific_tool():
52
+ """查找特定工具示例"""
53
+ print("=== 查找特定工具示例 ===")
54
+
55
+ manager = ToolsManager()
56
+
57
+ # 获取所有工具名称
58
+ tool_names = manager.list_tool_names()
59
+ print(f"所有工具名称: {tool_names}")
60
+
61
+ # 查找特定工具
62
+ if tool_names:
63
+ first_tool_name = tool_names[0]
64
+ tool = manager.get_tool_by_name(first_tool_name)
65
+ if tool:
66
+ print(f"\n找到工具 '{first_tool_name}':")
67
+ print(f" 路径: {tool.path}")
68
+ print(f" 可执行: {tool.is_executable}")
69
+ print(f" 帮助信息: {tool.help_text[:100]}...")
70
+
71
+ print()
72
+
73
+
74
+ def example_create_test_tools():
75
+ """创建测试工具示例"""
76
+ print("=== 创建测试工具示例 ===")
77
+
78
+ # 创建临时目录作为工具目录
79
+ with tempfile.TemporaryDirectory() as temp_dir:
80
+ tools_dir = Path(temp_dir) / ".autocodertools"
81
+ tools_dir.mkdir(parents=True)
82
+
83
+ # 创建一个Python工具
84
+ python_tool = tools_dir / "test_tool.py"
85
+ python_tool.write_text("""#!/usr/bin/env python3
86
+ # 描述: 这是一个测试工具
87
+ # 用法: test_tool.py [选项]
88
+
89
+ import sys
90
+
91
+ def main():
92
+ if len(sys.argv) > 1 and sys.argv[1] in ['help', '-h', '--help']:
93
+ print("测试工具使用说明:")
94
+ print(" test_tool.py help - 显示此帮助信息")
95
+ print(" test_tool.py run - 运行测试")
96
+ return
97
+
98
+ print("测试工具正在运行...")
99
+
100
+ if __name__ == "__main__":
101
+ main()
102
+ """)
103
+
104
+ # 设置执行权限
105
+ python_tool.chmod(0o755)
106
+
107
+ # 创建一个Shell工具
108
+ shell_tool = tools_dir / "deploy.sh"
109
+ shell_tool.write_text("""#!/bin/bash
110
+ # 描述: 部署脚本
111
+ # 用法: deploy.sh [环境]
112
+
113
+ if [ "$1" = "help" ] || [ "$1" = "-h" ]; then
114
+ echo "部署脚本使用说明:"
115
+ echo " deploy.sh help - 显示此帮助信息"
116
+ echo " deploy.sh dev - 部署到开发环境"
117
+ echo " deploy.sh prod - 部署到生产环境"
118
+ exit 0
119
+ fi
120
+
121
+ echo "开始部署到环境: ${1:-dev}"
122
+ """)
123
+
124
+ shell_tool.chmod(0o755)
125
+
126
+ # 使用自定义目录创建工具管理器
127
+ manager = ToolsManager(tools_dirs=[str(tools_dir)])
128
+
129
+ # 加载工具
130
+ result = manager.load_tools(force_reload=True)
131
+
132
+ print(f"测试工具加载结果: {'成功' if result.success else '失败'}")
133
+ print(f"找到工具数量: {len(result.tools)}")
134
+
135
+ for tool in result.tools:
136
+ print(f"\n工具: {tool.name}")
137
+ print(f" 路径: {tool.path}")
138
+ print(f" 扩展名: {tool.file_extension}")
139
+ print(f" 可执行: {tool.is_executable}")
140
+ print(f" 帮助信息:\n{tool.help_text}")
141
+
142
+ print()
143
+
144
+
145
+ def main():
146
+ """运行所有示例"""
147
+ print("工具管理器使用示例")
148
+ print("=" * 50)
149
+
150
+ example_basic_usage()
151
+ example_get_tools_prompt()
152
+ example_find_specific_tool()
153
+ example_create_test_tools()
154
+
155
+ print("示例运行完成!")
156
+
157
+
158
+ if __name__ == "__main__":
159
+ main()
160
+
161
+
162
+
@@ -0,0 +1,385 @@
1
+ """
2
+ Tools Manager Core Implementation
3
+
4
+ 工具管理器的核心实现,负责动态加载和管理 .autocodertools 目录中的工具命令。
5
+ """
6
+
7
+ import os
8
+ from pathlib import Path
9
+ from typing import List, Optional, Dict, Any
10
+ from loguru import logger
11
+ import byzerllm
12
+
13
+ from .models import ToolCommand, ToolsLoadResult
14
+ from .utils import is_tool_command_file, extract_tool_help, get_project_name
15
+ from ..priority_directory_finder import (
16
+ PriorityDirectoryFinder,
17
+ FinderConfig,
18
+ SearchStrategy,
19
+ ValidationMode
20
+ )
21
+
22
+
23
+ class ToolsManager:
24
+ """
25
+ 工具管理器
26
+
27
+ 负责从多个优先级目录中加载和管理工具命令文件。
28
+ 支持的目录优先级(从高到低):
29
+ 1. 当前项目/.autocodertools
30
+ 2. .auto-coder/.autocodertools
31
+ 3. ~/.auto-coder/.autocodertools
32
+ 4. ~/.auto-coder/.autocodertools/repos/<项目名>
33
+ """
34
+
35
+ def __init__(self, tools_dirs: Optional[List[str]] = None):
36
+ """
37
+ 初始化工具管理器
38
+
39
+ Args:
40
+ tools_dirs: 自定义工具目录列表,如果为None则使用默认查找策略
41
+ """
42
+ self.tools_dirs = tools_dirs or self._find_tools_directories()
43
+ self._result_cache: Optional[ToolsLoadResult] = None
44
+
45
+ def _find_tools_directories(self) -> List[str]:
46
+ """
47
+ 查找所有有效的工具目录
48
+
49
+ Returns:
50
+ List[str]: 有效的工具目录路径列表
51
+ """
52
+
53
+ config = FinderConfig(strategy=SearchStrategy.MERGE_ALL)
54
+
55
+ # 添加标准目录路径
56
+ current_dir = Path.cwd()
57
+ project_name = get_project_name()
58
+
59
+ # 1. 当前项目/.autocodertools (最高优先级)
60
+ config.add_directory(
61
+ str(current_dir / ".autocodertools"),
62
+ priority=1,
63
+ validation_mode=ValidationMode.HAS_FILES
64
+ )
65
+
66
+ # 2. .auto-coder/.autocodertools
67
+ config.add_directory(
68
+ str(current_dir / ".auto-coder" / ".autocodertools"),
69
+ priority=2,
70
+ validation_mode=ValidationMode.HAS_FILES
71
+ )
72
+
73
+ # 3. ~/.auto-coder/.autocodertools
74
+ home_dir = Path.home()
75
+ config.add_directory(
76
+ str(home_dir / ".auto-coder" / ".autocodertools"),
77
+ priority=3,
78
+ validation_mode=ValidationMode.HAS_FILES
79
+ )
80
+
81
+ # 4. ~/.auto-coder/.autocodertools/repos/<项目名> (最低优先级)
82
+ config.add_directory(
83
+ str(home_dir / ".auto-coder" / ".autocodertools" / "repos" / project_name),
84
+ priority=4,
85
+ validation_mode=ValidationMode.HAS_FILES
86
+ )
87
+
88
+ finder = PriorityDirectoryFinder(config)
89
+ result = finder.find_directories()
90
+
91
+ if result.success:
92
+ logger.info(f"找到工具目录: {result.all_valid_directories}")
93
+ return result.all_valid_directories
94
+ else:
95
+ logger.warning("未找到任何工具目录")
96
+ return []
97
+
98
+
99
+ def load_tools(self, force_reload: bool = False) -> ToolsLoadResult:
100
+ """
101
+ 加载所有工具命令
102
+
103
+ Args:
104
+ force_reload: 是否强制重新加载
105
+
106
+ Returns:
107
+ ToolsLoadResult: 加载结果
108
+ """
109
+ if not force_reload and self._result_cache is not None:
110
+ return self._result_cache
111
+
112
+ all_tools = []
113
+ failed_count = 0
114
+
115
+ for tools_dir in self.tools_dirs:
116
+ if not os.path.exists(tools_dir):
117
+ continue
118
+
119
+ logger.debug(f"扫描工具目录: {tools_dir}")
120
+
121
+ try:
122
+ for item in os.listdir(tools_dir):
123
+ item_path = os.path.join(tools_dir, item)
124
+
125
+ if os.path.isfile(item_path) and is_tool_command_file(item_path):
126
+ try:
127
+ tool = self._create_tool_command(item_path, tools_dir)
128
+ if tool:
129
+ all_tools.append(tool)
130
+ logger.debug(f"加载工具: {tool.name}")
131
+ else:
132
+ failed_count += 1
133
+ except Exception as e:
134
+ logger.warning(f"加载工具文件失败 {item_path}: {e}")
135
+ failed_count += 1
136
+
137
+ except OSError as e:
138
+ logger.warning(f"读取工具目录失败 {tools_dir}: {e}")
139
+ continue
140
+
141
+ # 去重:如果多个目录中有同名工具,优先使用高优先级目录中的
142
+ unique_tools = self._deduplicate_tools(all_tools)
143
+
144
+ result = ToolsLoadResult(
145
+ success=True,
146
+ tools=unique_tools,
147
+ failed_count=failed_count
148
+ )
149
+ self._result_cache = result
150
+
151
+ return result
152
+
153
+ def _create_tool_command(self, file_path: str, source_dir: str) -> Optional[ToolCommand]:
154
+ """
155
+ 创建工具命令对象
156
+
157
+ Args:
158
+ file_path: 工具文件路径
159
+ source_dir: 来源目录
160
+
161
+ Returns:
162
+ Optional[ToolCommand]: 工具命令对象
163
+ """
164
+ path = Path(file_path)
165
+
166
+ # 提取帮助信息
167
+ help_text = extract_tool_help(file_path)
168
+
169
+ # 检查是否可执行
170
+ is_executable = os.access(file_path, os.X_OK)
171
+
172
+ return ToolCommand(
173
+ name=path.name,
174
+ path=file_path,
175
+ help_text=help_text,
176
+ is_executable=is_executable,
177
+ file_extension=path.suffix,
178
+ source_directory=source_dir
179
+ )
180
+
181
+ def _deduplicate_tools(self, tools: List[ToolCommand]) -> List[ToolCommand]:
182
+ """
183
+ 去重工具列表,保留高优先级目录中的工具
184
+
185
+ Args:
186
+ tools: 工具列表
187
+
188
+ Returns:
189
+ List[ToolCommand]: 去重后的工具列表
190
+ """
191
+ # 创建目录优先级映射
192
+ dir_priority = {dir_path: idx for idx, dir_path in enumerate(self.tools_dirs)}
193
+
194
+ # 按工具名称分组
195
+ tools_by_name: Dict[str, List[ToolCommand]] = {}
196
+ for tool in tools:
197
+ if tool.name not in tools_by_name:
198
+ tools_by_name[tool.name] = []
199
+ tools_by_name[tool.name].append(tool)
200
+
201
+ # 对每个工具名称,选择优先级最高的工具
202
+ unique_tools = []
203
+ for name, tool_list in tools_by_name.items():
204
+ if len(tool_list) == 1:
205
+ unique_tools.append(tool_list[0])
206
+ else:
207
+ # 选择优先级最高的工具
208
+ best_tool = min(
209
+ tool_list,
210
+ key=lambda t: dir_priority.get(t.source_directory, 999)
211
+ )
212
+ unique_tools.append(best_tool)
213
+
214
+ # 记录被覆盖的工具
215
+ for tool in tool_list:
216
+ if tool != best_tool:
217
+ logger.debug(f"工具 {name} 在 {tool.source_directory} 被 {best_tool.source_directory} 中的版本覆盖")
218
+
219
+ return unique_tools
220
+
221
+ def get_tool_by_name(self, name: str) -> Optional[ToolCommand]:
222
+ """
223
+ 根据名称获取工具命令
224
+
225
+ Args:
226
+ name: 工具名称
227
+
228
+ Returns:
229
+ Optional[ToolCommand]: 工具命令对象
230
+ """
231
+ result = self.load_tools()
232
+ if not result.success:
233
+ return None
234
+
235
+ for tool in result.tools:
236
+ if tool.name == name:
237
+ return tool
238
+ return None
239
+
240
+ def list_tool_names(self) -> List[str]:
241
+ """
242
+ 获取所有工具名称列表
243
+
244
+ Returns:
245
+ List[str]: 工具名称列表
246
+ """
247
+ result = self.load_tools()
248
+ if not result.success:
249
+ return []
250
+ return [tool.name for tool in result.tools]
251
+
252
+ @byzerllm.prompt()
253
+ def get_tools_prompt(self) -> str:
254
+ """
255
+ # Available External Tool Commands
256
+
257
+ Project Name: {{ project_name }}
258
+ Current Project Path: {{ project_path }}
259
+ Total Tools: {{ tools_count }}
260
+ {% if failed_count > 0 %}
261
+ Failed to Load: {{ failed_count }} tools
262
+ {% endif %}
263
+
264
+ ## Tool Directories
265
+ {% for dir in tools_directories %}
266
+ - {{ dir }}
267
+ {% endfor %}
268
+
269
+ ## Tool List
270
+
271
+ {% if tools_count == 0 %}
272
+ No available tool commands found.
273
+ {% else %}
274
+ {% for tool in tools_info %}
275
+ ### {{ tool.name }}{{ tool.file_extension }}
276
+
277
+ **Source Directory**: {{ tool.source_directory }}
278
+ **Executable**: {% if tool.is_executable %}Yes{% else %}No{% endif %}
279
+
280
+ **Usage Instructions**:
281
+ ```
282
+ {{ tool.help_text }}
283
+ ```
284
+
285
+ ---
286
+ {% endfor %}
287
+ {% endif %}
288
+
289
+ ## How to Create External Tools
290
+
291
+ ### Directory Structure (Priority Order)
292
+ Tools are loaded from these directories in priority order (highest to lowest):
293
+ 1. **Project-specific**: `./.autocodertools/` (highest priority)
294
+ 2. **Project config**: `./.auto-coder/.autocodertools/` (**recommended**)
295
+ 3. **Global user**: `~/.auto-coder/.autocodertools/`
296
+ 4. **Project-specific global**: `~/.auto-coder/.autocodertools/repos/{{ project_name }}/` (lowest priority)
297
+
298
+ > **Note**: Tools with identical names in higher priority directories will override those in lower priority directories.
299
+
300
+ ### Supported File Types
301
+ - **Executable binaries** (compiled tools, **recommended**)
302
+ - **Script files** (`.sh`, `.py`, `.js`, `.rb`, etc.)
303
+
304
+ ### Tool Development Guidelines
305
+
306
+ Please use SubAgent to create new tools. New tools should follow
307
+ the same guidelines as existing tools.
308
+
309
+ #### 1. Help Information (Required)
310
+ Your tool must provide help information using one of these methods:
311
+
312
+ **Method 1: Command-line help (Recommended)**
313
+ ```bash
314
+ your_tool help
315
+ your_tool -h
316
+ your_tool --help
317
+ ```
318
+
319
+ **Method 2: File header comments**
320
+ ```python
321
+ #!/usr/bin/env python3
322
+ # Description: Brief description of your tool
323
+ # Usage: tool_name [options] [arguments]
324
+ #
325
+ # Options:
326
+ # -h, --help Show this help message
327
+ # -v, --verbose Enable verbose output
328
+ ```
329
+
330
+ #### 2. File Permissions
331
+ - **Binary files** (no extension): Must be executable (`chmod +x`)
332
+ - **Script files** (`.py`, `.sh`, etc.): Must be readable (`chmod +r`)
333
+
334
+ #### 3. Tool Execution
335
+ Use the built-in `execute_command` tool to run your custom tools.
336
+
337
+ #### 4. **Tool is now available** - the AI assistant will discover and use it freely
338
+
339
+ ## Important Rules
340
+ 1. If you use python, try to use uv to create project {{ autocoder_home }}/.auto-coder/tool_repos and run the tool. (we not recommend using python to build tools, please try to use Go first)
341
+ 1. **MANDATORY**: All tools MUST support `help` or `-h` parameter for detailed usage information
342
+ 2. **REQUIRED**: Always use a custom sub agent to create tools and set a proper timeout for sub agent task, e.g. 1800s. - never create tools directly
343
+ 3. **STRONGLY RECOMMENDED**: Prefer Go for building tools, here is the steps:
344
+ - Create a tool project in {{ autocoder_home }}/.auto-coder/tool_repos
345
+ - Ask the subagent to develop and build the binary in the tool directory (with proper timeout). The command should like this: cd <tool directory> && echo '<prompt>' | auto-coder.run --model <model_name> --is-sub-agent
346
+ - Copy the final binary to `./.auto-coder/.autocodertools/` after completion
347
+ - If no binary is found in the directory, request the subagent to rebuild the tool
348
+ """
349
+
350
+ # 加载所有工具
351
+ result = self.load_tools()
352
+
353
+ if not result.success:
354
+ return {
355
+ "project_name": get_project_name(),
356
+ "project_path": os.getcwd(),
357
+ "autocoder_home": os.path.expanduser("~"),
358
+ "tools_count": 0,
359
+ "tools_info": [],
360
+ "failed_count": 0,
361
+ "tools_directories": self.tools_dirs,
362
+ "error_message": result.error_message or "未找到任何工具"
363
+ } # type: ignore[return]
364
+
365
+ tools_info = []
366
+ for tool in result.tools:
367
+ tools_info.append({
368
+ "name": tool.name,
369
+ "help_text": tool.help_text,
370
+ "is_executable": tool.is_executable,
371
+ "file_extension": tool.file_extension,
372
+ "source_directory": tool.source_directory
373
+ })
374
+
375
+ project_name = get_project_name()
376
+
377
+ return {
378
+ "project_name": project_name,
379
+ "project_path": os.getcwd(),
380
+ "autocoder_home": os.path.expanduser("~"),
381
+ "tools_count": len(result.tools),
382
+ "tools_info": tools_info,
383
+ "failed_count": result.failed_count,
384
+ "tools_directories": self.tools_dirs
385
+ } # type: ignore[return]
@@ -0,0 +1,39 @@
1
+
2
+ """
3
+ Tools Manager Data Models
4
+
5
+ 定义工具管理器使用的数据模型。
6
+ """
7
+
8
+ from typing import List, Optional, Dict, Any
9
+ from pathlib import Path
10
+ from pydantic import BaseModel
11
+
12
+
13
+ class ToolCommand(BaseModel):
14
+ """表示一个工具命令的信息"""
15
+ model_config = {"frozen": True, "extra": "forbid"}
16
+
17
+ name: str # 命令名称
18
+ path: str # 命令文件的完整路径
19
+ help_text: str # 命令的帮助信息
20
+ is_executable: bool # 是否可执行
21
+ file_extension: str # 文件扩展名
22
+ source_directory: str # 来源目录
23
+
24
+
25
+ class ToolsLoadResult(BaseModel):
26
+ """工具加载结果"""
27
+ model_config = {"frozen": True, "extra": "forbid"}
28
+
29
+ success: bool
30
+ tools: List[ToolCommand]
31
+ error_message: Optional[str] = None
32
+ total_count: int = 0
33
+ failed_count: int = 0
34
+
35
+ def model_post_init(self, __context: Any) -> None:
36
+ """Post-initialization hook to set total_count"""
37
+ if self.success:
38
+ object.__setattr__(self, 'total_count', len(self.tools))
39
+