xai-review 0.3.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 xai-review might be problematic. Click here for more details.

Files changed (154) hide show
  1. ai_review/__init__.py +0 -0
  2. ai_review/cli/__init__.py +0 -0
  3. ai_review/cli/commands/__init__.py +0 -0
  4. ai_review/cli/commands/run_context_review.py +7 -0
  5. ai_review/cli/commands/run_inline_review.py +7 -0
  6. ai_review/cli/commands/run_review.py +8 -0
  7. ai_review/cli/commands/run_summary_review.py +7 -0
  8. ai_review/cli/main.py +54 -0
  9. ai_review/clients/__init__.py +0 -0
  10. ai_review/clients/claude/__init__.py +0 -0
  11. ai_review/clients/claude/client.py +44 -0
  12. ai_review/clients/claude/schema.py +44 -0
  13. ai_review/clients/gemini/__init__.py +0 -0
  14. ai_review/clients/gemini/client.py +45 -0
  15. ai_review/clients/gemini/schema.py +78 -0
  16. ai_review/clients/gitlab/__init__.py +0 -0
  17. ai_review/clients/gitlab/client.py +31 -0
  18. ai_review/clients/gitlab/mr/__init__.py +0 -0
  19. ai_review/clients/gitlab/mr/client.py +101 -0
  20. ai_review/clients/gitlab/mr/schema/__init__.py +0 -0
  21. ai_review/clients/gitlab/mr/schema/changes.py +35 -0
  22. ai_review/clients/gitlab/mr/schema/comments.py +19 -0
  23. ai_review/clients/gitlab/mr/schema/discussions.py +34 -0
  24. ai_review/clients/openai/__init__.py +0 -0
  25. ai_review/clients/openai/client.py +42 -0
  26. ai_review/clients/openai/schema.py +37 -0
  27. ai_review/config.py +62 -0
  28. ai_review/libs/__init__.py +0 -0
  29. ai_review/libs/asynchronous/__init__.py +0 -0
  30. ai_review/libs/asynchronous/gather.py +14 -0
  31. ai_review/libs/config/__init__.py +0 -0
  32. ai_review/libs/config/artifacts.py +12 -0
  33. ai_review/libs/config/base.py +24 -0
  34. ai_review/libs/config/claude.py +13 -0
  35. ai_review/libs/config/gemini.py +13 -0
  36. ai_review/libs/config/gitlab.py +12 -0
  37. ai_review/libs/config/http.py +19 -0
  38. ai_review/libs/config/llm.py +61 -0
  39. ai_review/libs/config/logger.py +17 -0
  40. ai_review/libs/config/openai.py +13 -0
  41. ai_review/libs/config/prompt.py +121 -0
  42. ai_review/libs/config/review.py +30 -0
  43. ai_review/libs/config/vcs.py +19 -0
  44. ai_review/libs/constants/__init__.py +0 -0
  45. ai_review/libs/constants/llm_provider.py +7 -0
  46. ai_review/libs/constants/vcs_provider.py +6 -0
  47. ai_review/libs/diff/__init__.py +0 -0
  48. ai_review/libs/diff/models.py +100 -0
  49. ai_review/libs/diff/parser.py +111 -0
  50. ai_review/libs/diff/tools.py +24 -0
  51. ai_review/libs/http/__init__.py +0 -0
  52. ai_review/libs/http/client.py +14 -0
  53. ai_review/libs/http/event_hooks/__init__.py +0 -0
  54. ai_review/libs/http/event_hooks/base.py +13 -0
  55. ai_review/libs/http/event_hooks/logger.py +17 -0
  56. ai_review/libs/http/handlers.py +34 -0
  57. ai_review/libs/http/transports/__init__.py +0 -0
  58. ai_review/libs/http/transports/retry.py +34 -0
  59. ai_review/libs/logger.py +19 -0
  60. ai_review/libs/resources.py +24 -0
  61. ai_review/prompts/__init__.py +0 -0
  62. ai_review/prompts/default_context.md +14 -0
  63. ai_review/prompts/default_inline.md +8 -0
  64. ai_review/prompts/default_summary.md +3 -0
  65. ai_review/prompts/default_system_context.md +27 -0
  66. ai_review/prompts/default_system_inline.md +25 -0
  67. ai_review/prompts/default_system_summary.md +7 -0
  68. ai_review/resources/__init__.py +0 -0
  69. ai_review/resources/pricing.yaml +55 -0
  70. ai_review/services/__init__.py +0 -0
  71. ai_review/services/artifacts/__init__.py +0 -0
  72. ai_review/services/artifacts/schema.py +11 -0
  73. ai_review/services/artifacts/service.py +47 -0
  74. ai_review/services/artifacts/tools.py +8 -0
  75. ai_review/services/cost/__init__.py +0 -0
  76. ai_review/services/cost/schema.py +44 -0
  77. ai_review/services/cost/service.py +58 -0
  78. ai_review/services/diff/__init__.py +0 -0
  79. ai_review/services/diff/renderers.py +149 -0
  80. ai_review/services/diff/schema.py +6 -0
  81. ai_review/services/diff/service.py +96 -0
  82. ai_review/services/diff/tools.py +59 -0
  83. ai_review/services/git/__init__.py +0 -0
  84. ai_review/services/git/service.py +35 -0
  85. ai_review/services/git/types.py +11 -0
  86. ai_review/services/llm/__init__.py +0 -0
  87. ai_review/services/llm/claude/__init__.py +0 -0
  88. ai_review/services/llm/claude/client.py +26 -0
  89. ai_review/services/llm/factory.py +18 -0
  90. ai_review/services/llm/gemini/__init__.py +0 -0
  91. ai_review/services/llm/gemini/client.py +31 -0
  92. ai_review/services/llm/openai/__init__.py +0 -0
  93. ai_review/services/llm/openai/client.py +28 -0
  94. ai_review/services/llm/types.py +15 -0
  95. ai_review/services/prompt/__init__.py +0 -0
  96. ai_review/services/prompt/adapter.py +25 -0
  97. ai_review/services/prompt/schema.py +71 -0
  98. ai_review/services/prompt/service.py +56 -0
  99. ai_review/services/review/__init__.py +0 -0
  100. ai_review/services/review/inline/__init__.py +0 -0
  101. ai_review/services/review/inline/schema.py +53 -0
  102. ai_review/services/review/inline/service.py +38 -0
  103. ai_review/services/review/policy/__init__.py +0 -0
  104. ai_review/services/review/policy/service.py +60 -0
  105. ai_review/services/review/service.py +207 -0
  106. ai_review/services/review/summary/__init__.py +0 -0
  107. ai_review/services/review/summary/schema.py +15 -0
  108. ai_review/services/review/summary/service.py +14 -0
  109. ai_review/services/vcs/__init__.py +0 -0
  110. ai_review/services/vcs/factory.py +12 -0
  111. ai_review/services/vcs/gitlab/__init__.py +0 -0
  112. ai_review/services/vcs/gitlab/client.py +152 -0
  113. ai_review/services/vcs/types.py +55 -0
  114. ai_review/tests/__init__.py +0 -0
  115. ai_review/tests/fixtures/__init__.py +0 -0
  116. ai_review/tests/fixtures/git.py +31 -0
  117. ai_review/tests/suites/__init__.py +0 -0
  118. ai_review/tests/suites/clients/__init__.py +0 -0
  119. ai_review/tests/suites/clients/claude/__init__.py +0 -0
  120. ai_review/tests/suites/clients/claude/test_client.py +31 -0
  121. ai_review/tests/suites/clients/claude/test_schema.py +59 -0
  122. ai_review/tests/suites/clients/gemini/__init__.py +0 -0
  123. ai_review/tests/suites/clients/gemini/test_client.py +30 -0
  124. ai_review/tests/suites/clients/gemini/test_schema.py +105 -0
  125. ai_review/tests/suites/clients/openai/__init__.py +0 -0
  126. ai_review/tests/suites/clients/openai/test_client.py +30 -0
  127. ai_review/tests/suites/clients/openai/test_schema.py +53 -0
  128. ai_review/tests/suites/libs/__init__.py +0 -0
  129. ai_review/tests/suites/libs/diff/__init__.py +0 -0
  130. ai_review/tests/suites/libs/diff/test_models.py +105 -0
  131. ai_review/tests/suites/libs/diff/test_parser.py +115 -0
  132. ai_review/tests/suites/libs/diff/test_tools.py +62 -0
  133. ai_review/tests/suites/services/__init__.py +0 -0
  134. ai_review/tests/suites/services/diff/__init__.py +0 -0
  135. ai_review/tests/suites/services/diff/test_renderers.py +168 -0
  136. ai_review/tests/suites/services/diff/test_service.py +84 -0
  137. ai_review/tests/suites/services/diff/test_tools.py +108 -0
  138. ai_review/tests/suites/services/prompt/__init__.py +0 -0
  139. ai_review/tests/suites/services/prompt/test_schema.py +38 -0
  140. ai_review/tests/suites/services/prompt/test_service.py +128 -0
  141. ai_review/tests/suites/services/review/__init__.py +0 -0
  142. ai_review/tests/suites/services/review/inline/__init__.py +0 -0
  143. ai_review/tests/suites/services/review/inline/test_schema.py +65 -0
  144. ai_review/tests/suites/services/review/inline/test_service.py +49 -0
  145. ai_review/tests/suites/services/review/policy/__init__.py +0 -0
  146. ai_review/tests/suites/services/review/policy/test_service.py +95 -0
  147. ai_review/tests/suites/services/review/summary/__init__.py +0 -0
  148. ai_review/tests/suites/services/review/summary/test_schema.py +22 -0
  149. ai_review/tests/suites/services/review/summary/test_service.py +16 -0
  150. xai_review-0.3.0.dist-info/METADATA +11 -0
  151. xai_review-0.3.0.dist-info/RECORD +154 -0
  152. xai_review-0.3.0.dist-info/WHEEL +5 -0
  153. xai_review-0.3.0.dist-info/entry_points.txt +2 -0
  154. xai_review-0.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,95 @@
1
+ import pytest
2
+
3
+ from ai_review.config import settings
4
+ from ai_review.services.review.policy.service import ReviewPolicyService
5
+
6
+
7
+ @pytest.fixture(autouse=True)
8
+ def reset_settings(monkeypatch: pytest.MonkeyPatch):
9
+ """Сбрасываем правила перед каждым тестом."""
10
+ monkeypatch.setattr(settings.review, "ignore_changes", [])
11
+ monkeypatch.setattr(settings.review, "allow_changes", [])
12
+ monkeypatch.setattr(settings.review, "max_inline_comments", None)
13
+ monkeypatch.setattr(settings.review, "max_context_comments", None)
14
+
15
+
16
+ # ---------- should_review_file ----------
17
+
18
+ def test_should_review_skips_if_matches_ignore(monkeypatch):
19
+ monkeypatch.setattr(settings.review, "ignore_changes", ["*.md"])
20
+ assert not ReviewPolicyService.should_review_file("README.md")
21
+ assert ReviewPolicyService.should_review_file("main.py")
22
+
23
+
24
+ def test_should_review_allows_if_no_allow_rules(monkeypatch):
25
+ monkeypatch.setattr(settings.review, "ignore_changes", [])
26
+ monkeypatch.setattr(settings.review, "allow_changes", [])
27
+ assert ReviewPolicyService.should_review_file("file.py")
28
+
29
+
30
+ def test_should_review_allows_if_matches_allow(monkeypatch):
31
+ monkeypatch.setattr(settings.review, "allow_changes", ["src/*.py"])
32
+ assert ReviewPolicyService.should_review_file("src/main.py")
33
+ assert not ReviewPolicyService.should_review_file("tests/test_main.py")
34
+
35
+
36
+ def test_should_review_skips_if_not_in_allow(monkeypatch):
37
+ monkeypatch.setattr(settings.review, "allow_changes", ["only/*.py"])
38
+ assert not ReviewPolicyService.should_review_file("other/file.py")
39
+
40
+
41
+ def test_ignore_has_priority_over_allow(monkeypatch):
42
+ monkeypatch.setattr(settings.review, "ignore_changes", ["*.py"])
43
+ monkeypatch.setattr(settings.review, "allow_changes", ["*.py"])
44
+ assert not ReviewPolicyService.should_review_file("main.py")
45
+
46
+
47
+ # ---------- apply_for_files ----------
48
+
49
+ def test_apply_for_files_filters(monkeypatch):
50
+ monkeypatch.setattr(settings.review, "ignore_changes", ["*.md"])
51
+ monkeypatch.setattr(settings.review, "allow_changes", ["src/*.py"])
52
+
53
+ files = ["README.md", "src/main.py", "tests/test_main.py"]
54
+ allowed = ReviewPolicyService.apply_for_files(files)
55
+
56
+ assert allowed == ["src/main.py"]
57
+
58
+
59
+ # ---------- apply_for_inline_comments ----------
60
+
61
+ def test_apply_for_inline_comments_with_limit(monkeypatch):
62
+ monkeypatch.setattr(settings.review, "max_inline_comments", 2)
63
+ comments = ["c1", "c2", "c3"]
64
+ limited = ReviewPolicyService.apply_for_inline_comments(comments)
65
+ assert limited == ["c1", "c2"]
66
+
67
+
68
+ def test_apply_for_inline_comments_without_limit(monkeypatch):
69
+ monkeypatch.setattr(settings.review, "max_inline_comments", None)
70
+ comments = ["c1", "c2", "c3"]
71
+ limited = ReviewPolicyService.apply_for_inline_comments(comments)
72
+ assert limited == comments
73
+
74
+
75
+ def test_apply_for_inline_comments_when_fewer_than_limit(monkeypatch):
76
+ monkeypatch.setattr(settings.review, "max_inline_comments", 5)
77
+ comments = ["c1", "c2"]
78
+ limited = ReviewPolicyService.apply_for_inline_comments(comments)
79
+ assert limited == comments
80
+
81
+
82
+ # ---------- apply_for_context_comments ----------
83
+
84
+ def test_apply_for_context_comments_with_limit(monkeypatch):
85
+ monkeypatch.setattr(settings.review, "max_context_comments", 1)
86
+ comments = ["c1", "c2"]
87
+ limited = ReviewPolicyService.apply_for_context_comments(comments)
88
+ assert limited == ["c1"]
89
+
90
+
91
+ def test_apply_for_context_comments_without_limit(monkeypatch):
92
+ monkeypatch.setattr(settings.review, "max_context_comments", None)
93
+ comments = ["c1", "c2", "c3"]
94
+ limited = ReviewPolicyService.apply_for_context_comments(comments)
95
+ assert limited == comments
@@ -0,0 +1,22 @@
1
+ from ai_review.config import settings
2
+ from ai_review.services.review.summary.schema import SummaryCommentSchema
3
+
4
+
5
+ def test_normalize_text_strips_whitespace():
6
+ comment = SummaryCommentSchema(text=" some summary ")
7
+ assert comment.text == "some summary"
8
+
9
+
10
+ def test_normalize_text_empty_becomes_empty_string():
11
+ comment = SummaryCommentSchema(text=" ")
12
+ assert comment.text == ""
13
+
14
+
15
+ def test_body_with_tag_appends_tag(monkeypatch):
16
+ monkeypatch.setattr(settings.review, "summary_tag", "#ai-summary")
17
+ comment = SummaryCommentSchema(text="Review passed")
18
+ body = comment.body_with_tag
19
+ assert body.startswith("Review passed")
20
+ assert body.endswith("\n\n#ai-summary")
21
+ # убедимся, что перенос строки присутствует
22
+ assert "\n\n#ai-summary" in body
@@ -0,0 +1,16 @@
1
+ import pytest
2
+
3
+ from ai_review.services.review.summary.schema import SummaryCommentSchema
4
+ from ai_review.services.review.summary.service import SummaryCommentService
5
+
6
+
7
+ @pytest.mark.parametrize("raw, expected", [
8
+ ("Some summary", "Some summary"),
9
+ (" padded summary ", "padded summary"),
10
+ ("", ""),
11
+ (None, ""),
12
+ ])
13
+ def test_parse_model_output_normalizes_and_wraps(raw, expected):
14
+ result = SummaryCommentService.parse_model_output(raw)
15
+ assert isinstance(result, SummaryCommentSchema)
16
+ assert result.text == expected
@@ -0,0 +1,11 @@
1
+ Metadata-Version: 2.4
2
+ Name: xai-review
3
+ Version: 0.3.0
4
+ Requires-Dist: typer
5
+ Requires-Dist: httpx
6
+ Requires-Dist: pyyaml
7
+ Requires-Dist: pytest
8
+ Requires-Dist: loguru
9
+ Requires-Dist: aiofiles
10
+ Requires-Dist: pydantic
11
+ Requires-Dist: pydantic-settings
@@ -0,0 +1,154 @@
1
+ ai_review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ ai_review/config.py,sha256=t3lhgbI58GjU5Wt7M-wVn0RyPcN51JPiMPOJQ39sT-M,1868
3
+ ai_review/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ ai_review/cli/main.py,sha256=rZ0LYSAt3AFT-wOHdop8lq2GOVAK48kJYp7nf801Mjs,1854
5
+ ai_review/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ ai_review/cli/commands/run_context_review.py,sha256=pWYv9fIlVql8Bf0oz4UQ0a-Ta5NCzY3hC7f_W23wUaA,224
7
+ ai_review/cli/commands/run_inline_review.py,sha256=u55K-Su0PR2-NcK7XI2rTCIi7HTEi1VvA8wyw2B39bk,222
8
+ ai_review/cli/commands/run_review.py,sha256=i39IYNDE_lAiQQnKLmxG71Ao8WAIOSn82L9EpdbPcsI,261
9
+ ai_review/cli/commands/run_summary_review.py,sha256=NqjepGH5cbqczPzcuMEAxO4dI58FEUZl0b6uRVQ9SiA,224
10
+ ai_review/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ ai_review/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ ai_review/clients/claude/client.py,sha256=bMf5HK8HL-E83NPWcZx_fLMKGhCieHDdxpv7_YQ-818,1768
13
+ ai_review/clients/claude/schema.py,sha256=LE6KCjJKDXqBGU2Cno5XL5R8vUfScgskE9MqvE0Pt2A,887
14
+ ai_review/clients/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ ai_review/clients/gemini/client.py,sha256=fAWd-yZ7PCiLQ3dTZ5tsanG1UmQ2LV_jMjjnuGF77mM,1767
16
+ ai_review/clients/gemini/schema.py,sha256=5oVvbI-h_sw8bFreS4JUmMj-aXa_frvxK3H8sg4iJIA,2264
17
+ ai_review/clients/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ ai_review/clients/gitlab/client.py,sha256=vU12e0tJ-2u8tBx730m5jNwO2o_ban_4kW7ciY81TuA,1143
19
+ ai_review/clients/gitlab/mr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ ai_review/clients/gitlab/mr/client.py,sha256=-4KHBie8NlHzX5LXdV9c9aL7UbHxuQ5XsDq701U-6q8,3844
21
+ ai_review/clients/gitlab/mr/schema/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ ai_review/clients/gitlab/mr/schema/changes.py,sha256=jmEgiLE07TNVU7nBe4hkP4xd1VOfpPYKF_7jBdalvq0,754
23
+ ai_review/clients/gitlab/mr/schema/comments.py,sha256=F_ehfaZDsDPfJJH9HK1BTC3GAKZhm0Nkb15XbAgd1pA,382
24
+ ai_review/clients/gitlab/mr/schema/discussions.py,sha256=b5Ro_W4dp1_JLEejRz05gYFwiNeoGk-8niz1z27rSIk,710
25
+ ai_review/clients/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ ai_review/clients/openai/client.py,sha256=6n9c_R5zER2nJAEwBlwKXlfNDim4Kyk0vKTbtWdhHDk,1699
27
+ ai_review/clients/openai/schema.py,sha256=glxwMtBrDA6W0BQgH-ruKe0bKH3Ps1P-Y1-2jGdqaUM,764
28
+ ai_review/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
+ ai_review/libs/logger.py,sha256=LbXR2Zk1btJ-83I-vHee7cUETgT1mHToSsqEI_8uM0U,370
30
+ ai_review/libs/resources.py,sha256=s9taAbL1Shl_GiGkPpkkivUcM1Yh6d_IQAG97gffsJU,748
31
+ ai_review/libs/asynchronous/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ ai_review/libs/asynchronous/gather.py,sha256=7YnZH7Y0IZxOSyFmQOFL3vNxsSz1ErIeB3uXoOyqN_M,431
33
+ ai_review/libs/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
+ ai_review/libs/config/artifacts.py,sha256=8BzbQu5GxwV6i6qzrUKM1De1Ogb00Ph5WTqwZ3fVpGg,483
35
+ ai_review/libs/config/base.py,sha256=sPf3OKeF1ID0ouOwiVaUtvpWuZXJXQvIw5kbnPUyN9o,686
36
+ ai_review/libs/config/claude.py,sha256=E9AJmszfY4TH8PkJjnDDDJYNAU9bLGsUThM3kriVA58,302
37
+ ai_review/libs/config/gemini.py,sha256=sXHud43LWb4xTvhdkGQeHSLC7qvWl5LfU41fgcIVE5E,274
38
+ ai_review/libs/config/gitlab.py,sha256=VFvoVtni86tWky6Y34XCYdNrBuAtbgFFYGK3idPSOS4,234
39
+ ai_review/libs/config/http.py,sha256=R2MBZ-P10zIMXGs1tKbbPKFhvlEocVFd7Vv5dvg_QME,431
40
+ ai_review/libs/config/llm.py,sha256=cK-e4NCQxnnixLATCsO8-r5k3zUWz1N0BdPCoqerORM,1824
41
+ ai_review/libs/config/logger.py,sha256=oPmjpjf6EZwW7CgOjT8mOQdGnT98CLwXepiGB_ajZvU,384
42
+ ai_review/libs/config/openai.py,sha256=vOYqhUq0ceEuNdQrQaHq44lVS5M648mB61Zc4YlfJVw,271
43
+ ai_review/libs/config/prompt.py,sha256=xtgwsZ7NVmIEW3wpvfNiXJB3a1T_b_oUyfBOQ2Ye0g0,4389
44
+ ai_review/libs/config/review.py,sha256=LEZni68iH_0m4URPfN0d3F6yrrK7KSn-BwXf-7w2al8,1058
45
+ ai_review/libs/config/vcs.py,sha256=FduvJJkGObh2LgTSapaMB6FABIvjX7E63yTwZF4p8CU,517
46
+ ai_review/libs/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
47
+ ai_review/libs/constants/llm_provider.py,sha256=sKnDLylCIIosYjq0-0r91LMiYJ4DlHVH2jeRDv_DlsQ,121
48
+ ai_review/libs/constants/vcs_provider.py,sha256=mZMC8DWIDWQ1YeUZh1a1jduX5enOAe1rWeza0RBmpTY,99
49
+ ai_review/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ ai_review/libs/diff/models.py,sha256=RT4YJboOPA-AjNJGRj_HIZaJLEmROOhOgMh1wIGpIwY,2344
51
+ ai_review/libs/diff/parser.py,sha256=2BGxZnRN3SRjNnZK4qIOW28aM93Ij__1SltwclJrlno,3817
52
+ ai_review/libs/diff/tools.py,sha256=CZWRDlOW2YS-b8h9gv_uP1MG194_FLkKzcKTwwZHocI,686
53
+ ai_review/libs/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ ai_review/libs/http/client.py,sha256=JONzbhJWJKFz8Jy6p9pzq2hAMKlyJ2_WkBksuAlqW7k,453
55
+ ai_review/libs/http/handlers.py,sha256=k1VvCIFjLzfH3qQ--aj4CZVgbU0oj78sYStMBrxo_Ek,1040
56
+ ai_review/libs/http/event_hooks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
+ ai_review/libs/http/event_hooks/base.py,sha256=cnSOOButTJYKeyb_OnGms1vXRfwfExP81L3ZfYWLufk,279
58
+ ai_review/libs/http/event_hooks/logger.py,sha256=CcGk4dmxrOTwsM-QgTHQiJdI8cgLAG-Ay56iygOUCKU,546
59
+ ai_review/libs/http/transports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
+ ai_review/libs/http/transports/retry.py,sha256=WfY36SEMokjP0-uGv_OKlsaAVpMgePc1aYw3Eq4evTE,1145
61
+ ai_review/prompts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
+ ai_review/prompts/default_context.md,sha256=W8LvCMQxaX09NhPokwuxYLlA1jPCYor80GgZO8nhKbc,633
63
+ ai_review/prompts/default_inline.md,sha256=UlxozaY5NtdZvA_d3qtAwIQSLP3C5JJh-mJtxGp_u0Q,257
64
+ ai_review/prompts/default_summary.md,sha256=jfO7hd-aHUbYvWFJwosbPwEYINRaM_W30pqOT_YNOco,182
65
+ ai_review/prompts/default_system_context.md,sha256=HLTCkiZBuW-LsT5VqIs56mhKg48R1Xu67FbptliOTpQ,1002
66
+ ai_review/prompts/default_system_inline.md,sha256=l8Hf82Jo7urELpKiPhDusdU9ag5eCWKn55_62Y0fmSY,826
67
+ ai_review/prompts/default_system_summary.md,sha256=unEJ09G925TKqvjkTFKgl3g2AXT9GICe8kxTO50QhRg,224
68
+ ai_review/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
69
+ ai_review/resources/pricing.yaml,sha256=jZHCGF78GTlZsXC_IGZT8JutKqpUyKikYXwtxIFEAaE,746
70
+ ai_review/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
+ ai_review/services/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
+ ai_review/services/artifacts/schema.py,sha256=AD3cqw_NfPhcourFX-bayjbwNAaVyhq4T_p59lPEhMg,262
73
+ ai_review/services/artifacts/service.py,sha256=8RiQOJiJuZo_HSNpGv0jyMs9kgqjHX-9INax3aISGqU,1691
74
+ ai_review/services/artifacts/tools.py,sha256=_ZVNwyhZDiGlPAtIgLzb7TF1zBGJy8Hq32H3xoGvOkQ,223
75
+ ai_review/services/cost/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ ai_review/services/cost/schema.py,sha256=K3uCIMMxGL8AaIPh4a-d0mT5uIJuk3f805DkP8o8DtY,1323
77
+ ai_review/services/cost/service.py,sha256=rK-jw0lDszv_O13CRZAGK7R-fB-Y7xakX8aVb86zcEk,2103
78
+ ai_review/services/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ ai_review/services/diff/renderers.py,sha256=L9SEnkrYjt0kfoKl8qBH1dUDUrnA32CzCx0YI9IPvco,5611
80
+ ai_review/services/diff/schema.py,sha256=17GAQY1-ySwREJ1-NKNKgBcstMJ5Hb42FcFG2p7i6Rs,94
81
+ ai_review/services/diff/service.py,sha256=FDuMw_y2QVQcfSbkVv3H2uGf1sIMeQ0_KHYCPhCU24g,3498
82
+ ai_review/services/diff/tools.py,sha256=YHmH6Ult_rucCd563UhG0geMzqrPhqKFZKyug79xNuA,1963
83
+ ai_review/services/git/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
84
+ ai_review/services/git/service.py,sha256=_RMwgcllDoSLUzl84JML38fWkr7swnkUr6MJ46hSkWw,1282
85
+ ai_review/services/git/types.py,sha256=QTOCTmR-Rt3sUjzZQHu2PGo_6un5gvNupifAa84wON4,413
86
+ ai_review/services/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
+ ai_review/services/llm/factory.py,sha256=QZn4jCOFAJX3pQb254e76mkKw156zA9KByTrKeMv41g,721
88
+ ai_review/services/llm/types.py,sha256=zMcMFQ7F9Zcgc9JqwdHCdlTpGOA0HuWyGgoySsUh4_o,345
89
+ ai_review/services/llm/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
+ ai_review/services/llm/claude/client.py,sha256=w6CvfDYEAKyi_r88M-z_jCvMIJF3SjhQjV1EHMvNh24,1066
91
+ ai_review/services/llm/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
+ ai_review/services/llm/gemini/client.py,sha256=7FAOlTi8rV6b8g8aWcg-0LIP77AtbAoPtPWiGs0kQN0,1266
93
+ ai_review/services/llm/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ ai_review/services/llm/openai/client.py,sha256=WhMXNfH_G1NTlFkdRK5sgYvrCIE5ZQNfPhdYx49IXFk,1143
95
+ ai_review/services/prompt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
+ ai_review/services/prompt/adapter.py,sha256=xsJwBMmmuD0VIBbA7NCQuE6Zz6WyBoVJE3FuYMLHCxA,1005
97
+ ai_review/services/prompt/schema.py,sha256=yQnovyydmMcb4TnEnLRhxuvccoa1mWo6PCbHeVDUD1g,2485
98
+ ai_review/services/prompt/service.py,sha256=AQG0YnlfXYtuADaZDhWD8NkPHx_zH4TCTOFPzMvZaSs,2078
99
+ ai_review/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
100
+ ai_review/services/review/service.py,sha256=8YhRFqhZAk2pAnkDaytKSCENlOeOti1brAJq3R9tVMY,8394
101
+ ai_review/services/review/inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
+ ai_review/services/review/inline/schema.py,sha256=ry8sJdTgusQvFW51neRiapzgzVGwswwJzdYhaV3hbT0,1545
103
+ ai_review/services/review/inline/service.py,sha256=2joeGCoPLacQAsmEtEKzmqPTQNYFYW8Dq3Cyfn3HZ_I,1408
104
+ ai_review/services/review/policy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
105
+ ai_review/services/review/policy/service.py,sha256=yGDePLxAEF3N1Pkh47jGVd-4dGEESyxDXIXxV7KQfuY,2027
106
+ ai_review/services/review/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
+ ai_review/services/review/summary/schema.py,sha256=GipVNWrEKtgZPkytNSrXwzvX9Zq8Pv2wxjXhfJq4D3g,364
108
+ ai_review/services/review/summary/service.py,sha256=GB7-l4UyjZfUe6yP_8Q-SD1_uDKHM0W-CZJVMiEL8S0,449
109
+ ai_review/services/vcs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ ai_review/services/vcs/factory.py,sha256=_xp8l1Pn2_yXi5xX1v13SROT3rRbVzFHXP1eTZxVcxI,451
111
+ ai_review/services/vcs/types.py,sha256=o3CJ8bZJ8unB9AKSpS66NwPVkFkweV4R02nCYsNqCko,1270
112
+ ai_review/services/vcs/gitlab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
+ ai_review/services/vcs/gitlab/client.py,sha256=-ZZFFlB7vv2DgEYAU016FP4CcYO8hp5LY1E2xokuCmU,6140
114
+ ai_review/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
115
+ ai_review/tests/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
+ ai_review/tests/fixtures/git.py,sha256=CwMYAQNVEeHp8OCnFWh2fBKkBkyorWJtN2eDFqpYRbQ,1038
117
+ ai_review/tests/suites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
118
+ ai_review/tests/suites/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ ai_review/tests/suites/clients/claude/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
120
+ ai_review/tests/suites/clients/claude/test_client.py,sha256=X5X04veyKCnS9z3t13tTmw_GfBIM7grpFHxS0vctODA,1088
121
+ ai_review/tests/suites/clients/claude/test_schema.py,sha256=MUZXvEROgLNpUVHfCsH5D3ruJPQwTx0OgeT3_BRVjgI,1671
122
+ ai_review/tests/suites/clients/gemini/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
123
+ ai_review/tests/suites/clients/gemini/test_client.py,sha256=6hxpK7r7iZVbOzAffRNDJnA63-3Zxvqw5ynANPhBhBg,1066
124
+ ai_review/tests/suites/clients/gemini/test_schema.py,sha256=88dU28m7sEWvGx6tqYl7if7weWYuVc8erlkFkKKI3bk,3109
125
+ ai_review/tests/suites/clients/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
+ ai_review/tests/suites/clients/openai/test_client.py,sha256=Ox5ifP1C_gSeDRacBa9DnXhe__Z8-WcbzR2JH_V3xKo,1050
127
+ ai_review/tests/suites/clients/openai/test_schema.py,sha256=x1tamS4GC9pOTpjieKDbK2D73CVV4BkATppytwMevLo,1599
128
+ ai_review/tests/suites/libs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
+ ai_review/tests/suites/libs/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
+ ai_review/tests/suites/libs/diff/test_models.py,sha256=RBFQ97LWhU8TlupxXkJ97ryAvJrSuOHLtT9biUBUMXg,3321
131
+ ai_review/tests/suites/libs/diff/test_parser.py,sha256=rvWEVGIdaLBlDAnSevjRY7I1Zikj12d5GOgMk9QyHQQ,3013
132
+ ai_review/tests/suites/libs/diff/test_tools.py,sha256=XkHJZ-b5veFz5oLKO09P7npaLN8lOzCnGR7e83Zv_mg,1953
133
+ ai_review/tests/suites/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ ai_review/tests/suites/services/diff/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
135
+ ai_review/tests/suites/services/diff/test_renderers.py,sha256=XFXaOTGAdPOJRb8w-1BOX-eci1C49mKvH4vckybrJSg,5641
136
+ ai_review/tests/suites/services/diff/test_service.py,sha256=iFkGX9Vj2X44JU3eFsoHsg9o9353eKX-QCv_J9KxfzU,3162
137
+ ai_review/tests/suites/services/diff/test_tools.py,sha256=HBQ3eCn-kLeb_k5iTgyr09x0VwLYSegSbxm0Qk9ZrCc,3543
138
+ ai_review/tests/suites/services/prompt/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
+ ai_review/tests/suites/services/prompt/test_schema.py,sha256=tsilyAV7Fwzr2BULKkgt6ZAKTG0fLujvFnCztv9KjIk,1338
140
+ ai_review/tests/suites/services/prompt/test_service.py,sha256=XY7FsAhHUjr56AKVMDgCC7OpXOhj2UirB9pARmLjUuc,5236
141
+ ai_review/tests/suites/services/review/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
142
+ ai_review/tests/suites/services/review/inline/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
143
+ ai_review/tests/suites/services/review/inline/test_schema.py,sha256=tIz-1UA_GgwcdsyUqgrodiiVVmd_jhoOVmtEwzRVWiY,2474
144
+ ai_review/tests/suites/services/review/inline/test_service.py,sha256=5YP5xoijfn39jdAlmL5fEWBNjD4XhsgKnCPBUZDMZfw,1729
145
+ ai_review/tests/suites/services/review/policy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
+ ai_review/tests/suites/services/review/policy/test_service.py,sha256=kRWT550OjWYQ7ZfsihBRc-tx-NMkhlynEsqur55RK0M,3687
147
+ ai_review/tests/suites/services/review/summary/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
148
+ ai_review/tests/suites/services/review/summary/test_schema.py,sha256=xSoydvABZldHaVDa0OBFvYrj8wMuZqUDN3MO-XdvxOI,819
149
+ ai_review/tests/suites/services/review/summary/test_service.py,sha256=8UMvi_NL9frm280vD6Q1NCDrdI7K8YbXzoViIus-I2g,541
150
+ xai_review-0.3.0.dist-info/METADATA,sha256=EpPnDWijU6-sGsRVqSMh3VhO0cj_aNDK6shCUsdNCk8,243
151
+ xai_review-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
152
+ xai_review-0.3.0.dist-info/entry_points.txt,sha256=JyC5URanMi5io5P_PXQf7H_I1OGIpk5cZQhaPQ0g4Zs,53
153
+ xai_review-0.3.0.dist-info/top_level.txt,sha256=sTsZbfzLoqvRZKdKa-BcxWvjlHdrpbeJ6DrGY0EuR0E,10
154
+ xai_review-0.3.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ ai-review = ai_review.cli.main:app
@@ -0,0 +1 @@
1
+ ai_review