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
@@ -1,231 +1,76 @@
1
1
  """
2
- LLM Friendly Package Manager
2
+ Main LLM Friendly Package Manager
3
3
 
4
- This module provides a class-based interface for managing LLM friendly packages,
5
- including operations like get, list, list_all, add, remove, refresh, etc.
4
+ This module provides the complete package management functionality,
5
+ integrating with the core_config module for state management.
6
6
  """
7
7
 
8
8
  import os
9
- import json
10
- from typing import List, Dict, Any, Optional, Tuple
11
- from dataclasses import dataclass
9
+ from typing import List, Optional, Dict, Any
12
10
  from rich.console import Console
13
11
  from rich.table import Table
14
12
  import git
15
- from filelock import FileLock
13
+ from git import GitCommandError
16
14
 
17
-
18
- @dataclass
19
- class LibraryInfo:
20
- """Information about a library"""
21
- domain: str
22
- username: str
23
- lib_name: str
24
- full_path: str
25
- is_added: bool
26
- has_md_files: bool = True
27
-
28
-
29
- @dataclass
30
- class PackageDoc:
31
- """Package documentation information"""
32
- file_path: str
33
- content: Optional[str] = None
15
+ from autocoder.common.core_config import get_memory_manager
16
+ from .models import LibraryInfo, LibraryList, DocsList, RepositoryInfo
34
17
 
35
18
 
36
19
  class LLMFriendlyPackageManager:
37
- """Manager for LLM friendly packages"""
20
+ """
21
+ Complete LLM Friendly Package Manager
22
+
23
+ This class provides all package management functionality including:
24
+ - Library management (add, remove, list)
25
+ - Documentation management (get docs, paths)
26
+ - Repository management (clone, refresh, proxy)
27
+ - Display management (tables, output)
28
+ """
38
29
 
39
- def __init__(self, project_root: str = None, base_persist_dir: str = None):
30
+ def __init__(self, project_root: Optional[str] = None):
40
31
  """
41
32
  Initialize the package manager
42
33
 
43
34
  Args:
44
35
  project_root: Project root directory, defaults to current working directory
45
- base_persist_dir: Base directory for persistence, defaults to .auto-coder/plugins/chat-auto-coder
46
36
  """
47
37
  self.project_root = project_root or os.getcwd()
48
- self.base_persist_dir = base_persist_dir or os.path.join(
49
- self.project_root, ".auto-coder", "plugins", "chat-auto-coder"
50
- )
38
+ self.memory_manager = get_memory_manager(self.project_root)
39
+ self.console = Console()
40
+
41
+ # Set up directory paths
51
42
  self.lib_dir = os.path.join(self.project_root, ".auto-coder", "libs")
52
43
  self.llm_friendly_packages_dir = os.path.join(self.lib_dir, "llm_friendly_packages")
53
- self.console = Console()
54
44
 
55
45
  # Ensure directories exist
56
- os.makedirs(self.lib_dir, exist_ok=True)
57
- os.makedirs(self.base_persist_dir, exist_ok=True)
58
-
59
- def _get_memory_path(self) -> str:
60
- """Get memory file path"""
61
- return os.path.join(self.base_persist_dir, "memory.json")
46
+ self._ensure_dirs()
62
47
 
63
- def _load_memory(self) -> Dict[str, Any]:
64
- """Load memory from file"""
65
- memory_path = self._get_memory_path()
66
- lock_path = memory_path + ".lock"
67
-
68
- default_memory = {
69
- "conversation": [],
70
- "current_files": {"files": [], "groups": {}},
71
- "conf": {},
72
- "exclude_dirs": [],
73
- "mode": "auto_detect",
74
- "libs": {}
75
- }
76
-
77
- if not os.path.exists(memory_path):
78
- return default_memory
79
-
80
- try:
81
- with FileLock(lock_path, timeout=30):
82
- with open(memory_path, "r", encoding="utf-8") as f:
83
- memory = json.load(f)
84
- # Ensure libs key exists
85
- if "libs" not in memory:
86
- memory["libs"] = {}
87
- return memory
88
- except Exception:
89
- return default_memory
48
+ def _ensure_dirs(self):
49
+ """Ensure required directories exist"""
50
+ os.makedirs(self.lib_dir, exist_ok=True)
90
51
 
91
- def _save_memory(self, memory: Dict[str, Any]) -> None:
92
- """Save memory to file"""
93
- memory_path = self._get_memory_path()
94
- lock_path = memory_path + ".lock"
95
-
96
- with FileLock(lock_path, timeout=30):
97
- with open(memory_path, "w", encoding="utf-8") as f:
98
- json.dump(memory, f, indent=2, ensure_ascii=False)
52
+ @property
53
+ def default_proxy_url(self) -> str:
54
+ """Get default proxy URL"""
55
+ return "https://github.com/allwefantasy/llm_friendly_packages"
99
56
 
100
57
  def _get_current_proxy(self) -> str:
101
- """Get current proxy URL"""
102
- memory = self._load_memory()
103
- return memory.get("lib-proxy", "https://github.com/allwefantasy/llm_friendly_packages")
104
-
105
- def _clone_repository(self) -> bool:
106
- """Clone the llm_friendly_packages repository"""
107
- if os.path.exists(self.llm_friendly_packages_dir):
108
- return True
109
-
110
- self.console.print("Cloning llm_friendly_packages repository...")
111
- try:
112
- proxy_url = self._get_current_proxy()
113
- git.Repo.clone_from(proxy_url, self.llm_friendly_packages_dir)
114
- self.console.print("Successfully cloned llm_friendly_packages repository")
115
- return True
116
- except git.exc.GitCommandError as e:
117
- self.console.print(f"Error cloning repository: {e}")
118
- return False
119
-
120
- def get_docs(self, package_name: Optional[str] = None, return_paths: bool = False) -> List[str]:
121
- """
122
- Get documentation for packages
123
-
124
- Args:
125
- package_name: Specific package name to get docs for, None for all packages
126
- return_paths: If True, return file paths; if False, return file contents
127
-
128
- Returns:
129
- List of documentation content or file paths
130
- """
131
- docs = []
132
-
133
- if not os.path.exists(self.llm_friendly_packages_dir):
134
- return docs
135
-
136
- memory = self._load_memory()
137
- libs = list(memory.get("libs", {}).keys())
138
-
139
- for domain in os.listdir(self.llm_friendly_packages_dir):
140
- domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
141
- if not os.path.isdir(domain_path):
142
- continue
143
-
144
- for username in os.listdir(domain_path):
145
- username_path = os.path.join(domain_path, username)
146
- if not os.path.isdir(username_path):
147
- continue
148
-
149
- for lib_name in os.listdir(username_path):
150
- lib_path = os.path.join(username_path, lib_name)
151
-
152
- # Check if this is the requested package
153
- if not os.path.isdir(lib_path):
154
- continue
155
-
156
- if package_name is not None:
157
- if not (lib_name == package_name or
158
- package_name == os.path.join(username, lib_name)):
159
- continue
160
-
161
- # Check if library is added
162
- if lib_name not in libs:
163
- continue
164
-
165
- # Collect markdown files
166
- for root, _, files in os.walk(lib_path):
167
- for file in files:
168
- if file.endswith(".md"):
169
- file_path = os.path.join(root, file)
170
- if return_paths:
171
- docs.append(file_path)
172
- else:
173
- try:
174
- with open(file_path, "r", encoding="utf-8") as f:
175
- docs.append(f.read())
176
- except Exception as e:
177
- self.console.print(f"Error reading {file_path}: {e}")
178
-
179
- return docs
58
+ """Get current proxy URL from memory"""
59
+ return self.memory_manager.get_config("lib-proxy", self.default_proxy_url)
180
60
 
181
- def get_package_path(self, package_name: str) -> Optional[str]:
182
- """
183
- Get the full path of a package by its name
184
-
185
- Args:
186
- package_name: Package name (can be just lib_name or username/lib_name)
187
-
188
- Returns:
189
- Full path to the package directory, or None if not found
190
- """
191
- if not os.path.exists(self.llm_friendly_packages_dir):
192
- return None
193
-
194
- for domain in os.listdir(self.llm_friendly_packages_dir):
195
- domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
196
- if not os.path.isdir(domain_path):
197
- continue
198
-
199
- for username in os.listdir(domain_path):
200
- username_path = os.path.join(domain_path, username)
201
- if not os.path.isdir(username_path):
202
- continue
203
-
204
- for lib_name in os.listdir(username_path):
205
- lib_path = os.path.join(username_path, lib_name)
206
- if not os.path.isdir(lib_path):
207
- continue
208
-
209
- # Check if this matches the requested package
210
- if (lib_name == package_name or
211
- package_name == os.path.join(username, lib_name)):
212
- return lib_path
213
-
214
- return None
61
+ # ======== Library Management ========
215
62
 
216
63
  def list_added_libraries(self) -> List[str]:
217
64
  """List all added libraries"""
218
- memory = self._load_memory()
219
- return list(memory.get("libs", {}).keys())
65
+ return list(self.memory_manager.get_libs().keys())
220
66
 
221
- def list_all_available_libraries(self) -> List[LibraryInfo]:
67
+ def list_all_available_libraries(self) -> LibraryList:
222
68
  """List all available libraries in the repository"""
223
69
  if not os.path.exists(self.llm_friendly_packages_dir):
224
70
  return []
225
71
 
226
72
  available_libs = []
227
- memory = self._load_memory()
228
- added_libs = set(memory.get("libs", {}).keys())
73
+ added_libs = set(self.memory_manager.get_libs().keys())
229
74
 
230
75
  for domain in os.listdir(self.llm_friendly_packages_dir):
231
76
  domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
@@ -277,14 +122,11 @@ class LLMFriendlyPackageManager:
277
122
  if not self._clone_repository():
278
123
  return False
279
124
 
280
- memory = self._load_memory()
281
-
282
- if lib_name in memory["libs"]:
125
+ if self.memory_manager.has_lib(lib_name):
283
126
  self.console.print(f"Library {lib_name} is already added")
284
127
  return False
285
128
 
286
- memory["libs"][lib_name] = {}
287
- self._save_memory(memory)
129
+ self.memory_manager.add_lib(lib_name, {})
288
130
  self.console.print(f"Added library: {lib_name}")
289
131
  return True
290
132
 
@@ -298,50 +140,146 @@ class LLMFriendlyPackageManager:
298
140
  Returns:
299
141
  True if successful, False otherwise
300
142
  """
301
- memory = self._load_memory()
302
-
303
- if lib_name not in memory["libs"]:
143
+ if not self.memory_manager.has_lib(lib_name):
304
144
  self.console.print(f"Library {lib_name} is not in the list")
305
145
  return False
306
146
 
307
- del memory["libs"][lib_name]
308
- self._save_memory(memory)
147
+ self.memory_manager.remove_lib(lib_name)
309
148
  self.console.print(f"Removed library: {lib_name}")
310
149
  return True
311
150
 
312
- def set_proxy(self, proxy_url: Optional[str] = None) -> str:
151
+ def has_library(self, lib_name: str) -> bool:
152
+ """Check if library is added"""
153
+ return self.memory_manager.has_lib(lib_name)
154
+
155
+ def get_package_path(self, package_name: str) -> Optional[str]:
313
156
  """
314
- Set or get proxy URL
157
+ Get the full path of a package by its name
315
158
 
316
159
  Args:
317
- proxy_url: New proxy URL, None to get current proxy
160
+ package_name: Package name (can be just lib_name or username/lib_name)
318
161
 
319
162
  Returns:
320
- Current proxy URL
163
+ Full path to the package directory, or None if not found
321
164
  """
322
- memory = self._load_memory()
165
+ if not os.path.exists(self.llm_friendly_packages_dir):
166
+ return None
323
167
 
324
- if proxy_url is None:
325
- current_proxy = memory.get("lib-proxy", "No proxy set")
326
- self.console.print(f"Current proxy: {current_proxy}")
327
- return current_proxy
168
+ for domain in os.listdir(self.llm_friendly_packages_dir):
169
+ domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
170
+ if not os.path.isdir(domain_path):
171
+ continue
172
+
173
+ for username in os.listdir(domain_path):
174
+ username_path = os.path.join(domain_path, username)
175
+ if not os.path.isdir(username_path):
176
+ continue
177
+
178
+ for lib_name in os.listdir(username_path):
179
+ lib_path = os.path.join(username_path, lib_name)
180
+ if not os.path.isdir(lib_path):
181
+ continue
182
+
183
+ # Check if this matches the requested package
184
+ if (lib_name == package_name or
185
+ package_name == os.path.join(username, lib_name)):
186
+ return lib_path
328
187
 
329
- memory["lib-proxy"] = proxy_url
330
- self._save_memory(memory)
331
- self.console.print(f"Set proxy to: {proxy_url}")
332
- return proxy_url
188
+ return None
333
189
 
334
- def refresh_repository(self) -> bool:
190
+ # ======== Documentation Management ========
191
+
192
+ def get_docs(self, package_name: Optional[str] = None, return_paths: bool = False) -> DocsList:
335
193
  """
336
- Refresh the repository by pulling latest changes
194
+ Get documentation for packages
337
195
 
196
+ Args:
197
+ package_name: Specific package name to get docs for, None for all packages
198
+ return_paths: If True, return file paths; if False, return file contents
199
+
338
200
  Returns:
339
- True if successful, False otherwise
201
+ List of documentation content or file paths
340
202
  """
203
+ docs = []
204
+
205
+ if not os.path.exists(self.llm_friendly_packages_dir):
206
+ return docs
207
+
208
+ libs = list(self.memory_manager.get_libs().keys())
209
+
210
+ for domain in os.listdir(self.llm_friendly_packages_dir):
211
+ domain_path = os.path.join(self.llm_friendly_packages_dir, domain)
212
+ if not os.path.isdir(domain_path):
213
+ continue
214
+
215
+ for username in os.listdir(domain_path):
216
+ username_path = os.path.join(domain_path, username)
217
+ if not os.path.isdir(username_path):
218
+ continue
219
+
220
+ for lib_name in os.listdir(username_path):
221
+ lib_path = os.path.join(username_path, lib_name)
222
+
223
+ # Check if this is the requested package
224
+ if not os.path.isdir(lib_path):
225
+ continue
226
+
227
+ if package_name is not None:
228
+ if not (lib_name == package_name or
229
+ package_name == os.path.join(username, lib_name)):
230
+ continue
231
+
232
+ # Check if library is added
233
+ if lib_name not in libs:
234
+ continue
235
+
236
+ # Collect markdown files
237
+ for root, _, files in os.walk(lib_path):
238
+ for file in files:
239
+ if file.endswith(".md"):
240
+ file_path = os.path.join(root, file)
241
+ if return_paths:
242
+ docs.append(file_path)
243
+ else:
244
+ try:
245
+ with open(file_path, "r", encoding="utf-8") as f:
246
+ docs.append(f.read())
247
+ except Exception as e:
248
+ self.console.print(f"Error reading {file_path}: {e}")
249
+
250
+ return docs
251
+
252
+ def get_library_docs_paths(self, package_name: str) -> List[str]:
253
+ """Get documentation file paths for a specific package"""
254
+ return self.get_docs(package_name, return_paths=True)
255
+
256
+ def get_library_docs_content(self, package_name: str) -> List[str]:
257
+ """Get documentation content for a specific package"""
258
+ return self.get_docs(package_name, return_paths=False)
259
+
260
+ # ======== Repository Management ========
261
+
262
+ def _clone_repository(self) -> bool:
263
+ """Clone the llm_friendly_packages repository"""
264
+ if os.path.exists(self.llm_friendly_packages_dir):
265
+ return True
266
+
267
+ self.console.print("Cloning llm_friendly_packages repository...")
268
+ try:
269
+ proxy_url = self._get_current_proxy()
270
+ git.Repo.clone_from(proxy_url, self.llm_friendly_packages_dir)
271
+ self.console.print("Successfully cloned llm_friendly_packages repository")
272
+ return True
273
+ except GitCommandError as e:
274
+ self.console.print(f"Error cloning repository: {e}")
275
+ return False
276
+
277
+ def refresh_repository(self) -> bool:
278
+ """Refresh the repository by pulling latest changes"""
341
279
  if not os.path.exists(self.llm_friendly_packages_dir):
342
280
  self.console.print(
343
281
  "llm_friendly_packages repository does not exist. "
344
- "Please run add_library() first to clone it."
282
+ "Please call add_library() first to clone it."
345
283
  )
346
284
  return False
347
285
 
@@ -350,8 +288,7 @@ class LLMFriendlyPackageManager:
350
288
  origin = repo.remotes.origin
351
289
 
352
290
  # Update remote URL if proxy is set
353
- memory = self._load_memory()
354
- proxy_url = memory.get("lib-proxy")
291
+ proxy_url = self._get_current_proxy()
355
292
  current_url = origin.url
356
293
 
357
294
  if proxy_url and proxy_url != current_url:
@@ -362,21 +299,42 @@ class LLMFriendlyPackageManager:
362
299
  self.console.print("Successfully updated llm_friendly_packages repository")
363
300
  return True
364
301
 
365
- except git.exc.GitCommandError as e:
302
+ except GitCommandError as e:
366
303
  self.console.print(f"Error updating repository: {e}")
367
304
  return False
368
305
 
369
- def get_library_docs_paths(self, package_name: str) -> List[str]:
370
- """
371
- Get documentation file paths for a specific package
306
+ def set_proxy(self, proxy_url: Optional[str] = None) -> str:
307
+ """Set or get proxy URL"""
308
+ if proxy_url is None:
309
+ current_proxy = self._get_current_proxy()
310
+ self.console.print(f"Current proxy: {current_proxy}")
311
+ return current_proxy
372
312
 
373
- Args:
374
- package_name: Package name
375
-
376
- Returns:
377
- List of markdown file paths
378
- """
379
- return self.get_docs(package_name, return_paths=True)
313
+ self.memory_manager.set_config("lib-proxy", proxy_url)
314
+ self.console.print(f"Set proxy to: {proxy_url}")
315
+ return proxy_url
316
+
317
+ def get_repository_info(self) -> RepositoryInfo:
318
+ """Get repository information"""
319
+ exists = os.path.exists(self.llm_friendly_packages_dir)
320
+ proxy_url = self._get_current_proxy()
321
+
322
+ last_updated = None
323
+ if exists:
324
+ try:
325
+ repo = git.Repo(self.llm_friendly_packages_dir)
326
+ last_commit = repo.head.commit
327
+ last_updated = last_commit.committed_datetime.isoformat()
328
+ except Exception:
329
+ pass
330
+
331
+ return RepositoryInfo(
332
+ exists=exists,
333
+ url=proxy_url,
334
+ last_updated=last_updated
335
+ )
336
+
337
+ # ======== Display Management ========
380
338
 
381
339
  def display_added_libraries(self) -> None:
382
340
  """Display added libraries in a table"""
@@ -440,4 +398,19 @@ class LLMFriendlyPackageManager:
440
398
  table.add_column("File Path", style="cyan")
441
399
 
442
400
  for doc in docs:
443
- table.add_row(doc)
401
+ table.add_row(doc)
402
+
403
+ self.console.print(table)
404
+
405
+
406
+ def get_package_manager(project_root: Optional[str] = None) -> LLMFriendlyPackageManager:
407
+ """
408
+ Get package manager instance
409
+
410
+ Args:
411
+ project_root: Project root directory
412
+
413
+ Returns:
414
+ LLMFriendlyPackageManager instance
415
+ """
416
+ return LLMFriendlyPackageManager(project_root)
@@ -0,0 +1,40 @@
1
+ """
2
+ Data models for LLM Friendly Package Manager
3
+
4
+ This module defines the core data structures used throughout the package manager.
5
+ """
6
+
7
+ from dataclasses import dataclass
8
+ from typing import Optional, List, Dict, Any
9
+
10
+
11
+ @dataclass
12
+ class LibraryInfo:
13
+ """Information about a library in the repository"""
14
+ domain: str
15
+ username: str
16
+ lib_name: str
17
+ full_path: str
18
+ is_added: bool
19
+ has_md_files: bool = True
20
+
21
+
22
+ @dataclass
23
+ class PackageDoc:
24
+ """Package documentation information"""
25
+ file_path: str
26
+ content: Optional[str] = None
27
+
28
+
29
+ @dataclass
30
+ class RepositoryInfo:
31
+ """Information about the repository state"""
32
+ exists: bool
33
+ url: str
34
+ last_updated: Optional[str] = None
35
+
36
+
37
+ # Type aliases for better type hints
38
+ LibraryList = List[LibraryInfo]
39
+ DocsList = List[str]
40
+ ConfigDict = Dict[str, Any]