@in-the-loop-labs/pair-review 2.4.2 → 2.4.3
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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pair-review",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.3",
|
|
4
4
|
"description": "pair-review app integration — Open PRs and local changes in the pair-review web UI, run server-side AI analysis, and address review feedback. Requires the pair-review MCP server.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "in-the-loop-labs",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "code-critic",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.3",
|
|
4
4
|
"description": "AI-powered code review analysis — Run three-level AI analysis and implement-review-fix loops directly in your coding agent. Works standalone, no server required.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "in-the-loop-labs",
|
package/public/css/pr.css
CHANGED
|
@@ -12277,9 +12277,12 @@ body.resizing * {
|
|
|
12277
12277
|
font-size: 14px;
|
|
12278
12278
|
}
|
|
12279
12279
|
|
|
12280
|
-
/*
|
|
12280
|
+
/* Don't grow (keeps badge next to text), shrink for long paths, clip from the left so the filename stays visible */
|
|
12281
12281
|
.context-file-header .d2h-file-name {
|
|
12282
|
-
flex:
|
|
12282
|
+
flex: 0 1 auto;
|
|
12283
|
+
direction: rtl;
|
|
12284
|
+
unicode-bidi: plaintext;
|
|
12285
|
+
text-overflow: ellipsis;
|
|
12283
12286
|
}
|
|
12284
12287
|
|
|
12285
12288
|
/* Push viewed checkbox (and everything after it) to the right */
|
package/public/js/pr.js
CHANGED
|
@@ -4480,7 +4480,16 @@ class PRManager {
|
|
|
4480
4480
|
const tbody = document.createElement('tbody');
|
|
4481
4481
|
tbody.className = 'd2h-diff-tbody context-chunk';
|
|
4482
4482
|
tbody.dataset.contextId = contextFile.id;
|
|
4483
|
-
|
|
4483
|
+
|
|
4484
|
+
// Compute effective display range, shifting for end-of-file
|
|
4485
|
+
const clampedEnd = Math.min(contextFile.line_end, data.lines.length);
|
|
4486
|
+
const intendedSize = contextFile.line_end - contextFile.line_start + 1;
|
|
4487
|
+
let effectiveStart = contextFile.line_start;
|
|
4488
|
+
const actualSize = clampedEnd - effectiveStart + 1;
|
|
4489
|
+
if (actualSize < intendedSize && effectiveStart > 1) {
|
|
4490
|
+
effectiveStart = Math.max(1, effectiveStart - (intendedSize - actualSize));
|
|
4491
|
+
}
|
|
4492
|
+
tbody.dataset.lineStart = effectiveStart;
|
|
4484
4493
|
|
|
4485
4494
|
// Chunk header row with range label and per-chunk dismiss button
|
|
4486
4495
|
const headerRow = document.createElement('tr');
|
|
@@ -4493,8 +4502,7 @@ class PRManager {
|
|
|
4493
4502
|
contentTd.colSpan = 3;
|
|
4494
4503
|
const rangeLabel = document.createElement('span');
|
|
4495
4504
|
rangeLabel.className = 'context-range-label';
|
|
4496
|
-
|
|
4497
|
-
rangeLabel.textContent = `Lines ${contextFile.line_start}\u2013${lineEnd}`;
|
|
4505
|
+
rangeLabel.textContent = `Lines ${effectiveStart}\u2013${clampedEnd}`;
|
|
4498
4506
|
contentTd.appendChild(rangeLabel);
|
|
4499
4507
|
const chunkDismiss = document.createElement('button');
|
|
4500
4508
|
chunkDismiss.className = 'context-chunk-dismiss';
|
|
@@ -4508,25 +4516,22 @@ class PRManager {
|
|
|
4508
4516
|
headerRow.appendChild(contentTd);
|
|
4509
4517
|
tbody.appendChild(headerRow);
|
|
4510
4518
|
|
|
4511
|
-
const lineStart = contextFile.line_start;
|
|
4512
|
-
const clampedEnd = Math.min(contextFile.line_end, data.lines.length);
|
|
4513
|
-
|
|
4514
4519
|
// Add expand-up gap row if there are lines above the context range
|
|
4515
|
-
if (
|
|
4516
|
-
const gapAboveSize =
|
|
4520
|
+
if (effectiveStart > 1) {
|
|
4521
|
+
const gapAboveSize = effectiveStart - 1;
|
|
4517
4522
|
const gapAbove = window.HunkParser.createGapRowElement(
|
|
4518
4523
|
contextFile.file,
|
|
4519
|
-
1,
|
|
4520
|
-
|
|
4524
|
+
1, // startLine (old coords)
|
|
4525
|
+
effectiveStart - 1, // endLine (old coords)
|
|
4521
4526
|
gapAboveSize,
|
|
4522
4527
|
'above',
|
|
4523
4528
|
this.expandGapContext.bind(this),
|
|
4524
|
-
1
|
|
4529
|
+
1 // startLineNew (same as old for context files — no diff offset)
|
|
4525
4530
|
);
|
|
4526
4531
|
tbody.appendChild(gapAbove);
|
|
4527
4532
|
}
|
|
4528
4533
|
|
|
4529
|
-
for (let i =
|
|
4534
|
+
for (let i = effectiveStart; i <= clampedEnd; i++) {
|
|
4530
4535
|
const lineData = {
|
|
4531
4536
|
type: 'context',
|
|
4532
4537
|
oldNumber: i,
|
|
@@ -4874,8 +4879,9 @@ class PRManager {
|
|
|
4874
4879
|
lineStartVal = 1;
|
|
4875
4880
|
lineEndVal = 100;
|
|
4876
4881
|
} else if (lineEnd == null) {
|
|
4877
|
-
|
|
4878
|
-
|
|
4882
|
+
// Center a ~21-line window around the target line (±10 lines)
|
|
4883
|
+
lineStartVal = Math.max(1, lineStart - 10);
|
|
4884
|
+
lineEndVal = lineStartVal + 20;
|
|
4879
4885
|
} else {
|
|
4880
4886
|
lineStartVal = lineStart;
|
|
4881
4887
|
lineEndVal = Math.min(lineEnd, lineStart + 499);
|
|
@@ -465,6 +465,14 @@ class ClaudeCodeBridge extends EventEmitter {
|
|
|
465
465
|
toolName: name,
|
|
466
466
|
status: 'start',
|
|
467
467
|
});
|
|
468
|
+
} else if (event.content_block && event.content_block.type === 'text') {
|
|
469
|
+
// When a new text block starts and we already have accumulated text
|
|
470
|
+
// from a previous block, inject paragraph separation so the markdown
|
|
471
|
+
// renderer doesn't smash the blocks together (e.g., "diff.The").
|
|
472
|
+
if (this._accumulatedText) {
|
|
473
|
+
this._accumulatedText += '\n\n';
|
|
474
|
+
this.emit('delta', { text: '\n\n' });
|
|
475
|
+
}
|
|
468
476
|
}
|
|
469
477
|
break;
|
|
470
478
|
|