auto-coder 0.1.400__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 (579) 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-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/WHEEL +1 -1
  5. {auto_coder-0.1.400.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 +25 -4
  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 +1029 -2310
  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 +1021 -372
  28. autocoder/chat_auto_coder_lang.py +23 -732
  29. autocoder/commands/auto_command.py +26 -9
  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/file_monitor/test_file_monitor.py +307 -0
  119. autocoder/common/git_utils.py +51 -10
  120. autocoder/common/global_cancel.py +15 -6
  121. autocoder/common/ignorefiles/test_ignore_file_utils.py +1 -1
  122. autocoder/common/international/__init__.py +31 -0
  123. autocoder/common/international/demo_international.py +92 -0
  124. autocoder/common/international/message_manager.py +157 -0
  125. autocoder/common/international/messages/__init__.py +56 -0
  126. autocoder/common/international/messages/async_command_messages.py +507 -0
  127. autocoder/common/international/messages/auto_coder_messages.py +2208 -0
  128. autocoder/common/international/messages/chat_auto_coder_messages.py +1547 -0
  129. autocoder/common/international/messages/command_help_messages.py +986 -0
  130. autocoder/common/international/messages/conversation_command_messages.py +191 -0
  131. autocoder/common/international/messages/git_helper_plugin_messages.py +159 -0
  132. autocoder/common/international/messages/queue_command_messages.py +751 -0
  133. autocoder/common/international/messages/rules_command_messages.py +77 -0
  134. autocoder/common/international/messages/sdk_messages.py +1707 -0
  135. autocoder/common/international/messages/token_helper_plugin_messages.py +361 -0
  136. autocoder/common/international/messages/tool_display_messages.py +1212 -0
  137. autocoder/common/international/messages/workflow_exception_messages.py +473 -0
  138. autocoder/common/international/test_international.py +612 -0
  139. autocoder/common/linter_core/__init__.py +28 -0
  140. autocoder/common/linter_core/base_linter.py +61 -0
  141. autocoder/common/linter_core/config_loader.py +271 -0
  142. autocoder/common/linter_core/formatters/__init__.py +0 -0
  143. autocoder/common/linter_core/formatters/base_formatter.py +38 -0
  144. autocoder/common/linter_core/formatters/raw_formatter.py +17 -0
  145. autocoder/common/linter_core/linter.py +166 -0
  146. autocoder/common/linter_core/linter_factory.py +216 -0
  147. autocoder/common/linter_core/linter_manager.py +333 -0
  148. autocoder/common/linter_core/linters/__init__.py +9 -0
  149. autocoder/common/linter_core/linters/java_linter.py +342 -0
  150. autocoder/common/linter_core/linters/python_linter.py +115 -0
  151. autocoder/common/linter_core/linters/typescript_linter.py +119 -0
  152. autocoder/common/linter_core/models/__init__.py +7 -0
  153. autocoder/common/linter_core/models/lint_result.py +91 -0
  154. autocoder/common/linter_core/models.py +33 -0
  155. autocoder/common/linter_core/tests/__init__.py +3 -0
  156. autocoder/common/linter_core/tests/test_config_loader.py +323 -0
  157. autocoder/common/linter_core/tests/test_config_loading.py +308 -0
  158. autocoder/common/linter_core/tests/test_factory_manager.py +234 -0
  159. autocoder/common/linter_core/tests/test_formatters.py +147 -0
  160. autocoder/common/linter_core/tests/test_integration.py +317 -0
  161. autocoder/common/linter_core/tests/test_java_linter.py +496 -0
  162. autocoder/common/linter_core/tests/test_linters.py +265 -0
  163. autocoder/common/linter_core/tests/test_models.py +81 -0
  164. autocoder/common/linter_core/tests/verify_config_loading.py +296 -0
  165. autocoder/common/linter_core/tests/verify_fixes.py +183 -0
  166. autocoder/common/llm_friendly_package/__init__.py +31 -0
  167. autocoder/common/llm_friendly_package/base_manager.py +102 -0
  168. autocoder/common/llm_friendly_package/docs_manager.py +121 -0
  169. autocoder/common/llm_friendly_package/library_manager.py +171 -0
  170. autocoder/common/{llm_friendly_package.py → llm_friendly_package/main_manager.py} +204 -231
  171. autocoder/common/llm_friendly_package/models.py +40 -0
  172. autocoder/common/llm_friendly_package/test_llm_friendly_package.py +536 -0
  173. autocoder/common/llms/__init__.py +15 -0
  174. autocoder/common/llms/demo_error_handling.py +85 -0
  175. autocoder/common/llms/factory.py +142 -0
  176. autocoder/common/llms/manager.py +264 -0
  177. autocoder/common/llms/pricing.py +121 -0
  178. autocoder/common/llms/registry.py +288 -0
  179. autocoder/common/llms/schema.py +77 -0
  180. autocoder/common/llms/simple_demo.py +45 -0
  181. autocoder/common/llms/test_quick_model.py +116 -0
  182. autocoder/common/llms/test_remove_functionality.py +182 -0
  183. autocoder/common/llms/tests/__init__.py +1 -0
  184. autocoder/common/llms/tests/test_manager.py +330 -0
  185. autocoder/common/llms/tests/test_registry.py +364 -0
  186. autocoder/common/mcp_tools/__init__.py +62 -0
  187. autocoder/common/{mcp_tools.py → mcp_tools/executor.py} +49 -40
  188. autocoder/common/{mcp_hub.py → mcp_tools/hub.py} +42 -68
  189. autocoder/common/{mcp_server_install.py → mcp_tools/installer.py} +16 -28
  190. autocoder/common/{mcp_server.py → mcp_tools/server.py} +176 -48
  191. autocoder/common/mcp_tools/test_keyboard_interrupt.py +93 -0
  192. autocoder/common/mcp_tools/test_mcp_tools.py +391 -0
  193. autocoder/common/{mcp_server_types.py → mcp_tools/types.py} +121 -48
  194. autocoder/common/mcp_tools/verify_functionality.py +202 -0
  195. autocoder/common/model_speed_tester.py +32 -26
  196. autocoder/common/priority_directory_finder/__init__.py +142 -0
  197. autocoder/common/priority_directory_finder/examples.py +230 -0
  198. autocoder/common/priority_directory_finder/finder.py +283 -0
  199. autocoder/common/priority_directory_finder/models.py +236 -0
  200. autocoder/common/priority_directory_finder/test_priority_directory_finder.py +431 -0
  201. autocoder/common/project_scanner/__init__.py +18 -0
  202. autocoder/common/project_scanner/compat.py +77 -0
  203. autocoder/common/project_scanner/scanner.py +436 -0
  204. autocoder/common/project_tracker/__init__.py +27 -0
  205. autocoder/common/project_tracker/api.py +228 -0
  206. autocoder/common/project_tracker/demo.py +272 -0
  207. autocoder/common/project_tracker/tracker.py +487 -0
  208. autocoder/common/project_tracker/types.py +53 -0
  209. autocoder/common/pruner/__init__.py +67 -0
  210. autocoder/common/pruner/agentic_conversation_pruner.py +746 -0
  211. autocoder/common/{context_pruner.py → pruner/context_pruner.py} +137 -40
  212. autocoder/common/pruner/conversation_message_ids_api.py +386 -0
  213. autocoder/common/pruner/conversation_message_ids_manager.py +347 -0
  214. autocoder/common/pruner/conversation_message_ids_pruner.py +473 -0
  215. autocoder/common/pruner/conversation_normalizer.py +347 -0
  216. autocoder/common/{conversation_pruner.py → pruner/conversation_pruner.py} +26 -6
  217. autocoder/common/pruner/test_agentic_conversation_pruner.py +784 -0
  218. autocoder/common/pruner/test_context_pruner.py +546 -0
  219. autocoder/common/pruner/test_conversation_normalizer.py +502 -0
  220. autocoder/common/pruner/test_tool_content_detector.py +324 -0
  221. autocoder/common/pruner/tool_content_detector.py +227 -0
  222. autocoder/common/pruner/tools/__init__.py +18 -0
  223. autocoder/common/pruner/tools/query_message_ids.py +264 -0
  224. autocoder/common/pruner/tools/test_agentic_pruning_logic.py +432 -0
  225. autocoder/common/pruner/tools/test_message_ids_pruning_only.py +192 -0
  226. autocoder/common/pull_requests/__init__.py +9 -1
  227. autocoder/common/pull_requests/utils.py +122 -1
  228. autocoder/common/rag_manager/rag_manager.py +36 -40
  229. autocoder/common/rulefiles/__init__.py +53 -1
  230. autocoder/common/rulefiles/api.py +250 -0
  231. autocoder/common/rulefiles/core/__init__.py +14 -0
  232. autocoder/common/rulefiles/core/manager.py +241 -0
  233. autocoder/common/rulefiles/core/selector.py +805 -0
  234. autocoder/common/rulefiles/models/__init__.py +20 -0
  235. autocoder/common/rulefiles/models/index.py +16 -0
  236. autocoder/common/rulefiles/models/init_rule.py +18 -0
  237. autocoder/common/rulefiles/models/rule_file.py +18 -0
  238. autocoder/common/rulefiles/models/rule_relevance.py +14 -0
  239. autocoder/common/rulefiles/models/summary.py +16 -0
  240. autocoder/common/rulefiles/test_rulefiles.py +776 -0
  241. autocoder/common/rulefiles/utils/__init__.py +34 -0
  242. autocoder/common/rulefiles/utils/monitor.py +86 -0
  243. autocoder/common/rulefiles/utils/parser.py +230 -0
  244. autocoder/common/save_formatted_log.py +67 -10
  245. autocoder/common/search_replace.py +8 -1
  246. autocoder/common/search_replace_patch/__init__.py +24 -0
  247. autocoder/common/search_replace_patch/base.py +115 -0
  248. autocoder/common/search_replace_patch/manager.py +248 -0
  249. autocoder/common/search_replace_patch/patch_replacer.py +304 -0
  250. autocoder/common/search_replace_patch/similarity_replacer.py +306 -0
  251. autocoder/common/search_replace_patch/string_replacer.py +181 -0
  252. autocoder/common/search_replace_patch/tests/__init__.py +3 -0
  253. autocoder/common/search_replace_patch/tests/run_tests.py +126 -0
  254. autocoder/common/search_replace_patch/tests/test_base.py +188 -0
  255. autocoder/common/search_replace_patch/tests/test_empty_line_insert.py +233 -0
  256. autocoder/common/search_replace_patch/tests/test_integration.py +389 -0
  257. autocoder/common/search_replace_patch/tests/test_manager.py +351 -0
  258. autocoder/common/search_replace_patch/tests/test_patch_replacer.py +316 -0
  259. autocoder/common/search_replace_patch/tests/test_regex_replacer.py +306 -0
  260. autocoder/common/search_replace_patch/tests/test_similarity_replacer.py +384 -0
  261. autocoder/common/shell_commands/__init__.py +197 -0
  262. autocoder/common/shell_commands/background_process_notifier.py +346 -0
  263. autocoder/common/shell_commands/command_executor.py +1127 -0
  264. autocoder/common/shell_commands/error_recovery.py +541 -0
  265. autocoder/common/shell_commands/exceptions.py +120 -0
  266. autocoder/common/shell_commands/interactive_executor.py +476 -0
  267. autocoder/common/shell_commands/interactive_pexpect_process.py +623 -0
  268. autocoder/common/shell_commands/interactive_process.py +744 -0
  269. autocoder/common/shell_commands/interactive_session_manager.py +1014 -0
  270. autocoder/common/shell_commands/monitoring.py +529 -0
  271. autocoder/common/shell_commands/process_cleanup.py +386 -0
  272. autocoder/common/shell_commands/process_manager.py +606 -0
  273. autocoder/common/shell_commands/test_interactive_pexpect_process.py +281 -0
  274. autocoder/common/shell_commands/tests/__init__.py +6 -0
  275. autocoder/common/shell_commands/tests/conftest.py +118 -0
  276. autocoder/common/shell_commands/tests/test_background_process_notifier.py +703 -0
  277. autocoder/common/shell_commands/tests/test_command_executor.py +448 -0
  278. autocoder/common/shell_commands/tests/test_error_recovery.py +305 -0
  279. autocoder/common/shell_commands/tests/test_exceptions.py +299 -0
  280. autocoder/common/shell_commands/tests/test_execute_batch.py +588 -0
  281. autocoder/common/shell_commands/tests/test_indented_batch_commands.py +244 -0
  282. autocoder/common/shell_commands/tests/test_integration.py +664 -0
  283. autocoder/common/shell_commands/tests/test_monitoring.py +546 -0
  284. autocoder/common/shell_commands/tests/test_performance.py +632 -0
  285. autocoder/common/shell_commands/tests/test_process_cleanup.py +397 -0
  286. autocoder/common/shell_commands/tests/test_process_manager.py +606 -0
  287. autocoder/common/shell_commands/tests/test_timeout_config.py +343 -0
  288. autocoder/common/shell_commands/tests/test_timeout_manager.py +520 -0
  289. autocoder/common/shell_commands/timeout_config.py +315 -0
  290. autocoder/common/shell_commands/timeout_manager.py +352 -0
  291. autocoder/common/terminal_paste/__init__.py +14 -0
  292. autocoder/common/terminal_paste/demo.py +145 -0
  293. autocoder/common/terminal_paste/demo_paste_functionality.py +95 -0
  294. autocoder/common/terminal_paste/paste_handler.py +200 -0
  295. autocoder/common/terminal_paste/paste_manager.py +118 -0
  296. autocoder/common/terminal_paste/tests/__init__.py +1 -0
  297. autocoder/common/terminal_paste/tests/test_paste_handler.py +182 -0
  298. autocoder/common/terminal_paste/tests/test_paste_manager.py +126 -0
  299. autocoder/common/terminal_paste/utils.py +163 -0
  300. autocoder/common/test_autocoder_args.py +232 -0
  301. autocoder/common/test_env_manager.py +173 -0
  302. autocoder/common/test_env_manager_integration.py +159 -0
  303. autocoder/common/text_similarity/__init__.py +9 -0
  304. autocoder/common/text_similarity/demo.py +216 -0
  305. autocoder/common/text_similarity/examples.py +266 -0
  306. autocoder/common/text_similarity/test_text_similarity.py +306 -0
  307. autocoder/common/text_similarity/text_similarity.py +194 -0
  308. autocoder/common/text_similarity/utils.py +125 -0
  309. autocoder/common/todos/__init__.py +61 -0
  310. autocoder/common/todos/cache/__init__.py +16 -0
  311. autocoder/common/todos/cache/base_cache.py +89 -0
  312. autocoder/common/todos/cache/cache_manager.py +228 -0
  313. autocoder/common/todos/cache/memory_cache.py +225 -0
  314. autocoder/common/todos/config.py +155 -0
  315. autocoder/common/todos/exceptions.py +35 -0
  316. autocoder/common/todos/get_todo_manager.py +161 -0
  317. autocoder/common/todos/manager.py +537 -0
  318. autocoder/common/todos/models.py +239 -0
  319. autocoder/common/todos/storage/__init__.py +14 -0
  320. autocoder/common/todos/storage/base_storage.py +76 -0
  321. autocoder/common/todos/storage/file_storage.py +278 -0
  322. autocoder/common/tokens/__init__.py +15 -0
  323. autocoder/common/tokens/counter.py +44 -2
  324. autocoder/common/tools_manager/__init__.py +17 -0
  325. autocoder/common/tools_manager/examples.py +162 -0
  326. autocoder/common/tools_manager/manager.py +385 -0
  327. autocoder/common/tools_manager/models.py +39 -0
  328. autocoder/common/tools_manager/test_tools_manager.py +303 -0
  329. autocoder/common/tools_manager/utils.py +191 -0
  330. autocoder/common/v2/agent/agentic_callbacks.py +270 -0
  331. autocoder/common/v2/agent/agentic_edit.py +2729 -2052
  332. autocoder/common/v2/agent/agentic_edit_change_manager.py +474 -0
  333. autocoder/common/v2/agent/agentic_edit_tools/__init__.py +43 -2
  334. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_list_tool_resolver.py +279 -0
  335. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_read_tool_resolver.py +40 -0
  336. autocoder/common/v2/agent/agentic_edit_tools/ac_mod_write_tool_resolver.py +52 -0
  337. autocoder/common/v2/agent/agentic_edit_tools/ask_followup_question_tool_resolver.py +8 -0
  338. autocoder/common/v2/agent/agentic_edit_tools/background_task_tool_resolver.py +1167 -0
  339. autocoder/common/v2/agent/agentic_edit_tools/base_tool_resolver.py +2 -2
  340. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_read_tool_resolver.py +214 -0
  341. autocoder/common/v2/agent/agentic_edit_tools/conversation_message_ids_write_tool_resolver.py +299 -0
  342. autocoder/common/v2/agent/agentic_edit_tools/count_tokens_tool_resolver.py +290 -0
  343. autocoder/common/v2/agent/agentic_edit_tools/execute_command_tool_resolver.py +565 -30
  344. autocoder/common/v2/agent/agentic_edit_tools/execute_workflow_tool_resolver.py +485 -0
  345. autocoder/common/v2/agent/agentic_edit_tools/extract_to_text_tool_resolver.py +225 -0
  346. autocoder/common/v2/agent/agentic_edit_tools/lint_report.py +79 -0
  347. autocoder/common/v2/agent/agentic_edit_tools/linter_config_models.py +343 -0
  348. autocoder/common/v2/agent/agentic_edit_tools/linter_enabled_tool_resolver.py +189 -0
  349. autocoder/common/v2/agent/agentic_edit_tools/list_files_tool_resolver.py +169 -101
  350. autocoder/common/v2/agent/agentic_edit_tools/load_extra_document_tool_resolver.py +349 -0
  351. autocoder/common/v2/agent/agentic_edit_tools/read_file_tool_resolver.py +244 -51
  352. autocoder/common/v2/agent/agentic_edit_tools/replace_in_file_tool_resolver.py +667 -147
  353. autocoder/common/v2/agent/agentic_edit_tools/run_named_subagents_tool_resolver.py +691 -0
  354. autocoder/common/v2/agent/agentic_edit_tools/search_files_tool_resolver.py +409 -140
  355. autocoder/common/v2/agent/agentic_edit_tools/session_interactive_tool_resolver.py +115 -0
  356. autocoder/common/v2/agent/agentic_edit_tools/session_start_tool_resolver.py +190 -0
  357. autocoder/common/v2/agent/agentic_edit_tools/session_stop_tool_resolver.py +76 -0
  358. autocoder/common/v2/agent/agentic_edit_tools/test_write_to_file_tool_resolver.py +209 -194
  359. autocoder/common/v2/agent/agentic_edit_tools/todo_read_tool_resolver.py +135 -0
  360. autocoder/common/v2/agent/agentic_edit_tools/todo_write_tool_resolver.py +328 -0
  361. autocoder/common/v2/agent/agentic_edit_tools/use_mcp_tool_resolver.py +2 -2
  362. autocoder/common/v2/agent/agentic_edit_tools/web_crawl_tool_resolver.py +557 -0
  363. autocoder/common/v2/agent/agentic_edit_tools/web_search_tool_resolver.py +600 -0
  364. autocoder/common/v2/agent/agentic_edit_tools/write_to_file_tool_resolver.py +56 -121
  365. autocoder/common/v2/agent/agentic_edit_types.py +386 -10
  366. autocoder/common/v2/agent/runner/__init__.py +31 -0
  367. autocoder/common/v2/agent/runner/base_runner.py +92 -0
  368. autocoder/common/v2/agent/runner/file_based_event_runner.py +217 -0
  369. autocoder/common/v2/agent/runner/sdk_runner.py +182 -0
  370. autocoder/common/v2/agent/runner/terminal_runner.py +396 -0
  371. autocoder/common/v2/agent/runner/tool_display.py +589 -0
  372. autocoder/common/v2/agent/test_agentic_callbacks.py +265 -0
  373. autocoder/common/v2/agent/test_agentic_edit.py +194 -0
  374. autocoder/common/v2/agent/tool_caller/__init__.py +24 -0
  375. autocoder/common/v2/agent/tool_caller/default_tool_resolver_map.py +135 -0
  376. autocoder/common/v2/agent/tool_caller/integration_test.py +172 -0
  377. autocoder/common/v2/agent/tool_caller/plugins/__init__.py +14 -0
  378. autocoder/common/v2/agent/tool_caller/plugins/base_plugin.py +126 -0
  379. autocoder/common/v2/agent/tool_caller/plugins/examples/__init__.py +13 -0
  380. autocoder/common/v2/agent/tool_caller/plugins/examples/logging_plugin.py +164 -0
  381. autocoder/common/v2/agent/tool_caller/plugins/examples/security_filter_plugin.py +198 -0
  382. autocoder/common/v2/agent/tool_caller/plugins/plugin_interface.py +141 -0
  383. autocoder/common/v2/agent/tool_caller/test_tool_caller.py +278 -0
  384. autocoder/common/v2/agent/tool_caller/tool_call_plugin_manager.py +331 -0
  385. autocoder/common/v2/agent/tool_caller/tool_caller.py +337 -0
  386. autocoder/common/v2/agent/tool_caller/usage_example.py +193 -0
  387. autocoder/common/v2/code_agentic_editblock_manager.py +4 -4
  388. autocoder/common/v2/code_auto_generate.py +136 -78
  389. autocoder/common/v2/code_auto_generate_diff.py +135 -79
  390. autocoder/common/v2/code_auto_generate_editblock.py +174 -99
  391. autocoder/common/v2/code_auto_generate_strict_diff.py +151 -71
  392. autocoder/common/v2/code_auto_merge.py +1 -1
  393. autocoder/common/v2/code_auto_merge_editblock.py +13 -1
  394. autocoder/common/v2/code_diff_manager.py +3 -3
  395. autocoder/common/v2/code_editblock_manager.py +4 -14
  396. autocoder/common/v2/code_manager.py +1 -1
  397. autocoder/common/v2/code_strict_diff_manager.py +2 -2
  398. autocoder/common/wrap_llm_hint/__init__.py +10 -0
  399. autocoder/common/wrap_llm_hint/test_wrap_llm_hint.py +1067 -0
  400. autocoder/common/wrap_llm_hint/utils.py +432 -0
  401. autocoder/common/wrap_llm_hint/wrap_llm_hint.py +323 -0
  402. autocoder/completer/__init__.py +8 -0
  403. autocoder/completer/command_completer_v2.py +1051 -0
  404. autocoder/default_project/__init__.py +501 -0
  405. autocoder/dispacher/__init__.py +4 -12
  406. autocoder/dispacher/actions/action.py +165 -7
  407. autocoder/dispacher/actions/plugins/action_regex_project.py +2 -2
  408. autocoder/index/entry.py +117 -125
  409. autocoder/{agent → index/filter}/agentic_filter.py +323 -334
  410. autocoder/index/filter/normal_filter.py +5 -11
  411. autocoder/index/filter/quick_filter.py +1 -1
  412. autocoder/index/index.py +36 -9
  413. autocoder/index/tests/__init__.py +1 -0
  414. autocoder/index/tests/run_tests.py +195 -0
  415. autocoder/index/tests/test_entry.py +303 -0
  416. autocoder/index/tests/test_index_manager.py +314 -0
  417. autocoder/index/tests/test_module_integration.py +300 -0
  418. autocoder/index/tests/test_symbols_utils.py +183 -0
  419. autocoder/inner/__init__.py +4 -0
  420. autocoder/inner/agentic.py +932 -0
  421. autocoder/inner/async_command_handler.py +992 -0
  422. autocoder/inner/conversation_command_handlers.py +623 -0
  423. autocoder/inner/merge_command_handler.py +213 -0
  424. autocoder/inner/queue_command_handler.py +684 -0
  425. autocoder/models.py +95 -266
  426. autocoder/plugins/git_helper_plugin.py +31 -29
  427. autocoder/plugins/token_helper_plugin.py +156 -37
  428. autocoder/pyproject/__init__.py +32 -29
  429. autocoder/rag/agentic_rag.py +215 -75
  430. autocoder/rag/cache/simple_cache.py +1 -2
  431. autocoder/rag/loaders/image_loader.py +1 -1
  432. autocoder/rag/long_context_rag.py +42 -26
  433. autocoder/rag/qa_conversation_strategy.py +1 -1
  434. autocoder/rag/terminal/__init__.py +17 -0
  435. autocoder/rag/terminal/args.py +581 -0
  436. autocoder/rag/terminal/bootstrap.py +61 -0
  437. autocoder/rag/terminal/command_handlers.py +653 -0
  438. autocoder/rag/terminal/formatters/__init__.py +20 -0
  439. autocoder/rag/terminal/formatters/base.py +70 -0
  440. autocoder/rag/terminal/formatters/json_format.py +66 -0
  441. autocoder/rag/terminal/formatters/stream_json.py +95 -0
  442. autocoder/rag/terminal/formatters/text.py +28 -0
  443. autocoder/rag/terminal/init.py +120 -0
  444. autocoder/rag/terminal/utils.py +106 -0
  445. autocoder/rag/test_agentic_rag.py +389 -0
  446. autocoder/rag/test_doc_filter.py +3 -3
  447. autocoder/rag/test_long_context_rag.py +1 -1
  448. autocoder/rag/test_token_limiter.py +517 -10
  449. autocoder/rag/token_counter.py +3 -0
  450. autocoder/rag/token_limiter.py +19 -15
  451. autocoder/rag/tools/__init__.py +26 -2
  452. autocoder/rag/tools/bochaai_example.py +343 -0
  453. autocoder/rag/tools/bochaai_sdk.py +541 -0
  454. autocoder/rag/tools/metaso_example.py +268 -0
  455. autocoder/rag/tools/metaso_sdk.py +417 -0
  456. autocoder/rag/tools/recall_tool.py +28 -7
  457. autocoder/rag/tools/run_integration_tests.py +204 -0
  458. autocoder/rag/tools/test_all_providers.py +318 -0
  459. autocoder/rag/tools/test_bochaai_integration.py +482 -0
  460. autocoder/rag/tools/test_final_integration.py +215 -0
  461. autocoder/rag/tools/test_metaso_integration.py +424 -0
  462. autocoder/rag/tools/test_metaso_real.py +171 -0
  463. autocoder/rag/tools/test_web_crawl_tool.py +639 -0
  464. autocoder/rag/tools/test_web_search_tool.py +509 -0
  465. autocoder/rag/tools/todo_read_tool.py +202 -0
  466. autocoder/rag/tools/todo_write_tool.py +412 -0
  467. autocoder/rag/tools/web_crawl_tool.py +634 -0
  468. autocoder/rag/tools/web_search_tool.py +558 -0
  469. autocoder/rag/tools/web_tools_example.py +119 -0
  470. autocoder/rag/types.py +16 -0
  471. autocoder/rag/variable_holder.py +4 -2
  472. autocoder/rags.py +86 -79
  473. autocoder/regexproject/__init__.py +23 -21
  474. autocoder/run_context.py +9 -0
  475. autocoder/sdk/__init__.py +50 -161
  476. autocoder/sdk/api.py +370 -0
  477. autocoder/sdk/async_runner/__init__.py +26 -0
  478. autocoder/sdk/async_runner/async_executor.py +650 -0
  479. autocoder/sdk/async_runner/async_handler.py +356 -0
  480. autocoder/sdk/async_runner/markdown_processor.py +595 -0
  481. autocoder/sdk/async_runner/task_metadata.py +284 -0
  482. autocoder/sdk/async_runner/worktree_manager.py +438 -0
  483. autocoder/sdk/cli/__init__.py +2 -5
  484. autocoder/sdk/cli/formatters.py +28 -204
  485. autocoder/sdk/cli/handlers.py +77 -44
  486. autocoder/sdk/cli/main.py +158 -170
  487. autocoder/sdk/cli/options.py +95 -22
  488. autocoder/sdk/constants.py +139 -51
  489. autocoder/sdk/core/auto_coder_core.py +484 -267
  490. autocoder/sdk/core/bridge.py +298 -118
  491. autocoder/sdk/exceptions.py +18 -12
  492. autocoder/sdk/formatters/__init__.py +19 -0
  493. autocoder/sdk/formatters/input.py +64 -0
  494. autocoder/sdk/formatters/output.py +247 -0
  495. autocoder/sdk/formatters/stream.py +54 -0
  496. autocoder/sdk/models/__init__.py +6 -5
  497. autocoder/sdk/models/options.py +55 -18
  498. autocoder/sdk/utils/formatters.py +27 -195
  499. autocoder/suffixproject/__init__.py +28 -25
  500. autocoder/terminal/__init__.py +14 -0
  501. autocoder/terminal/app.py +454 -0
  502. autocoder/terminal/args.py +32 -0
  503. autocoder/terminal/bootstrap.py +178 -0
  504. autocoder/terminal/command_processor.py +521 -0
  505. autocoder/terminal/command_registry.py +57 -0
  506. autocoder/terminal/help.py +97 -0
  507. autocoder/terminal/tasks/__init__.py +5 -0
  508. autocoder/terminal/tasks/background.py +77 -0
  509. autocoder/terminal/tasks/task_event.py +70 -0
  510. autocoder/terminal/ui/__init__.py +13 -0
  511. autocoder/terminal/ui/completer.py +268 -0
  512. autocoder/terminal/ui/keybindings.py +75 -0
  513. autocoder/terminal/ui/session.py +41 -0
  514. autocoder/terminal/ui/toolbar.py +64 -0
  515. autocoder/terminal/utils/__init__.py +13 -0
  516. autocoder/terminal/utils/errors.py +18 -0
  517. autocoder/terminal/utils/paths.py +19 -0
  518. autocoder/terminal/utils/shell.py +43 -0
  519. autocoder/terminal_v3/__init__.py +10 -0
  520. autocoder/terminal_v3/app.py +201 -0
  521. autocoder/terminal_v3/handlers/__init__.py +5 -0
  522. autocoder/terminal_v3/handlers/command_handler.py +131 -0
  523. autocoder/terminal_v3/models/__init__.py +6 -0
  524. autocoder/terminal_v3/models/conversation_buffer.py +214 -0
  525. autocoder/terminal_v3/models/message.py +50 -0
  526. autocoder/terminal_v3/models/tool_display.py +247 -0
  527. autocoder/terminal_v3/ui/__init__.py +7 -0
  528. autocoder/terminal_v3/ui/keybindings.py +56 -0
  529. autocoder/terminal_v3/ui/layout.py +141 -0
  530. autocoder/terminal_v3/ui/styles.py +43 -0
  531. autocoder/tsproject/__init__.py +23 -23
  532. autocoder/utils/auto_coder_utils/chat_stream_out.py +1 -1
  533. autocoder/utils/llms.py +88 -80
  534. autocoder/utils/math_utils.py +101 -0
  535. autocoder/utils/model_provider_selector.py +16 -4
  536. autocoder/utils/operate_config_api.py +33 -5
  537. autocoder/utils/thread_utils.py +2 -2
  538. autocoder/version.py +4 -2
  539. autocoder/workflow_agents/__init__.py +84 -0
  540. autocoder/workflow_agents/agent.py +143 -0
  541. autocoder/workflow_agents/exceptions.py +573 -0
  542. autocoder/workflow_agents/executor.py +489 -0
  543. autocoder/workflow_agents/loader.py +737 -0
  544. autocoder/workflow_agents/runner.py +267 -0
  545. autocoder/workflow_agents/types.py +172 -0
  546. autocoder/workflow_agents/utils.py +434 -0
  547. autocoder/workflow_agents/workflow_manager.py +211 -0
  548. auto_coder-0.1.400.dist-info/METADATA +0 -396
  549. auto_coder-0.1.400.dist-info/RECORD +0 -425
  550. auto_coder-0.1.400.dist-info/licenses/LICENSE +0 -201
  551. autocoder/auto_coder_server.py +0 -672
  552. autocoder/benchmark.py +0 -138
  553. autocoder/common/ac_style_command_parser/example.py +0 -7
  554. autocoder/common/cleaner.py +0 -31
  555. autocoder/common/command_completer_v2.py +0 -615
  556. autocoder/common/directory_cache/__init__.py +0 -1
  557. autocoder/common/directory_cache/cache.py +0 -192
  558. autocoder/common/directory_cache/test_cache.py +0 -190
  559. autocoder/common/file_checkpoint/examples.py +0 -217
  560. autocoder/common/llm_friendly_package_example.py +0 -138
  561. autocoder/common/llm_friendly_package_test.py +0 -63
  562. autocoder/common/pull_requests/test_module.py +0 -1
  563. autocoder/common/rulefiles/autocoderrules_utils.py +0 -484
  564. autocoder/common/text.py +0 -30
  565. autocoder/common/v2/agent/agentic_edit_tools/list_package_info_tool_resolver.py +0 -42
  566. autocoder/common/v2/agent/agentic_edit_tools/test_execute_command_tool_resolver.py +0 -70
  567. autocoder/common/v2/agent/agentic_edit_tools/test_search_files_tool_resolver.py +0 -163
  568. autocoder/common/v2/agent/agentic_tool_display.py +0 -183
  569. autocoder/plugins/dynamic_completion_example.py +0 -148
  570. autocoder/plugins/sample_plugin.py +0 -160
  571. autocoder/sdk/cli/__main__.py +0 -26
  572. autocoder/sdk/cli/completion_wrapper.py +0 -38
  573. autocoder/sdk/cli/install_completion.py +0 -301
  574. autocoder/sdk/models/messages.py +0 -209
  575. autocoder/sdk/session/__init__.py +0 -32
  576. autocoder/sdk/session/session.py +0 -106
  577. autocoder/sdk/session/session_manager.py +0 -56
  578. {auto_coder-0.1.400.dist-info → auto_coder-2.0.0.dist-info}/top_level.txt +0 -0
  579. /autocoder/{sdk/example.py → common/agent_query_queue/__init__.py} +0 -0
@@ -0,0 +1,250 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ RuleFiles API 接口
4
+
5
+ 提供所有公共 API 函数和便利函数。
6
+ """
7
+
8
+ import os
9
+ from typing import Dict, List, Optional, Union, Any
10
+ from loguru import logger
11
+
12
+ # 导入第三方依赖
13
+ import byzerllm
14
+ from autocoder.common import AutoCoderArgs
15
+
16
+ # 导入数据模型
17
+ from .models.rule_file import RuleFile
18
+ from .models.summary import AlwaysApplyRuleSummary
19
+ from .models.index import ConditionalRulesIndex
20
+ from .models.init_rule import InitRule
21
+
22
+ # 导入核心组件
23
+ from .core.manager import AutocoderRulesManager
24
+ from .core.selector import RuleSelector
25
+
26
+
27
+ # 对外提供单例
28
+ _rules_manager = None
29
+
30
+
31
+ def get_rules(project_root: Optional[str] = None) -> Dict[str, str]:
32
+ """获取所有规则文件内容,可指定项目根目录"""
33
+ global _rules_manager
34
+ if _rules_manager is None:
35
+ _rules_manager = AutocoderRulesManager(project_root=project_root)
36
+ return _rules_manager.get_rules()
37
+
38
+
39
+ def get_parsed_rules(project_root: Optional[str] = None) -> List[RuleFile]:
40
+ """获取所有解析后的规则文件,可指定项目根目录"""
41
+ global _rules_manager
42
+ if _rules_manager is None:
43
+ _rules_manager = AutocoderRulesManager(project_root=project_root)
44
+ return _rules_manager.get_parsed_rules()
45
+
46
+
47
+ def parse_rule_file(file_path: str, project_root: Optional[str] = None) -> RuleFile:
48
+ """解析指定的规则文件,可指定项目根目录"""
49
+ global _rules_manager
50
+ if _rules_manager is None:
51
+ _rules_manager = AutocoderRulesManager(project_root=project_root)
52
+ return _rules_manager.parse_rule_file(file_path)
53
+
54
+
55
+ def reset_rules_manager():
56
+ """重置AutocoderRulesManager单例实例"""
57
+ AutocoderRulesManager.reset_instance()
58
+ global _rules_manager
59
+ _rules_manager = None
60
+
61
+
62
+ def auto_select_rules(context: str, llm: Optional[byzerllm.ByzerLLM] = None, args: Optional[AutoCoderArgs] = None) -> Dict[str, str]:
63
+ """
64
+ 根据LLM的判断和规则元数据选择适用的规则。
65
+
66
+ Args:
67
+ context: 上下文信息
68
+ llm: ByzerLLM 实例
69
+ args: 可选的 AutoCoderArgs 参数
70
+
71
+ Returns:
72
+ Dict[str, str]: 选定规则的 {file_path: content} 字典
73
+ """
74
+ selector = RuleSelector(llm=llm, args=args)
75
+ return selector.get_selected_rules_content(context=context)
76
+
77
+
78
+ def get_required_and_index_rules() -> Dict[str, str]:
79
+ """
80
+ 获取所有必须应用的规则文件(always_apply=True)和Index.md文件。
81
+
82
+ Returns:
83
+ Dict[str, str]: 包含必须应用的规则和Index.md文件的{file_path: content}字典。
84
+ """
85
+ # 获取所有解析后的规则文件
86
+ parsed_rules = get_parsed_rules()
87
+ result: Dict[str, str] = {}
88
+ logger.info(f"获取所有解析后的规则文件完成,总数: {len(parsed_rules)}")
89
+
90
+ for rule in parsed_rules:
91
+ # 检查是否是always_apply=True的规则
92
+ if rule.always_apply:
93
+ result[rule.file_path] = rule.content
94
+ logger.info(f"添加必须应用的规则: {os.path.basename(rule.file_path)}")
95
+
96
+ # 检查是否是Index.md文件
97
+ if os.path.basename(rule.file_path).lower() == "index.md":
98
+ result[rule.file_path] = rule.content
99
+ logger.info(f"添加Index.md文件: {rule.file_path}")
100
+
101
+ logger.info(f"获取必须应用的规则和Index.md文件完成,总数: {len(result)}")
102
+ return result
103
+
104
+
105
+ def generate_always_apply_summary(llm: Optional[Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM]], args: Optional[AutoCoderArgs] = None) -> Optional[AlwaysApplyRuleSummary]:
106
+ """
107
+ 便利函数:生成所有必须应用规则的合并摘要。
108
+
109
+ Args:
110
+ llm: ByzerLLM 实例
111
+ args: 可选的 AutoCoderArgs 参数
112
+
113
+ Returns:
114
+ AlwaysApplyRuleSummary: 合并后的规则摘要,如果没有 LLM 则返回 None
115
+ """
116
+ selector = RuleSelector(llm=llm, args=args)
117
+ return selector.generate_always_apply_summary()
118
+
119
+
120
+ def generate_conditional_rules_index(llm: Optional[Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM]], args: Optional[AutoCoderArgs] = None) -> Optional[ConditionalRulesIndex]:
121
+ """
122
+ 便利函数:生成所有条件规则的索引目录。
123
+
124
+ Args:
125
+ llm: ByzerLLM 实例
126
+ args: 可选的 AutoCoderArgs 参数
127
+
128
+ Returns:
129
+ ConditionalRulesIndex: 条件规则索引,如果没有 LLM 则返回 None
130
+ """
131
+ selector = RuleSelector(llm=llm, args=args)
132
+ return selector.generate_conditional_rules_index()
133
+
134
+
135
+ def init_rule(llm: Optional[Union[byzerllm.ByzerLLM, byzerllm.SimpleByzerLLM]] = None,
136
+ args: Optional[AutoCoderArgs] = None,
137
+ project_root: Optional[str] = None) -> Optional[InitRule]:
138
+ """
139
+ 使用 subagent 机制探索项目结构并生成初始化规则,自动保存到 .autocoderrules/init.md 文件。
140
+
141
+ Args:
142
+ llm: ByzerLLM 实例(可选,因为使用 subagent 机制)
143
+ args: 可选的 AutoCoderArgs 参数
144
+ project_root: 项目根目录,如果为 None 则使用当前目录
145
+
146
+ Returns:
147
+ InitRule: 生成的初始化规则对象,如果失败则返回 None
148
+ """
149
+ try:
150
+ # 确定项目根目录
151
+ if project_root is None:
152
+ project_root = os.getcwd()
153
+
154
+ logger.info(f"使用 subagent 机制开始为项目生成初始化规则: {project_root}")
155
+
156
+ # 使用 RuleSelector 生成初始化规则,subagent 机制会自动处理文件写入
157
+ selector = RuleSelector(llm=llm, args=args)
158
+ init_rule_result = selector.generate_init_rule(project_root=project_root)
159
+
160
+ if init_rule_result is None:
161
+ logger.error("使用 subagent 机制生成初始化规则失败")
162
+ return None
163
+
164
+ logger.info(f"成功使用 subagent 机制生成初始化规则")
165
+ logger.info(f"初始化规则文件: {init_rule_result.file_path}")
166
+ logger.info(f"项目类型: {init_rule_result.project_type}")
167
+ logger.info(f"检测到的技术栈: {', '.join(init_rule_result.technologies)}")
168
+ logger.info(f"检测到的命令: {', '.join(init_rule_result.commands)}")
169
+
170
+ return init_rule_result
171
+
172
+ except Exception as e:
173
+ logger.error(f"使用 subagent 机制生成初始化规则时出错: {e}", exc_info=True)
174
+ return None
175
+
176
+
177
+ def get_rules_for_conversation(project_root: Optional[str] = None) -> Optional[str]:
178
+ """
179
+ 获取格式化的规则文本,用于添加到对话中。
180
+
181
+ 将必须规则(alwaysApply=true)的完整内容和条件规则(alwaysApply=false)的描述信息
182
+ 格式化为适合对话的文本格式。
183
+
184
+ Args:
185
+ project_root: 项目根目录,如果为 None 则使用当前目录
186
+
187
+ Returns:
188
+ str: 格式化的规则文本,如果没有规则则返回 None
189
+ """
190
+ try:
191
+ # 获取所有解析后的规则
192
+ all_rules = get_parsed_rules(project_root)
193
+
194
+ if not all_rules:
195
+ logger.info("未找到任何规则文件")
196
+ return None
197
+
198
+ # 分离必须规则和条件规则
199
+ required_rules = [rule for rule in all_rules if rule.always_apply]
200
+ conditional_rules = [rule for rule in all_rules if not rule.always_apply]
201
+
202
+ # 构建消息内容
203
+ message_parts = []
204
+
205
+ # 添加必须规则的完整内容
206
+ if required_rules:
207
+ message_parts.append("## Required Rules (Always Applied)")
208
+ message_parts.append("The following rules must always be followed:")
209
+ message_parts.append("")
210
+
211
+ for rule in required_rules:
212
+ rule_name = os.path.basename(rule.file_path)
213
+ message_parts.append(f"### {rule_name}")
214
+ if rule.description:
215
+ message_parts.append(f"**Description**: {rule.description}")
216
+ if rule.globs:
217
+ message_parts.append(f"**Applicable Files**: {', '.join(rule.globs)}")
218
+ message_parts.append("")
219
+ message_parts.append(rule.content)
220
+ message_parts.append("")
221
+
222
+ # 添加条件规则的描述和路径
223
+ if conditional_rules:
224
+ message_parts.append("## Conditional Rules (Apply as Needed)")
225
+ message_parts.append("The following rules are available for specific contexts. Use the read_file tool to read their full content when needed:")
226
+ message_parts.append("")
227
+
228
+ for rule in conditional_rules:
229
+ rule_name = os.path.basename(rule.file_path)
230
+ message_parts.append(f"### {rule_name}")
231
+ message_parts.append(f"**Path**: `{rule.file_path}`")
232
+ if rule.description:
233
+ message_parts.append(f"**Description**: {rule.description}")
234
+ if rule.globs:
235
+ message_parts.append(f"**Applicable Files**: {', '.join(rule.globs)}")
236
+ message_parts.append("")
237
+
238
+ # 如果没有任何规则,返回 None
239
+ if not message_parts:
240
+ return None
241
+
242
+ combined_rules = "\n".join(message_parts)
243
+ logger.info(f"成功格式化规则文本,必须规则: {len(required_rules)}, 条件规则: {len(conditional_rules)}")
244
+ return combined_rules
245
+
246
+ except Exception as e:
247
+ logger.error(f"获取对话规则时出错: {e}", exc_info=True)
248
+ return None
249
+
250
+
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ RuleFiles 核心功能
4
+
5
+ 包含规则管理器和规则选择器等核心组件。
6
+ """
7
+
8
+ from .manager import AutocoderRulesManager
9
+ from .selector import RuleSelector
10
+
11
+ __all__ = [
12
+ 'AutocoderRulesManager',
13
+ 'RuleSelector',
14
+ ]
@@ -0,0 +1,241 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ AutocoderRulesManager
4
+
5
+ 规则管理器,负责加载、监控和管理规则文件。
6
+ 实现单例模式,确保全局只有一个规则管理实例。
7
+ """
8
+
9
+ import os
10
+ import re
11
+ import yaml
12
+ from typing import Dict, List, Optional, Set, TYPE_CHECKING
13
+ from threading import Lock
14
+ from loguru import logger
15
+
16
+ # 导入数据模型
17
+ from ..models.rule_file import RuleFile
18
+
19
+ # 导入工具函数
20
+ from ..utils.parser import parse_rule_file as parse_rule_file_util
21
+
22
+ # 条件导入以避免循环依赖
23
+ if TYPE_CHECKING:
24
+ pass
25
+
26
+
27
+ class AutocoderRulesManager:
28
+ """
29
+ 管理 autocoderrules 目录中的规则文件。
30
+
31
+ 实现单例模式,确保全局只有一个规则管理实例。
32
+ 每次访问时都会重新加载规则文件。
33
+ """
34
+ _instance = None
35
+ _lock = Lock()
36
+
37
+ def __new__(cls, project_root: Optional[str] = None):
38
+ if not cls._instance:
39
+ with cls._lock:
40
+ if not cls._instance:
41
+ cls._instance = super(AutocoderRulesManager, cls).__new__(cls)
42
+ cls._instance._initialized = False
43
+ return cls._instance
44
+
45
+ def __init__(self, project_root: Optional[str] = None):
46
+ if self._initialized:
47
+ return
48
+ self._initialized = True
49
+
50
+ self._rules: Dict[str, str] = {} # 存储规则文件内容: {file_path: content}
51
+ self._rules_dir: Optional[str] = None # 当前使用的规则目录
52
+ self._project_root = project_root if project_root is not None else os.getcwd() # 项目根目录
53
+
54
+ # 加载规则
55
+ self._load_rules()
56
+
57
+ def _load_rules(self):
58
+ """
59
+ 重新实现的规则加载逻辑,不使用 FinderConfig。
60
+ 加载顺序:
61
+ 1. 项目级规则文件(按优先级)
62
+ 2. 全局规则文件 (~/.auto-coder/autocoderrules)
63
+ 3. 全局 repos 子目录规则(基于当前目录名)
64
+
65
+ 确保不重复加载相同的文件。
66
+ """
67
+ self._rules = {}
68
+ loaded_files: Set[str] = set() # 跟踪已加载的文件,避免重复
69
+
70
+ # 1. 加载项目级规则文件(按优先级)
71
+ self._load_project_rules(loaded_files)
72
+
73
+ # 2. 加载全局规则文件
74
+ self._load_global_rules(loaded_files)
75
+
76
+ # 3. 加载全局 repos 子目录规则
77
+ self._load_global_repos_rules(loaded_files)
78
+
79
+ logger.info(f"总共加载了 {len(self._rules)} 个规则文件")
80
+
81
+ def _load_project_rules(self, loaded_files: Set[str]):
82
+ """加载项目级规则文件,按优先级顺序"""
83
+ project_root = self._project_root
84
+
85
+ # 按优先级定义项目级规则目录
86
+ project_dirs = [
87
+ os.path.join(project_root, ".autocoderrules"),
88
+ os.path.join(project_root, ".auto-coder", ".autocoderrules"),
89
+ os.path.join(project_root, ".auto-coder", "autocoderrules")
90
+ ]
91
+
92
+ # 查找第一个包含 .md 文件的目录
93
+ for rules_dir in project_dirs:
94
+ if self._has_md_files(rules_dir):
95
+ self._rules_dir = rules_dir
96
+ logger.info(f"找到项目规则目录: {rules_dir}")
97
+ self._load_rules_from_directory(rules_dir, loaded_files)
98
+ return
99
+
100
+ logger.info("未找到项目级规则目录")
101
+
102
+ def _load_global_rules(self, loaded_files: Set[str]):
103
+ """加载全局规则文件 (~/.auto-coder/autocoderrules)"""
104
+ home_dir = os.path.expanduser("~")
105
+ global_rules_dir = os.path.join(home_dir, ".auto-coder", "autocoderrules")
106
+
107
+ if self._has_md_files(global_rules_dir):
108
+ logger.info(f"找到全局规则目录: {global_rules_dir}")
109
+ self._load_rules_from_directory(global_rules_dir, loaded_files)
110
+ else:
111
+ logger.info("未找到全局规则目录")
112
+
113
+ def _load_global_repos_rules(self, loaded_files: Set[str]):
114
+ """加载全局 repos 子目录规则(基于当前目录名)"""
115
+ home_dir = os.path.expanduser("~")
116
+ global_rules_dir = os.path.join(home_dir, ".auto-coder", "autocoderrules")
117
+ repos_dir = os.path.join(global_rules_dir, "repos")
118
+
119
+ if not os.path.isdir(repos_dir):
120
+ logger.info("未找到全局 repos 目录")
121
+ return
122
+
123
+ # 获取当前目录名
124
+ current_dir_name = os.path.basename(self._project_root)
125
+ repo_specific_dir = os.path.join(repos_dir, current_dir_name)
126
+
127
+ if self._has_md_files(repo_specific_dir):
128
+ logger.info(f"找到仓库特定规则目录: {repo_specific_dir}")
129
+ self._load_rules_from_directory(repo_specific_dir, loaded_files)
130
+ else:
131
+ logger.info(f"未找到仓库特定规则目录: {repo_specific_dir}")
132
+
133
+ def _has_md_files(self, directory: str) -> bool:
134
+ """检查目录是否存在且包含 .md 文件"""
135
+ if not os.path.isdir(directory):
136
+ return False
137
+
138
+ try:
139
+ for fname in os.listdir(directory):
140
+ if fname.endswith(".md"):
141
+ return True
142
+ return False
143
+ except Exception as e:
144
+ logger.warning(f"检查目录 {directory} 时出错: {e}")
145
+ return False
146
+
147
+ def _load_rules_from_directory(self, rules_dir: str, loaded_files: Set[str]):
148
+ """从指定目录加载规则文件,避免重复加载"""
149
+ logger.info(f"扫描规则目录: {rules_dir}")
150
+ try:
151
+ for fname in os.listdir(rules_dir):
152
+ if fname.endswith(".md"):
153
+ fpath = os.path.join(rules_dir, fname)
154
+
155
+ # 使用规范化路径避免重复加载
156
+ normalized_path = os.path.normpath(os.path.abspath(fpath))
157
+ if normalized_path in loaded_files:
158
+ logger.info(f"跳过重复文件: {fpath}")
159
+ continue
160
+
161
+ try:
162
+ with open(fpath, "r", encoding="utf-8") as f:
163
+ content = f.read()
164
+ self._rules[fpath] = content
165
+ loaded_files.add(normalized_path)
166
+ logger.info(f"已加载规则文件: {fpath}")
167
+ except Exception as e:
168
+ logger.warning(f"加载规则文件 {fpath} 时出错: {e}")
169
+ continue
170
+ except Exception as e:
171
+ logger.warning(f"读取规则目录 {rules_dir} 时出错: {e}")
172
+
173
+ def parse_rule_file(self, file_path: str) -> RuleFile:
174
+ """
175
+ 解析规则文件并返回结构化的Pydantic模型对象
176
+
177
+ Args:
178
+ file_path: 规则文件的路径
179
+
180
+ Returns:
181
+ RuleFile: 包含规则文件结构化内容的Pydantic模型
182
+ """
183
+ if not os.path.exists(file_path) or not file_path.endswith('.md'):
184
+ logger.warning(f"无效的规则文件路径: {file_path}")
185
+ return RuleFile(file_path=file_path)
186
+
187
+ try:
188
+ with open(file_path, 'r', encoding='utf-8') as f:
189
+ content = f.read()
190
+
191
+ # 解析YAML头部和Markdown内容
192
+ yaml_pattern = re.compile(r'^---\s*\n(.*?)\n---\s*\n', re.DOTALL)
193
+ yaml_match = yaml_pattern.search(content)
194
+
195
+ metadata = {}
196
+ markdown_content = content
197
+
198
+ if yaml_match:
199
+ yaml_content = yaml_match.group(1)
200
+ try:
201
+ metadata = yaml.safe_load(yaml_content)
202
+ # 移除YAML部分,仅保留Markdown内容
203
+ markdown_content = content[yaml_match.end():]
204
+ except Exception as e:
205
+ logger.warning(f"解析规则文件YAML头部时出错: {e}")
206
+
207
+ # 创建并返回Pydantic模型
208
+ rule = RuleFile(
209
+ description=metadata.get('description', ''),
210
+ globs=metadata.get('globs', []),
211
+ always_apply=metadata.get('alwaysApply', False),
212
+ content=markdown_content.strip(),
213
+ file_path=file_path
214
+ )
215
+ return rule
216
+
217
+ except Exception as e:
218
+ logger.warning(f"解析规则文件时出错: {file_path}, 错误: {e}")
219
+ return RuleFile(file_path=file_path)
220
+
221
+ def get_rules(self) -> Dict[str, str]:
222
+ """获取所有规则文件内容,总是重新加载"""
223
+ self._load_rules() # 总是重新加载
224
+ return self._rules.copy()
225
+
226
+ def get_parsed_rules(self) -> List[RuleFile]:
227
+ """获取所有解析后的规则文件,总是重新加载"""
228
+ self._load_rules() # 总是重新加载
229
+ parsed_rules = []
230
+ for file_path in self._rules:
231
+ parsed_rule = self.parse_rule_file(file_path)
232
+ parsed_rules.append(parsed_rule)
233
+ return parsed_rules
234
+
235
+ @classmethod
236
+ def reset_instance(cls):
237
+ """重置单例实例"""
238
+ with cls._lock:
239
+ if cls._instance is not None:
240
+ cls._instance = None
241
+ logger.info("AutocoderRulesManager单例已被重置")