open-code-review-toolkit 0.4.0__tar.gz → 0.4.2__tar.gz

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.
Files changed (53) hide show
  1. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/PKG-INFO +2 -2
  2. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/README.md +1 -1
  3. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/pyproject.toml +24 -4
  4. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/_version.py +2 -2
  5. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/formatting.py +15 -2
  6. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/workflow.py +18 -4
  7. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/preflight.py +1 -1
  8. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/review_runner.py +6 -1
  9. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/.gitignore +0 -0
  10. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/LICENSE +0 -0
  11. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/__init__.py +0 -0
  12. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/cli.py +0 -0
  13. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/common/__init__.py +0 -0
  14. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/common/git.py +0 -0
  15. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/common/language.py +0 -0
  16. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/common/markdown.py +0 -0
  17. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/common/redaction.py +0 -0
  18. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/config_writer.py +0 -0
  19. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/configure.py +0 -0
  20. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/__init__.py +0 -0
  21. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/__main__.py +0 -0
  22. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/ansible.py +0 -0
  23. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/ansible_requirements.py +0 -0
  24. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/artifacts.py +0 -0
  25. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/categorize.py +0 -0
  26. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/collect.py +0 -0
  27. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/collectors.py +0 -0
  28. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/composer_manifests.py +0 -0
  29. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/go_manifests.py +0 -0
  30. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/infrastructure.py +0 -0
  31. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/invocation.py +0 -0
  32. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/javascript_manifests.py +0 -0
  33. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/manifest_model.py +0 -0
  34. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/mcp.py +0 -0
  35. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/model.py +0 -0
  36. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/project.py +0 -0
  37. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/python_manifests.py +0 -0
  38. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/repository.py +0 -0
  39. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/evidence/store.py +0 -0
  40. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/mcp_config.py +0 -0
  41. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/ocr_result.py +0 -0
  42. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/__init__.py +0 -0
  43. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/__main__.py +0 -0
  44. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/comments.py +0 -0
  45. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/gitlab.py +0 -0
  46. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/markers.py +0 -0
  47. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/payloads.py +0 -0
  48. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/result.py +0 -0
  49. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/settings.py +0 -0
  50. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/posting/snapshot.py +0 -0
  51. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/providers/__init__.py +0 -0
  52. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/providers/gitlab.py +0 -0
  53. {open_code_review_toolkit-0.4.0 → open_code_review_toolkit-0.4.2}/src/ocr_toolkit/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: open-code-review-toolkit
3
- Version: 0.4.0
3
+ Version: 0.4.2
4
4
  Summary: Unofficial GitLab CI integration layer for Open Code Review
5
5
  Project-URL: Homepage, https://github.com/xeonvs/open-code-review-toolkit
6
6
  Project-URL: Repository, https://github.com/xeonvs/open-code-review-toolkit
@@ -241,7 +241,7 @@ ocr --version
241
241
  ocr-ci --help
242
242
  ```
243
243
 
244
- The current compatibility target is OCR `1.8.0`. CI should pin the release and verify its published checksum before execution.
244
+ The current compatibility target is OCR `1.8.3`. CI should pin the release and verify its published checksum before execution.
245
245
  The [versioned compatibility policy](docs/compatibility.md) records tested assets and evidence and describes the conservative Dependabot-like qualification workflow for later upstream releases.
246
246
  Review output defaults to English. `OCR_REVIEW_LANGUAGE` accepts another explicit language name when a project needs localized review output; for example, `OCR_REVIEW_LANGUAGE=Russian`.
247
247
 
@@ -15,7 +15,7 @@ ocr --version
15
15
  ocr-ci --help
16
16
  ```
17
17
 
18
- The current compatibility target is OCR `1.8.0`. CI should pin the release and verify its published checksum before execution.
18
+ The current compatibility target is OCR `1.8.3`. CI should pin the release and verify its published checksum before execution.
19
19
  The [versioned compatibility policy](docs/compatibility.md) records tested assets and evidence and describes the conservative Dependabot-like qualification workflow for later upstream releases.
20
20
  Review output defaults to English. `OCR_REVIEW_LANGUAGE` accepts another explicit language name when a project needs localized review output; for example, `OCR_REVIEW_LANGUAGE=Russian`.
21
21
 
@@ -124,12 +124,27 @@ underlines = ["", "", ""]
124
124
 
125
125
  [[tool.towncrier.type]]
126
126
  directory = "feature"
127
- name = "Features"
127
+ name = "🚀 Features"
128
128
  showcontent = true
129
129
 
130
130
  [[tool.towncrier.type]]
131
131
  directory = "bugfix"
132
- name = "Bug fixes"
132
+ name = "🐛 Bug Fixes"
133
+ showcontent = true
134
+
135
+ [[tool.towncrier.type]]
136
+ directory = "refactor"
137
+ name = "🔧 Refactoring"
138
+ showcontent = true
139
+
140
+ [[tool.towncrier.type]]
141
+ directory = "doc"
142
+ name = "📖 Documentation"
143
+ showcontent = true
144
+
145
+ [[tool.towncrier.type]]
146
+ directory = "rules"
147
+ name = "🧩 Rules"
133
148
  showcontent = true
134
149
 
135
150
  [[tool.towncrier.type]]
@@ -138,6 +153,11 @@ name = "Security"
138
153
  showcontent = true
139
154
 
140
155
  [[tool.towncrier.type]]
141
- directory = "doc"
142
- name = "Documentation"
156
+ directory = "deprecation"
157
+ name = "Deprecations"
158
+ showcontent = true
159
+
160
+ [[tool.towncrier.type]]
161
+ directory = "removal"
162
+ name = "Removals"
143
163
  showcontent = true
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.4.0'
22
- __version_tuple__ = version_tuple = (0, 4, 0)
21
+ __version__ = version = '0.4.2'
22
+ __version_tuple__ = version_tuple = (0, 4, 2)
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -684,7 +684,12 @@ def guide_comment_snippet(comment: dict[str, Any]) -> str:
684
684
  return excerpt
685
685
 
686
686
 
687
- def format_reviewer_guide(comments: Sequence[dict[str, Any]], omitted_count: int) -> str:
687
+ def format_reviewer_guide(
688
+ comments: Sequence[dict[str, Any]],
689
+ omitted_count: int,
690
+ *,
691
+ outcome_status: str = "success",
692
+ ) -> str:
688
693
  """Build a bounded reviewer guide from already published OCR findings."""
689
694
 
690
695
  if not comments and omitted_count <= 0:
@@ -710,6 +715,10 @@ def format_reviewer_guide(comments: Sequence[dict[str, Any]], omitted_count: int
710
715
  f"- Estimated effort to review: {effort}/5",
711
716
  ]
712
717
  )
718
+ if outcome_status == "budget_exceeded":
719
+ lines.append(
720
+ "- ⚠️ Review scope: OCR reached its token budget; treat all findings as a partial review."
721
+ )
713
722
 
714
723
  if not security_comments and omitted_count:
715
724
  lines.append(
@@ -772,13 +781,17 @@ def summarize_result(
772
781
  "skipped": "ℹ️", # noqa: RUF001 - intentional information emoji
773
782
  "completed_with_warnings": "⚠️",
774
783
  "completed_with_errors": "❌",
784
+ "budget_exceeded": "⚠️",
775
785
  }
776
786
  marker = f"{status_markers.get(outcome_status, '❌')} " if use_emoji else ""
777
787
  safe_message = neutralize_quick_actions(
778
788
  compact_control_text(redact_sensitive(outcome_message), max_chars=500)
779
789
  )
780
790
  if not safe_message:
781
- safe_message = f"Found {total} issue(s)." if total else "No issues found."
791
+ if outcome_status == "budget_exceeded":
792
+ safe_message = "Review stopped after reaching its token budget; findings are partial."
793
+ else:
794
+ safe_message = f"Found {total} issue(s)." if total else "No issues found."
782
795
  lines = [
783
796
  "# Open Code Review summary",
784
797
  f"{marker}{safe_message}",
@@ -44,7 +44,7 @@ from ocr_toolkit.posting.gitlab import (
44
44
  resolve_discussion,
45
45
  )
46
46
  from ocr_toolkit.posting.markers import annotate_comment_fingerprints
47
- from ocr_toolkit.posting.result import llm_billing_failure_warnings
47
+ from ocr_toolkit.posting.result import llm_billing_failure_warnings, ocr_warning_text
48
48
  from ocr_toolkit.posting.snapshot import (
49
49
  BotCommentRefs,
50
50
  cleanup_drafts_created_by_this_run,
@@ -392,6 +392,7 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
392
392
  "skipped",
393
393
  "completed_with_warnings",
394
394
  "completed_with_errors",
395
+ "budget_exceeded",
395
396
  }
396
397
  if status not in allowed_statuses:
397
398
  return invalid_ocr_schema_exit(config, "field 'status' is unsupported")
@@ -401,6 +402,14 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
401
402
  return invalid_ocr_schema_exit(config, "field 'comments' must be a list")
402
403
  if not isinstance(warnings_value, list):
403
404
  return invalid_ocr_schema_exit(config, "field 'warnings' must be a list")
405
+ summary_value = result.get("summary")
406
+ summary_budget_exceeded = (
407
+ isinstance(summary_value, dict) and summary_value.get("budget_exceeded") is True
408
+ )
409
+ if (status == "budget_exceeded") != summary_budget_exceeded:
410
+ return invalid_ocr_schema_exit(
411
+ config, "fields 'status' and 'summary.budget_exceeded' disagree"
412
+ )
404
413
 
405
414
  comments: list[dict[str, Any]] = []
406
415
  for index, comment in enumerate(comments_value):
@@ -455,7 +464,7 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
455
464
  comments = comments[:publish_limit]
456
465
 
457
466
  emoji = post_emoji()
458
- reviewer_guide = format_reviewer_guide(comments, omitted_count)
467
+ reviewer_guide = format_reviewer_guide(comments, omitted_count, outcome_status=status)
459
468
 
460
469
  if publishable_comment_count == 0:
461
470
  raw_message = clean_text(result.get("message"))
@@ -472,6 +481,7 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
472
481
  "skipped": "ℹ️", # noqa: RUF001 - intentional information emoji
473
482
  "completed_with_warnings": "⚠️",
474
483
  "completed_with_errors": "❌",
484
+ "budget_exceeded": "⚠️",
475
485
  }[status]
476
486
  fallback_message = (
477
487
  "No review comments generated. No issues found."
@@ -479,7 +489,11 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
479
489
  else (
480
490
  "No supported files changed."
481
491
  if status == "skipped"
482
- else "Review did not complete cleanly."
492
+ else (
493
+ "Review stopped after reaching its token budget; this is a partial result."
494
+ if status == "budget_exceeded"
495
+ else "Review did not complete cleanly."
496
+ )
483
497
  )
484
498
  )
485
499
  body = "# Open Code Review summary\n\n"
@@ -487,7 +501,7 @@ def post_results(config: GitLabConfig, result: dict[str, Any]) -> int:
487
501
  body += message or fallback_message
488
502
  if warnings:
489
503
  warning_lines = [
490
- neutralize_quick_actions(redact_sensitive(clean_text(warning)))
504
+ neutralize_quick_actions(redact_sensitive(ocr_warning_text(warning)))
491
505
  for warning in warnings
492
506
  ]
493
507
  warning_lines = [warning for warning in warning_lines if warning]
@@ -24,7 +24,7 @@ DEFAULT_REQUEST_HEADERS = {
24
24
  "Accept": "application/json",
25
25
  "User-Agent": "open-code-review-ci-preflight/1.0",
26
26
  }
27
- EXPECTED_OCR_VERSION = "1.8.0"
27
+ EXPECTED_OCR_VERSION = "1.8.3"
28
28
 
29
29
 
30
30
  class PreflightError(Exception):
@@ -84,7 +84,12 @@ def _mcp_usage_receipt(
84
84
  """Return bounded MCP usage tied to one validated review-time registry."""
85
85
 
86
86
  status = payload.get("status")
87
- if status not in {"success", "completed_with_warnings", "completed_with_errors"}:
87
+ if status not in {
88
+ "success",
89
+ "completed_with_warnings",
90
+ "completed_with_errors",
91
+ "budget_exceeded",
92
+ }:
88
93
  if status == "skipped":
89
94
  tool_calls = payload.get("tool_calls")
90
95
  by_tool = tool_calls.get("by_tool") if isinstance(tool_calls, dict) else None