Commit 7934968
authored
feat(review-pr): emit and validate GitHub suggestion blocks (#24)
## Summary
Adds GitHub one-click suggestion blocks to PR reviews, plus a validator
that sanitizes them before posting. GitHub rejects an entire review
(HTTP 422) if any one inline suggestion anchors to an invalid line, so
the validator strips malformed suggestions while keeping the prose
finding, so one bad suggestion cannot lose the whole review.
## What changed
| Area | Change |
| --- | --- |
| Emission | The agent embeds a `suggestion` fenced block for findings
with an exact fix on contiguous changed lines
(`review-pr/agents/pr-review.yaml`, `refs/posting-format.md`) |
| Validation | New `src/validate-suggestions` module parses addressable
right-side diff lines and strips suggestions GitHub would reject |
| Build and wiring | `tsup` entry plus `action.yml` staging; the
validator runs before the `gh api` post; agent diff fallbacks redirect
into `pr.diff` |
## Robustness (covered by unit tests)
| Case | Handling |
| --- | --- |
| Path with a space (git trailing tab in the `+++` header) | tab
stripped so the key matches `comment.path`; suggestion kept |
| Non-ASCII path (git C-quoting) | header decoded back to UTF-8;
suggestion kept |
| Closing fence shorter than the opener | closer must be at least as
long; longer blocks are not truncated |
| Second opener before any closer | first block treated as unclosed and
stripped, not merged |
| Comment with no integer line anchor | fails closed (stripped) instead
of 422-ing the review |
| Prefetch failure | agent diff fallbacks write `pr.diff` so the
validator reads the same diff |
## Validation
| Check | Result |
| --- | --- |
| Unit tests | 649 passed (35 in `validate-suggestions`) |
| Build (`tsup`) | pass |
| `biome ci`, `tsc --noEmit` | pass |
| `actionlint` | pass |
Each robustness case was additionally reproduced against the
implementation and confirmed handled via an independent adversarial
verification pass.1 parent 7938006 commit 7934968
8 files changed
Lines changed: 1104 additions & 6 deletions
File tree
- review-pr
- agents
- refs
- src/validate-suggestions
- __tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
307 | 307 | | |
308 | 308 | | |
309 | 309 | | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
310 | 337 | | |
311 | 338 | | |
312 | 339 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
746 | 746 | | |
747 | 747 | | |
748 | 748 | | |
749 | | - | |
| 749 | + | |
750 | 750 | | |
751 | 751 | | |
752 | 752 | | |
| |||
779 | 779 | | |
780 | 780 | | |
781 | 781 | | |
| 782 | + | |
| 783 | + | |
| 784 | + | |
| 785 | + | |
| 786 | + | |
| 787 | + | |
| 788 | + | |
782 | 789 | | |
783 | 790 | | |
784 | 791 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
75 | 75 | | |
76 | 76 | | |
77 | 77 | | |
78 | | - | |
79 | | - | |
80 | | - | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
81 | 84 | | |
82 | | - | |
83 | | - | |
| 85 | + | |
| 86 | + | |
84 | 87 | | |
85 | 88 | | |
86 | 89 | | |
| |||
224 | 227 | | |
225 | 228 | | |
226 | 229 | | |
| 230 | + | |
| 231 | + | |
227 | 232 | | |
228 | 233 | | |
229 | 234 | | |
| |||
412 | 417 | | |
413 | 418 | | |
414 | 419 | | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
415 | 443 | | |
416 | 444 | | |
417 | 445 | | |
| |||
919 | 947 | | |
920 | 948 | | |
921 | 949 | | |
| 950 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
66 | 66 | | |
67 | 67 | | |
68 | 68 | | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
69 | 84 | | |
70 | 85 | | |
71 | 86 | | |
| |||
83 | 98 | | |
84 | 99 | | |
85 | 100 | | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
86 | 142 | | |
87 | 143 | | |
88 | 144 | | |
| |||
0 commit comments