auto-coder 0.1.298__py3-none-any.whl → 0.1.300__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.

@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: auto-coder
3
- Version: 0.1.298
3
+ Version: 0.1.300
4
4
  Summary: AutoCoder: AutoCoder
5
5
  Author: allwefantasy
6
6
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
@@ -27,7 +27,7 @@ Requires-Dist: jupyter-client
27
27
  Requires-Dist: prompt-toolkit
28
28
  Requires-Dist: tokenizers
29
29
  Requires-Dist: aiofiles
30
- Requires-Dist: byzerllm[saas] >=0.1.176
30
+ Requires-Dist: byzerllm[saas] >=0.1.177
31
31
  Requires-Dist: patch
32
32
  Requires-Dist: diff-match-patch
33
33
  Requires-Dist: GitPython
@@ -1,24 +1,25 @@
1
1
  autocoder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- autocoder/auto_coder.py,sha256=zKqfMdm2F419hrNGaosW4kYJ3IbaxBKlpTlVl6JFWmE,65563
2
+ autocoder/auto_coder.py,sha256=R5ONfVwoy7NsK1Uh68U5MZF0SLsOk13rXPm97PKk-OY,66006
3
3
  autocoder/auto_coder_lang.py,sha256=Rtupq6N3_HT7JRhDKdgCBcwRaiAnyCOR_Gsp4jUomrI,3229
4
4
  autocoder/auto_coder_rag.py,sha256=5TtAfbEBwyt-cB4WcI8eQ1G3AuKij0056wFYRViDhLs,34036
5
5
  autocoder/auto_coder_rag_client_mcp.py,sha256=QRxUbjc6A8UmDMQ8lXgZkjgqtq3lgKYeatJbDY6rSo0,6270
6
6
  autocoder/auto_coder_rag_mcp.py,sha256=-RrjNwFaS2e5v8XDIrKR-zlUNUE8UBaeOtojffBrvJo,8521
7
- autocoder/auto_coder_runner.py,sha256=Q8dr9EsQob6xHZbVxopE30C4vuk5tDQ5lO8nGfx-1kM,101365
7
+ autocoder/auto_coder_runner.py,sha256=pILuHRcw4FNT_VkHT9r0iEk4jpeMm1FqGYXWg8rsQus,100749
8
8
  autocoder/auto_coder_server.py,sha256=E3Z829TPSooRSNhuh3_x9yaZi0f5G0Lm0ntoZhjGaoQ,20576
9
9
  autocoder/benchmark.py,sha256=Ypomkdzd1T3GE6dRICY3Hj547dZ6_inqJbBJIp5QMco,4423
10
10
  autocoder/chat_auto_coder.py,sha256=z_Kqd7CAecuNMa77kJn7iko2zTdko-4-o72a58H-_s8,24655
11
11
  autocoder/chat_auto_coder_lang.py,sha256=-vyKq02RGn6N275YA06JZqXpfJkNq6PNjQ8wy4MmITE,20833
12
12
  autocoder/command_args.py,sha256=9aYJ-AmPxP1sQh6ciw04FWHjSn31f2W9afXFwo8wgx4,30441
13
+ autocoder/command_parser.py,sha256=fx1g9E6GaM273lGTcJqaFQ-hoksS_Ik2glBMnVltPCE,10013
13
14
  autocoder/lang.py,sha256=U6AjVV8Rs1uLyjFCZ8sT6WWuNUxMBqkXXIOs4S120uk,14511
14
15
  autocoder/models.py,sha256=AyoZ-Pzy0oyYUmWCxOIRiOImsqboSfRET7LO9-UOuxI,11172
15
- autocoder/version.py,sha256=6WgD8AUxiPQngIKXonXPlISWgH75TnoidQDJCS5V0hc,23
16
+ autocoder/version.py,sha256=GTWRg4qGDuMEXj_MkMWJ-ZoZUfLMffvCJnZPrQLrT6c,23
16
17
  autocoder/agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
18
  autocoder/agent/auto_demand_organizer.py,sha256=NWSAEsEk94vT3lGjfo25kKLMwYdPcpy9e-i21txPasQ,6942
18
19
  autocoder/agent/auto_filegroup.py,sha256=CW7bqp0FW1GIEMnl-blyAc2UGT7O9Mom0q66ITz1ckM,6635
19
20
  autocoder/agent/auto_guess_query.py,sha256=rDSdhpPHcOGE5MuDXvIrhCXAPR4ARS1LqpyoLsx2Jhw,11374
20
- autocoder/agent/auto_learn_from_commit.py,sha256=H_7i-73DZIOOKC9rfh1Uwb8SbWJ9XOJLwem3mhWSBEk,8240
21
- autocoder/agent/auto_review_commit.py,sha256=Ks5oCDp-82YXiRfcDCgYabKq0pcMJkMrP4CaWIgw_JE,9143
21
+ autocoder/agent/auto_learn_from_commit.py,sha256=YtiMkdcZ29etZxwU5Zir2LFnvfJlwEbpAaW_JYSa4nk,11465
22
+ autocoder/agent/auto_review_commit.py,sha256=rFADQbBikC8y9GTYXIvT6HONR26pLfrwoqOOhEiL7Ok,13262
22
23
  autocoder/agent/auto_tool.py,sha256=DBzip-P_T6ZtT2eHexPcusmKYD0h7ufzp7TLwXAY10E,11554
23
24
  autocoder/agent/coder.py,sha256=x6bdJwDuETGg9ebQnYlUWCxCtQcDGg73LtI6McpWslQ,72034
24
25
  autocoder/agent/designer.py,sha256=EpRbzO58Xym3GrnppIT1Z8ZFAlnNfgzHbIzZ3PX-Yv8,27037
@@ -26,17 +27,18 @@ autocoder/agent/planner.py,sha256=SZTSZHxHzDmuWZo3K5fs79RwvJLWurg-nbJRRNbX65o,91
26
27
  autocoder/agent/project_reader.py,sha256=tWLaPoLw1gI6kO_NzivQj28KbobU2ceOLuppHMbfGl8,18234
27
28
  autocoder/chat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
29
  autocoder/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- autocoder/commands/auto_command.py,sha256=VGPVPf9jz3rcoOg7QNjoC70aSm1tIqLvJiY02JcQnFI,54175
30
+ autocoder/commands/auto_command.py,sha256=hXxqHL1zwzoLaKgxZ8ke4kSKDwitKbgZvAs4nuTghuM,56776
30
31
  autocoder/commands/auto_web.py,sha256=_449f4rCoRG7Sv0SB0hIBRFLPLPJ5DgWW4DlI22a3XY,39383
31
- autocoder/commands/tools.py,sha256=iBcGdTAOCoWk1wX05EbEfkzIEZiTMAKRthap0q1rM5E,21384
32
+ autocoder/commands/tools.py,sha256=4cNm_Mpjk9WNfSmKU7W0OjA89OqPC1mh8rSoSl8m4OE,27253
32
33
  autocoder/common/JupyterClient.py,sha256=O-wi6pXeAEYhAY24kDa0BINrLYvKS6rKyWe98pDClS0,2816
33
34
  autocoder/common/ShellClient.py,sha256=fM1q8t_XMSbLBl2zkCNC2J9xuyKN3eXzGm6hHhqL2WY,2286
34
- autocoder/common/__init__.py,sha256=pO198YBdywGYarPhT7ild3GcdvcFhLJTe63ilZR1d5E,13705
35
+ autocoder/common/__init__.py,sha256=WLBtBZi-F9e6WWvbzSCsMyQVVTJC31rBwvDBc2Gldgs,13806
36
+ autocoder/common/action_yml_file_manager.py,sha256=v-fEWMTNQWg9ASChqnM9Gii70gq143pt9XM6qRacs54,13313
35
37
  autocoder/common/anything2images.py,sha256=0ILBbWzY02M-CiWB-vzuomb_J1hVdxRcenAfIrAXq9M,25283
36
38
  autocoder/common/anything2img.py,sha256=iZQmg8srXlD7N5uGl5b_ONKJMBjYoW8kPmokkG6ISF0,10118
37
39
  autocoder/common/audio.py,sha256=Kn9nWKQddWnUrAz0a_ZUgjcu4VUU_IcZBigT7n3N3qc,7439
38
- autocoder/common/auto_coder_lang.py,sha256=uwaxybu33JdhTmSZzg30-hAdL5pK_rLd3MO02L2rB5w,35738
39
- autocoder/common/auto_configure.py,sha256=c1k6ttDyvc9_5amiCTt4PUq9mRu1IeG560Q3kIRy-Uk,12474
40
+ autocoder/common/auto_coder_lang.py,sha256=i4UE9udQ_fyvqlLYBGpDRpDt2zregE664jSozgisJwU,36383
41
+ autocoder/common/auto_configure.py,sha256=wUPX5urnwg4Y_yzW4HZ91zXFdKwzzgsrI67PjJNC06w,12900
40
42
  autocoder/common/buildin_tokenizer.py,sha256=L7d5t39ZFvUd6EoMPXUhYK1toD0FHlRH1jtjKRGokWU,1236
41
43
  autocoder/common/chunk_validation.py,sha256=BrR_ZWavW8IANuueEE7hS8NFAwEvm8TX34WnPx_1hs8,3030
42
44
  autocoder/common/cleaner.py,sha256=NU72i8C6o9m0vXExab7nao5bstBUsfJFcj11cXa9l4U,1089
@@ -50,7 +52,7 @@ autocoder/common/code_auto_merge_diff.py,sha256=clVxvDlo-SN3QxARipUfOFiSEomTrC41
50
52
  autocoder/common/code_auto_merge_editblock.py,sha256=JzVTAqvqxVMkXOOPY5Ti2Wc_nL4YABYi470sCHKTOgg,20335
51
53
  autocoder/common/code_auto_merge_strict_diff.py,sha256=oYVEs1dmObBqK_1PgFX0LeuVti7es2IZtD00iNOn91g,12116
52
54
  autocoder/common/code_modification_ranker.py,sha256=e1i8oNPN_PfG4O8HQnQWxh9tyOd-ur6jFTXfkHPVXYo,13152
53
- autocoder/common/command_completer.py,sha256=Nw_EFXLDuVXbOKGlmzTODNRJUV9mSUEWV73GUmO_WLw,35166
55
+ autocoder/common/command_completer.py,sha256=xuCxYGKDccaozmzB6p3q0QI6mlzyM180g9mnVG5zvIk,35284
54
56
  autocoder/common/command_generator.py,sha256=t1o1d7xEyfnPvY_MpG5usyx0eKW7WCUR0urKoqCex60,2761
55
57
  autocoder/common/command_templates.py,sha256=WAixVjue5QmCFAD13K4ElfcOEjdeGr8tFb0atDAbEoo,8658
56
58
  autocoder/common/computer_use.py,sha256=Z5RL-DgkcbF55YDsqnJ37loXGcm_1tzTheukjTTayJM,35816
@@ -69,7 +71,7 @@ autocoder/common/llm_rerank.py,sha256=FbvtCzaR661Mt2wn0qsuiEL1Y3puD6jeIJS4zg_e7B
69
71
  autocoder/common/mcp_hub.py,sha256=9f55EOViYyhJSE8coZ5USXQBaCjg71nbdy9iwg3q2Z0,16764
70
72
  autocoder/common/mcp_server.py,sha256=1SCtpBRmN299xWX-0aV0imWS2CX6zBUOZBocbV_J6B8,17415
71
73
  autocoder/common/mcp_tools.py,sha256=YdEhDzRnwAr2J3D-23ExIQFWbrNO-EUpIxg179qs9Sw,12666
72
- autocoder/common/memory_manager.py,sha256=2ZjYG7BPyvbYalZBF6AM_G5e10Qkw_zrqtD4Zd7GSsQ,3663
74
+ autocoder/common/memory_manager.py,sha256=Xx6Yv0ULxVfcFfmD36hdHFFhxCgRAs-5fTd0fLHJrpQ,3773
73
75
  autocoder/common/model_speed_test.py,sha256=U48xUUpOnbwUal1cdij4YAn_H2PD2pNaqrMHaYtQRfI,15200
74
76
  autocoder/common/printer.py,sha256=P1WU0QjlfnjqTP5uA55GkHZCpFzRPFkc34DMMandreg,2023
75
77
  autocoder/common/recall_validation.py,sha256=Avt9Q9dX3kG6Pf2zsdlOHmsjd-OeSj7U1PFBDp_Cve0,1700
@@ -98,7 +100,7 @@ autocoder/dispacher/actions/plugins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQ
98
100
  autocoder/dispacher/actions/plugins/action_regex_project.py,sha256=AqGIkjbqV1eOS3vBoZUTSOpyOlkv1p5h35mI2Kcvekw,6906
99
101
  autocoder/dispacher/actions/plugins/action_translate.py,sha256=GEn7dZA22jy5WyzINomjmzzB795p2Olg-CJla97lRF8,7744
100
102
  autocoder/index/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
101
- autocoder/index/entry.py,sha256=YwwKLxgre2xIbes7f_S0Dh7mAN7RoUSph9ORCmtTun8,14395
103
+ autocoder/index/entry.py,sha256=_9lEt-yKE29hFeU5St_GdIvkGQkE-Bb7ZUdqMG-PxMY,15111
102
104
  autocoder/index/for_command.py,sha256=BFvljE4t6VaMBGboZAuhUCzVK0EitCy_n5D_7FEnihw,3204
103
105
  autocoder/index/index.py,sha256=3-SHlmeQMv6SFxNj7vVcNRDAYj9ZshuJJ1zXwBi0cDc,30873
104
106
  autocoder/index/symbols_utils.py,sha256=_EP7E_qWXxluAxq3FGZLlLfdrfwx3FmxCdulI8VGuac,2244
@@ -144,7 +146,7 @@ autocoder/rag/cache/byzer_storage_cache.py,sha256=S_afj4_fFt88A0KJ23N-Gc3mMwPTDj
144
146
  autocoder/rag/cache/cache_result_merge.py,sha256=VnTdbT2OMBmWl_83bqds97d9_M33IhPNX8tF7KH2GMM,10556
145
147
  autocoder/rag/cache/file_monitor_cache.py,sha256=OdSXTH3vo6inAzkN5d55I0RN03GUlSlnUEKmXpjFl78,9443
146
148
  autocoder/rag/cache/local_byzer_storage_cache.py,sha256=1xskK7X_hFEAsHHoT_F9lFYhQOTrpQtsFyFCIeI2Mvk,31964
147
- autocoder/rag/cache/local_duckdb_storage_cache.py,sha256=gTfAzFTfVLoi8cqxct_I3-ozdoZvKUVSiI1w8NxbjX8,28540
149
+ autocoder/rag/cache/local_duckdb_storage_cache.py,sha256=37WH2mlOgykBUrp6ow43kcaaKFZc1CRTkNLSFdELPcE,32714
148
150
  autocoder/rag/cache/rag_file_meta.py,sha256=RQ3n4wfkHlB-1ljS3sFSi8ijbsUPeIqBSgjmmbRuwRI,20521
149
151
  autocoder/rag/cache/simple_cache.py,sha256=j9dxhei-Nwq9FJrrGOWhaDIDSb_Iz6JSojT1pelS9k4,13084
150
152
  autocoder/rag/loaders/__init__.py,sha256=EQHEZ5Cmz-mGP2SllUTvcIbYCnF7W149dNpNItfs0yE,304
@@ -159,7 +161,7 @@ autocoder/regex_project/__init__.py,sha256=EBZeCL5ORyD_9_5u_UuG4s7XtpXOu0y1sWDmx
159
161
  autocoder/regexproject/__init__.py,sha256=OGlfVe2yulGIZstACbVePVbNXajvVLRFyubnIc-9Gw0,9758
160
162
  autocoder/suffixproject/__init__.py,sha256=EOb8eUqfu3ka8mrggkXUfwX3SWnxqEoiYmDF7Zkf0F8,11143
161
163
  autocoder/tsproject/__init__.py,sha256=LPehIUgzFbZ5DT_Pc0a_xCQQXEDxACPTMwXfFF7rcL0,11836
162
- autocoder/utils/__init__.py,sha256=KtcGElFNBgZPF7dEL8zF9JpXkCAjoyDrzaREJBhJrcs,994
164
+ autocoder/utils/__init__.py,sha256=W47ac6IOZhNR1rdbho9fvhHnPI_N1i4oMcZOwxLelbU,1123
163
165
  autocoder/utils/_markitdown.py,sha256=RU88qn4eZfYIy0GDrPxlI8oYXIypbi63VRJjdlnE0VU,47431
164
166
  autocoder/utils/auto_project_type.py,sha256=9_-wE9aavjbPiNSUVKxttJAdu5i5fu-zHyPYHr5XtWk,4422
165
167
  autocoder/utils/coder.py,sha256=rK8e0svQBe0NOP26dIGToUXgha_hUDgxlWoC_p_r7oc,5698
@@ -183,9 +185,9 @@ autocoder/utils/types.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
183
185
  autocoder/utils/auto_coder_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
184
186
  autocoder/utils/auto_coder_utils/chat_stream_out.py,sha256=lkJ_A-sYU36JMzjFWkk3pR6uos8oZHYt9GPsPe_CPAo,11766
185
187
  autocoder/utils/chat_auto_coder_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
- auto_coder-0.1.298.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
187
- auto_coder-0.1.298.dist-info/METADATA,sha256=COiMKzvXqK4P1_xs-qwuOdDDQZ3fLMinxhc0EpzJP6I,2689
188
- auto_coder-0.1.298.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
189
- auto_coder-0.1.298.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
190
- auto_coder-0.1.298.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
191
- auto_coder-0.1.298.dist-info/RECORD,,
188
+ auto_coder-0.1.300.dist-info/LICENSE,sha256=HrhfyXIkWY2tGFK11kg7vPCqhgh5DcxleloqdhrpyMY,11558
189
+ auto_coder-0.1.300.dist-info/METADATA,sha256=Qhp1ZjqoWJBHBlH0cV0CKD0P802svC1tUHU4ir4YOzE,2689
190
+ auto_coder-0.1.300.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
191
+ auto_coder-0.1.300.dist-info/entry_points.txt,sha256=0nzHtHH4pNcM7xq4EBA2toS28Qelrvcbrr59GqD_0Ak,350
192
+ auto_coder-0.1.300.dist-info/top_level.txt,sha256=Jqc0_uJSw2GwoFQAa9iJxYns-2mWla-9ok_Y3Gcznjk,10
193
+ auto_coder-0.1.300.dist-info/RECORD,,
@@ -8,6 +8,7 @@ from rich.console import Console
8
8
  from autocoder.common.printer import Printer
9
9
  from autocoder.common import AutoCoderArgs
10
10
  from autocoder.common.utils_code_auto_generate import stream_chat_with_continue
11
+ from autocoder.common.action_yml_file_manager import ActionYmlFileManager
11
12
  import hashlib
12
13
 
13
14
 
@@ -40,13 +41,12 @@ class AutoLearnFromCommit:
40
41
  self.llm = llm
41
42
  self.skip_diff = skip_diff
42
43
  self.console = console or Console()
44
+ self.action_manager = ActionYmlFileManager(args.source_dir)
43
45
 
44
46
  @byzerllm.prompt()
45
47
  def learn(self, querie_with_urls_and_changes: List[Tuple[str, List[str], Dict[str, Tuple[str, str]]]], query: str) -> Generator[str,None,None]:
46
- """
47
- 请根据下面的代码变更,总结出通用的代码调整模式,以帮助实现类似的需求。
48
-
49
- 下面用户对本次的目标以及你需要总结的要求:
48
+ """
49
+ 下面是触发这次代码变更的原始任务需求:
50
50
  <goal>
51
51
  {{ query }}
52
52
  </goal>
@@ -77,70 +77,53 @@ class AutoLearnFromCommit:
77
77
  {% endfor %}
78
78
  {% endfor %}
79
79
  </changes>
80
+
81
+ 你的目标是,总结出这次修改重现步骤,要尽可能详细,达到当用户重新提交相同的需求,系统可以根据你这个流程,可以重新实现这一次修改。
82
+
83
+ 在描述中,如果涉及到文件请用如下示例的格式:
84
+ @src/autocoder/utils/_markitdown.py
85
+ 如果涉及到符号,比如函数名,变量名,类名等等,请用如下示例的格式:
86
+ @@DocxConverter(location: src/autocoder/utils/_markitdown.py)
80
87
 
81
- 请总结以下内容:
82
- 1. 代码调整模式:描述为了实现这个目标,通常需要对代码做出哪些通用调整
83
- 2. 关键修改点:指出本次提交中最关键或最具代表性的修改点
84
- 3. 潜在扩展:基于这些修改,未来类似需求可能需要进行哪些扩展
85
- 4. 注意事项:在实现类似功能时需要注意哪些问题
86
-
87
- 总结要求:
88
- 1. 总结应该抽象化,不要局限于具体实现细节
89
- 2. 对于每个模式都应该提供明确的适用场景
90
- 3. 应该考虑代码的可维护性和可扩展性
91
- 4. 应该指出在不同技术栈或框架下的通用性
92
88
  """
93
89
  pass
94
90
 
95
- def parse_history_tasks(self) -> List[Dict]:
91
+ def parse_history_tasks(self, commit_file_name: Optional[str] = None) -> List[Dict]:
96
92
  """
97
93
  解析历史任务信息
98
94
 
99
95
  Returns:
100
96
  List[Dict]: 每个字典包含一个历史任务的信息
101
97
  """
102
- # 获取所有YAML文件
103
- action_files = [
104
- f for f in os.listdir(self.actions_dir)
105
- if f[:3].isdigit() and "_" in f and f.endswith('.yml')
106
- ]
107
-
108
- # 按序号排序
109
- def get_seq(name):
110
- return int(name.split("_")[0])
111
-
112
- # 获取最新的action文件列表
113
- action_files = sorted(action_files, key=get_seq)
114
- action_files.reverse()
115
-
116
- action_file = action_files[0]
98
+ # 使用 ActionManager 获取文件
99
+ if commit_file_name:
100
+ action_file = commit_file_name
101
+ else:
102
+ action_file = self.action_manager.get_latest_action_file()
103
+ if not action_file:
104
+ return []
117
105
 
118
106
  querie_with_urls_and_changes = []
119
107
  repo = git.Repo(self.project_dir)
120
108
 
121
109
  # 收集所有query、urls和对应的文件变化
122
- for yaml_file in [action_file]:
123
- yaml_path = os.path.join(self.actions_dir, yaml_file)
124
- config = load_yaml_config(yaml_path)
125
-
126
- if not config:
127
- continue
128
-
129
- query = config.get('query', '')
130
- urls = config.get('urls', [])
131
-
132
- if query:
133
- changes = {}
134
- if not self.skip_diff:
135
- # 计算文件的MD5用于匹配commit
136
- with open(yaml_path, 'r', encoding='utf-8') as f:
137
- yaml_content = f.read()
138
- file_md5 = hashlib.md5(yaml_content.encode("utf-8")).hexdigest()
139
- response_id = f"auto_coder_{yaml_file}_{file_md5}"
140
- # 查找对应的commit
110
+ yaml_content = self.action_manager.load_yaml_content(action_file)
111
+
112
+ if not yaml_content:
113
+ return []
114
+
115
+ query = yaml_content.get('query', '')
116
+ urls = yaml_content.get('urls', [])
117
+
118
+ if query:
119
+ changes = {}
120
+ if not self.skip_diff:
121
+ # 使用 ActionManager 获取 commit ID
122
+ commit_id = self.action_manager.get_commit_id_from_file(action_file)
123
+ if commit_id:
141
124
  try:
142
125
  for commit in repo.iter_commits():
143
- if response_id in commit.message:
126
+ if commit_id in commit.message:
144
127
  if commit.parents:
145
128
  parent = commit.parents[0]
146
129
  # 获取所有文件的前后内容
@@ -172,29 +155,112 @@ class AutoLearnFromCommit:
172
155
  printer = Printer()
173
156
  printer.print_in_terminal("get_commit_changes_error", style="red", error=str(e))
174
157
 
175
- querie_with_urls_and_changes.append((query, urls, changes))
158
+ querie_with_urls_and_changes.append((query, urls, changes))
176
159
 
177
- return querie_with_urls_and_changes
160
+ return querie_with_urls_and_changes,action_file
178
161
 
162
+ def get_commit_changes(self, commit_id: str) -> List[Tuple[str, List[str], Dict[str, Tuple[str, str]]]]:
163
+ """
164
+ 直接从Git仓库获取指定commit的变更
179
165
 
180
- def learn_from_commit(self,query: str, conversations: List[Dict]) -> Generator[str,None,None]:
166
+ Args:
167
+ commit_id: Git commit的ID
168
+
169
+ Returns:
170
+ List[Tuple[str, List[str], Dict[str, Tuple[str, str]]]]: 与parse_history_tasks格式相同的结果
171
+ """
172
+ printer = Printer()
173
+ querie_with_urls_and_changes = []
174
+ changes = {}
175
+ modified_files = []
176
+ query = f"Review commit: {commit_id}"
177
+
178
+ try:
179
+ repo = git.Repo(self.project_dir)
180
+ commit = repo.commit(commit_id)
181
+
182
+ if not commit.parents:
183
+ # 这是首次提交
184
+ printer.print_in_terminal("commit_is_initial", style="yellow", commit_id=commit_id)
185
+ # 获取首次提交的所有文件
186
+ for item in commit.tree.traverse():
187
+ if item.type == 'blob': # 只处理文件,不处理目录
188
+ file_path = item.path
189
+ modified_files.append(file_path)
190
+ # 首次提交前没有内容
191
+ before_content = None
192
+ # 获取提交后的内容
193
+ after_content = repo.git.show(f"{commit.hexsha}:{file_path}")
194
+ changes[file_path] = (before_content, after_content)
195
+ else:
196
+ # 获取parent commit
197
+ parent = commit.parents[0]
198
+ # 获取变更的文件列表
199
+ for diff_item in parent.diff(commit):
200
+ file_path = diff_item.a_path if diff_item.a_path else diff_item.b_path
201
+ modified_files.append(file_path)
202
+
203
+ # 获取变更前内容
204
+ before_content = None
205
+ try:
206
+ if diff_item.a_blob:
207
+ before_content = repo.git.show(f"{parent.hexsha}:{file_path}")
208
+ except git.exc.GitCommandError:
209
+ pass # 文件可能是新增的
210
+
211
+ # 获取变更后内容
212
+ after_content = None
213
+ try:
214
+ if diff_item.b_blob:
215
+ after_content = repo.git.show(f"{commit.hexsha}:{file_path}")
216
+ except git.exc.GitCommandError:
217
+ pass # 文件可能被删除
218
+
219
+ changes[file_path] = (before_content, after_content)
220
+
221
+ # 使用commit消息作为查询内容
222
+ query = commit.message
223
+ querie_with_urls_and_changes.append((query, modified_files, changes))
224
+
225
+ except git.exc.GitCommandError as e:
226
+ printer.print_in_terminal("git_command_error", style="red", error=str(e))
227
+ except Exception as e:
228
+ printer.print_in_terminal("get_commit_changes_error", style="red", error=str(e))
229
+
230
+ return querie_with_urls_and_changes,None
231
+
232
+ def learn_from_commit(self,query: str, conversations: List[Dict],commit_id: Optional[str] = None) -> Generator[str,None,None]:
181
233
  """
182
234
  从最新的代码提交中学习通用模式
183
235
 
236
+ Args:
237
+ query: 用户的查询/要求
238
+ conversations: 之前的对话历史
239
+ commit_id: 可选的指定commit ID,如果提供则直接学习该commit
240
+
184
241
  Returns:
185
242
  Optional[Generator]: 学习结果生成器,如果出错则返回None
186
243
  """
187
244
  printer = Printer()
245
+ commit_file_name = None
246
+ if commit_id:
247
+ # 使用 ActionManager 从 commit ID 获取文件名
248
+ commit_file_name = self.action_manager.get_file_name_from_commit_id(commit_id)
249
+
250
+ if not commit_file_name:
251
+ raise ValueError(printer.get_message_from_key_with_format("no_commit_file_name", commit_id=commit_id))
252
+
188
253
  # 获取最新的提交信息
189
- changes = self.parse_history_tasks()
254
+ changes,tmp_file_name = self.parse_history_tasks(commit_file_name=commit_file_name)
255
+ commit_file_name = tmp_file_name
190
256
  if not changes:
191
257
  printer.print_in_terminal("no_latest_commit", style="red")
192
- return None
258
+ return None, None
193
259
 
194
260
  # 调用LLM进行代码学习
195
261
  try:
196
262
  # 获取 prompt 内容
197
- query = self.learn.prompt(changes, query)
263
+ query = self.learn.prompt(changes, query)
198
264
  new_conversations = conversations.copy()[0:-1]
199
265
  new_conversations.append({"role": "user", "content": query})
200
266
  # 构造对话消息
@@ -203,7 +269,7 @@ class AutoLearnFromCommit:
203
269
  conversations=new_conversations,
204
270
  llm_config={}
205
271
  )
206
- return v
272
+ return v, commit_file_name
207
273
  except Exception as e:
208
274
  printer.print_in_terminal("code_learn_error", style="red", error=str(e))
209
- return None
275
+ return None, commit_file_name
@@ -116,7 +116,7 @@ class AutoReviewCommit:
116
116
  pass
117
117
 
118
118
 
119
- def parse_history_tasks(self) -> List[Dict]:
119
+ def parse_history_tasks(self,commit_file_name: Optional[str] = None) -> List[Dict]:
120
120
  """
121
121
  解析历史任务信息
122
122
 
@@ -129,14 +129,17 @@ class AutoReviewCommit:
129
129
  if f[:3].isdigit() and "_" in f and f.endswith('.yml')
130
130
  ]
131
131
 
132
- # 按序号排序
133
- def get_seq(name):
134
- return int(name.split("_")[0])
135
-
136
- # 获取最新的action文件列表
137
- action_files = sorted(action_files, key=get_seq)
138
- action_files.reverse()
132
+ if commit_file_name:
133
+ action_files = [f for f in action_files if f == commit_file_name]
134
+ else:
135
+ # 按序号排序
136
+ def get_seq(name):
137
+ return int(name.split("_")[0])
139
138
 
139
+ # 获取最新的action文件列表
140
+ action_files = sorted(action_files, key=get_seq)
141
+ action_files.reverse()
142
+
140
143
  action_file = action_files[0]
141
144
 
142
145
  querie_with_urls_and_changes = []
@@ -200,27 +203,114 @@ class AutoReviewCommit:
200
203
 
201
204
  return querie_with_urls_and_changes
202
205
 
206
+ def get_commit_changes(self, commit_id: str) -> List[Tuple[str, List[str], Dict[str, Tuple[str, str]]]]:
207
+ """
208
+ 直接从Git仓库获取指定commit的变更
203
209
 
204
- def review_commit(self,query: str, conversations: List[Dict]) -> Generator[str,None,None]:
210
+ Args:
211
+ commit_id: Git commit的ID
212
+
213
+ Returns:
214
+ List[Tuple[str, List[str], Dict[str, Tuple[str, str]]]]: 与parse_history_tasks格式相同的结果
205
215
  """
206
- 审查最新的代码提交
216
+ printer = Printer()
217
+ querie_with_urls_and_changes = []
218
+ changes = {}
219
+ modified_files = []
220
+ query = f"Review commit: {commit_id}"
221
+
222
+ try:
223
+ repo = git.Repo(self.project_dir)
224
+ commit = repo.commit(commit_id)
225
+
226
+ if not commit.parents:
227
+ # 这是首次提交
228
+ printer.print_in_terminal("commit_is_initial", style="yellow", commit_id=commit_id)
229
+ # 获取首次提交的所有文件
230
+ for item in commit.tree.traverse():
231
+ if item.type == 'blob': # 只处理文件,不处理目录
232
+ file_path = item.path
233
+ modified_files.append(file_path)
234
+ # 首次提交前没有内容
235
+ before_content = None
236
+ # 获取提交后的内容
237
+ after_content = repo.git.show(f"{commit.hexsha}:{file_path}")
238
+ changes[file_path] = (before_content, after_content)
239
+ else:
240
+ # 获取parent commit
241
+ parent = commit.parents[0]
242
+ # 获取变更的文件列表
243
+ for diff_item in parent.diff(commit):
244
+ file_path = diff_item.a_path if diff_item.a_path else diff_item.b_path
245
+ modified_files.append(file_path)
246
+
247
+ # 获取变更前内容
248
+ before_content = None
249
+ try:
250
+ if diff_item.a_blob:
251
+ before_content = repo.git.show(f"{parent.hexsha}:{file_path}")
252
+ except git.exc.GitCommandError:
253
+ pass # 文件可能是新增的
254
+
255
+ # 获取变更后内容
256
+ after_content = None
257
+ try:
258
+ if diff_item.b_blob:
259
+ after_content = repo.git.show(f"{commit.hexsha}:{file_path}")
260
+ except git.exc.GitCommandError:
261
+ pass # 文件可能被删除
262
+
263
+ changes[file_path] = (before_content, after_content)
264
+
265
+ # 使用commit消息作为查询内容
266
+ query = commit.message
267
+ querie_with_urls_and_changes.append((query, modified_files, changes))
268
+
269
+ except git.exc.GitCommandError as e:
270
+ printer.print_in_terminal("git_command_error", style="red", error=str(e))
271
+ except Exception as e:
272
+ printer.print_in_terminal("get_commit_changes_error", style="red", error=str(e))
273
+
274
+ return querie_with_urls_and_changes
275
+
276
+ def review_commit(self,query: str, conversations: List[Dict],commit_id: Optional[str] = None) -> Generator[str,None,None]:
277
+ """
278
+ 审查代码提交
279
+
280
+ Args:
281
+ query: 用户的查询/要求
282
+ conversations: 之前的对话历史
283
+ commit_id: 可选的指定commit ID,如果提供则直接审查该commit
207
284
 
208
285
  Returns:
209
- Optional[ReviewResult]: 审查结果,如果出错则返回None
286
+ Generator[str,None,None]: 审查结果的生成器
210
287
  """
211
288
  printer = Printer()
212
- # 获取最新的提交信息
213
- changes = self.parse_history_tasks()
289
+ commit_file_name = None
290
+ if commit_id:
291
+ repo = git.Repo(self.project_dir)
292
+ commit = repo.commit(commit_id)
293
+ # auto_coder_000000001926_chat_action.yml_88614d5bd4046a068786c252fbc39c13
294
+ msg = commit.message
295
+ commit_file_info = msg.split("_")[0]
296
+ if commit_file_info.startswith("auto_coder_"):
297
+ commit_file_name = "_".join(msg.split("_",)[0:-1])
298
+
299
+ if not commit_file_name:
300
+ raise ValueError(printer.get_message_from_key_with_format("no_commit_file_name",commit_id=commit_id))
301
+
302
+ changes = self.parse_history_tasks(commit_file_name=commit_file_name)
303
+
214
304
  if not changes:
215
- printer.print_in_terminal("no_latest_commit", style="red")
305
+ printer.print_in_terminal("no_commit_found", style="red")
216
306
  return None
217
307
 
218
308
  # 调用LLM进行代码审查
219
309
  try:
220
310
  # 获取 prompt 内容
221
- query = self.review.prompt(changes, query)
311
+ prompt_content = self.review.prompt(changes, query)
222
312
  new_conversations = conversations.copy()[0:-1]
223
- new_conversations.append({"role": "user", "content": query})
313
+ new_conversations.append({"role": "user", "content": prompt_content})
224
314
  # 构造对话消息
225
315
  v = stream_chat_with_continue(
226
316
  llm=self.llm,