@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": "@in-the-loop-labs/pair-review",
3
- "version": "2.4.2",
3
+ "version": "2.4.3",
4
4
  "description": "Your AI-powered code review partner - Close the feedback loop with AI coding agents",
5
5
  "main": "src/server.js",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pair-review",
3
- "version": "2.4.2",
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.2",
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
- /* Override flex: 1 so the file name doesn't push the badge away */
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: none;
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
- tbody.dataset.lineStart = contextFile.line_start;
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
- const lineEnd = Math.min(contextFile.line_end, data.lines.length);
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 (lineStart > 1) {
4516
- const gapAboveSize = lineStart - 1;
4520
+ if (effectiveStart > 1) {
4521
+ const gapAboveSize = effectiveStart - 1;
4517
4522
  const gapAbove = window.HunkParser.createGapRowElement(
4518
4523
  contextFile.file,
4519
- 1, // startLine (old coords)
4520
- lineStart - 1, // endLine (old coords)
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 // startLineNew (same as old for context files — no diff offset)
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 = lineStart; i <= clampedEnd; 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
- lineStartVal = lineStart;
4878
- lineEndVal = lineStart + 49;
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