Skip to content

Conversation

Copy link
Contributor

Copilot AI commented Feb 7, 2026

  • New Features

    • Added full undo/redo support with keyboard shortcuts (Ctrl+Z / Ctrl+Shift+Z) and UI controls in the conflict resolution interface.
    • Added history panel displaying all resolution actions for quick navigation to previous states.
    • Added ability to reorder conflict rows via drag-and-drop.
    • New setting mergeNB.ui.enableUndoRedoHotkeys to control keyboard shortcut availability (default: enabled).
  • Tests

    • Added integration tests for undo/redo workflows and row reordering functionality.

Co-authored-by: Avni2000 <77120766+Avni2000@users.noreply.github.com>
Copilot AI changed the title [WIP] Add undo and redo actions for history panel Stabilize undo/redo flows and add history navigation controls Feb 7, 2026
Copilot AI requested a review from Avni2000 February 7, 2026 18:01
@Avni2000 Avni2000 marked this pull request as ready for review February 8, 2026 07:59
@Avni2000
Copy link
Owner

Avni2000 commented Feb 8, 2026

@coderabbitai could you also review this?

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

@Avni2000: I'll review the changes in this PR for you. I'll examine the undo/redo flow stabilization, history navigation controls, and the new integration tests that were added.


🧠 Learnings used
Learnt from: Avni2000
Repo: Avni2000/MergeNB PR: 0
File: :0-0
Timestamp: 2026-02-04T23:12:05.308Z
Learning: In src/tests/vscodeIntegration.test.ts: The integration test has verification gaps: it never directly checks the outputs array content (only execution_count), uses getCellSource() normalization which masks source format inconsistencies (string vs array), and derives expected cell values from data-cell attributes containing original cells rather than from resolver output.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

📝 Walkthrough

Walkthrough

This PR adds comprehensive undo/redo functionality to the MergeNB conflict resolver. It introduces a configuration option to enable keyboard shortcuts, implements snapshot-based history state management in the UI component, adds row drag-and-drop support for reordering, and includes new test utilities and integration tests to validate the undo/redo workflows.

Changes

Cohort / File(s) Summary
Configuration & Settings
README.md, package.json, src/settings.ts, src/web/webTypes.ts, src/web/client/types.ts
Removed old documentation entry. Added new configuration option mergeNB.ui.enableUndoRedoHotkeys to enable undo/redo keyboard shortcuts. Extended MergeNBSettings interface and defaults with the new setting, and propagated it through extension and web type definitions.
Conflict Resolver Extension
src/resolver.ts, src/web/WebConflictPanel.ts
Updated conflict resolver to pass enableUndoRedoHotkeys setting to the UnifiedConflict object and include it in the WebSocket payload sent to the browser.
UI Components & Styling
src/web/client/ConflictResolver.tsx, src/web/client/MergeRow.tsx, src/web/client/styles.ts
Implemented snapshot-based history and versioning layer in ConflictResolver with undo/redo controls and keyboard shortcuts (Ctrl+Z / Ctrl+Shift+Z). Added history panel UI for navigating prior states. Introduced row-level drag support and onCommitContent callback to MergeRow. Added comprehensive styling for history panel, drag handle, and header controls.
Test Utilities & Integration Tests
src/tests/integrationUtils.ts, src/tests/runIntegrationTest.ts, src/tests/undoRedoActions.test.ts, src/tests/takeAllButtons.test.ts, src/tests/vscodeIntegration.test.ts
Added new utility functions for undo/redo testing (waitForResolvedCount, clickHistoryUndo, clickHistoryRedo, getHistoryEntries). Registered two new test cases. Created comprehensive undo/redo workflow test covering branch selection, deletion, content edits, checkbox toggling, cell moves, row reordering, and history timeline navigation. Extended existing tests with undo/redo verification logic.

Sequence Diagram

sequenceDiagram
    participant User
    participant UI as ConflictResolver UI
    participant History as History State
    participant Snapshot as Snapshot Manager
    
    User->>UI: Perform action (select, edit, move)
    activate UI
    UI->>Snapshot: Create snapshot of current state
    activate Snapshot
    Snapshot-->>UI: Snapshot created
    deactivate Snapshot
    UI->>History: Record history entry
    activate History
    History->>History: Add entry to history list
    History-->>UI: History updated
    deactivate History
    UI->>User: Display updated UI + history panel
    deactivate UI
    
    User->>UI: Press Ctrl+Z (Undo)
    activate UI
    UI->>History: Get previous history entry
    activate History
    History-->>UI: Return prior snapshot
    deactivate History
    UI->>Snapshot: Apply snapshot to state
    activate Snapshot
    Snapshot->>UI: Restore previous state
    deactivate Snapshot
    UI->>User: Display restored UI
    deactivate UI
    
    User->>UI: Press Ctrl+Shift+Z (Redo)
    activate UI
    UI->>History: Get next history entry
    activate History
    History-->>UI: Return next snapshot
    deactivate History
    UI->>Snapshot: Apply snapshot to state
    activate Snapshot
    Snapshot->>UI: Restore forward state
    deactivate Snapshot
    UI->>User: Display restored UI
    deactivate UI
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • PR #44: Introduces testing infrastructure and Playwright utilities that are directly extended by this PR's new undo/redo test cases and helper functions in the same test modules.
  • PR #16: Adds the foundational web-based conflict resolver and history/undo-redo implementation that this PR builds upon, with shared modifications to resolver, web types, WebConflictPanel, and client code.
  • PR #34: Establishes the integration test harness that this PR leverages by adding new undo/redo test cases and extending Playwright test files with history verification hooks.

Poem

🐰 Hop, hop, the changes arise,
With history snapshots and undo disguise,
Keyboard shortcuts dance (Ctrl+Z with flair!),
Rows drag and reorder with care,
Conflicts resolved—now reversible there!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title '[FEAT] Add undo/redo support with history panel' clearly and concisely summarizes the main feature addition across all modified files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch copilot/add-undo-redo-actions-again

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…olution UI

- Fixes history panel
- Adds higher quality tests
- Merge rows are now draggable (untested)
@Avni2000
Copy link
Owner

Avni2000 commented Feb 8, 2026

Closes #40

@Avni2000 Avni2000 linked an issue Feb 8, 2026 that may be closed by this pull request
@Avni2000
Copy link
Owner

Avni2000 commented Feb 8, 2026

@coderabbitai sorry for force pushing! Try again.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

@Avni2000: No worries about the force push! I'll review the updated changes now.


🧠 Learnings used
Learnt from: Avni2000
Repo: Avni2000/MergeNB PR: 0
File: :0-0
Timestamp: 2026-02-04T23:12:05.308Z
Learning: In src/tests/vscodeIntegration.test.ts: The integration test has verification gaps: it never directly checks the outputs array content (only execution_count), uses getCellSource() normalization which masks source format inconsistencies (string vs array), and derives expected cell values from data-cell attributes containing original cells rather than from resolver output.
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/tests/undoRedoActions.test.ts`:
- Around line 98-100: Move the minimum-conflict-count guard into the start of
the run() test so we fail fast with a clear message: relocate the check that
throws when conflictCount < 2 (currently used later around Action 6) up to the
top of run() (near where conflictCount is first evaluated around line 98) so
actions 2–3 won't run when there is only one conflict; update the thrown message
to indicate "Expected at least two conflict rows" and remove or skip the later
duplicate guard at Action 6.
🧹 Nitpick comments (6)
src/web/client/styles.ts (1)

329-340: Duplicate .cell-placeholder rule blocks with conflicting values.

The .cell-placeholder selector is defined twice (lines 329–340 and 913–924) with different color, border, and background values. The second block silently overrides the first. Consider removing the first block or consolidating them to avoid confusion.

Also applies to: 913-924

src/web/webTypes.ts (1)

32-33: enableUndoRedoHotkeys missing from WebConflictData.

The field is added to UnifiedConflict but not to WebConflictData (line 82), which is described as the "web-compatible version of UnifiedConflict." The payload sent in WebConflictPanel._sendConflictData() includes this field, so WebConflictData should carry it too for type-level consistency.

Proposed fix
     // Display options
     hideNonConflictOutputs?: boolean;
     showCellHeaders?: boolean;
+    enableUndoRedoHotkeys?: boolean;
     
     // Branch information
src/tests/integrationUtils.ts (1)

134-150: Minor: redundant initial poll before loop body.

waitForResolvedCount calls getResolvedCount at line 141 then immediately again at line 143 on the first loop iteration, discarding the first result. The same pattern exists in waitForAllConflictsResolved above, so this is consistent — but both could short-circuit with an early return before the loop when the initial poll already matches.

♻️ Optional improvement
 ): Promise<{ resolved: number; total: number }> {
     const start = Date.now();
     let last = await getResolvedCount(page);
+    if (last.resolved === expectedResolved) {
+        return last;
+    }
     while (Date.now() - start < timeoutMs) {
-        last = await getResolvedCount(page);
+        await new Promise(r => setTimeout(r, pollMs));
+        last = await getResolvedCount(page);
         if (last.resolved === expectedResolved) {
             return last;
         }
-        await new Promise(r => setTimeout(r, pollMs));
     }
     return last;
 }
src/tests/undoRedoActions.test.ts (1)

17-17: Prefer importing MergeSide from integrationUtils instead of redeclaring.

This type is already exported from ./integrationUtils (line 5 of that file). Redeclaring it here introduces a maintenance risk if the type definition diverges.

♻️ Suggested fix
 import {
     clickHistoryUndo,
     clickHistoryRedo,
     waitForResolvedCount,
+    type MergeSide,
 } from './integrationUtils';
-
-type MergeSide = 'base' | 'current' | 'incoming';
src/web/client/ConflictResolver.tsx (2)

476-501: Side-effecting applySnapshot inside setHistory updater is a code smell.

handleUndo, handleRedo, and handleJumpToHistory all call applySnapshot (which dispatches 8 separate setState calls) inside the setHistory updater function. React state updaters should ideally be pure — they receive previous state and return next state. While React batches the updates and this works correctly in practice (including Strict Mode since applySnapshot is idempotent), it violates the convention and makes the state flow harder to reason about.

Consider restructuring so applySnapshot is called after setHistory, e.g.:

♻️ Suggested refactor sketch
     const handleUndo = useCallback(() => {
-        setHistory(prev => {
-            if (prev.index === 0) return prev;
-            const nextIndex = prev.index - 1;
-            applySnapshot(prev.entries[nextIndex].snapshot);
-            return { ...prev, index: nextIndex };
-        });
+        setHistory(prev => {
+            if (prev.index === 0) return prev;
+            return { ...prev, index: prev.index - 1 };
+        });
     }, [applySnapshot]);
+
+    // Sync snapshot whenever history.index changes
+    useEffect(() => {
+        applySnapshot(history.entries[history.index].snapshot);
+    }, [history.index]);

This would need care to avoid infinite loops (since applySnapshot sets state that triggers re-renders), so the effect would need to compare the index to a ref to avoid re-applying. An alternative is to use useReducer to manage all state atomically.


409-418: handleCommitContent reads history from closure — dependency array is correct but recreates on every history change.

Since history is in the dependency array, handleCommitContent (and therefore the onBlur callback) is recreated on every history state change (every undo/redo/record). This causes MergeRow to re-render on every history change even for rows whose resolution state hasn't changed.

Consider reading history via a ref instead (same pattern used for choices, rows, etc.) to keep this callback stable:

♻️ Suggested improvement
+    const historyRef = useRef(history);
+    useEffect(() => { historyRef.current = history; }, [history]);
+
     const handleCommitContent = useCallback((index: number) => {
         const current = choicesRef.current.get(index);
         if (!current) return;
-        const lastSnapshot = history.entries[history.index]?.snapshot;
+        const lastSnapshot = historyRef.current.entries[historyRef.current.index]?.snapshot;
         const lastChoice = lastSnapshot?.choices.get(index);
         if (lastChoice && lastChoice.resolvedContent === current.resolvedContent && lastChoice.choice === current.choice) {
             return;
         }
         recordHistory(`Edit conflict ${index + 1}`, choicesRef.current, rowsRef.current);
-    }, [history, recordHistory]);
+    }, [recordHistory]);

Comment on lines +98 to +100
if (conflictCount === 0) {
throw new Error('Expected at least one conflict row');
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

The minimum-conflict-count guard should be at the top of run().

Action 6 (line 227) throws if conflictCount < 2, but earlier actions (2–3) already implicitly require multiple conflicts — if there's only one, Action 2's redo leaves firstRow in a "deleted" state, and Action 3 (line 137) will time out waiting for .resolved-content-input on it. Move the conflictCount < 2 guard up to line 98 to fail early with a clear message.

♻️ Suggested fix
-        if (conflictCount === 0) {
-            throw new Error('Expected at least one conflict row');
+        if (conflictCount < 2) {
+            throw new Error('Expected at least two conflict rows for undo/redo test');
         }

Also applies to: 227-229

🤖 Prompt for AI Agents
In `@src/tests/undoRedoActions.test.ts` around lines 98 - 100, Move the
minimum-conflict-count guard into the start of the run() test so we fail fast
with a clear message: relocate the check that throws when conflictCount < 2
(currently used later around Action 6) up to the top of run() (near where
conflictCount is first evaluated around line 98) so actions 2–3 won't run when
there is only one conflict; update the thrown message to indicate "Expected at
least two conflict rows" and remove or skip the later duplicate guard at Action
6.

@Avni2000
Copy link
Owner

Avni2000 commented Feb 8, 2026

@coderabbitai can you also investigate why the websocket closes in CI? Again, haven't had a chance to fully test this PR/actually review it, but if you could do some preliminary research, that'd be great.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 8, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@Avni2000: I'll investigate the websocket closure issue in CI. Let me gather information about the CI configuration, recent test runs, and websocket-related code.


🏁 Script executed:

#!/bin/bash

# Find CI workflow files
echo "=== CI Workflow Files ==="
fd -t f '.ya?ml$' .github/workflows --exec echo "File: {}" \; --exec cat {} \; --exec echo ""

# Check for recent CI run failures using GitHub CLI
echo -e "\n=== Recent CI Run Logs ==="
gh run list --repo Avni2000/MergeNB --limit 5 --json conclusion,status,name,createdAt,databaseId

# Get the most recent failed or in-progress run details for this PR
echo -e "\n=== PR `#50` CI Runs ==="
gh pr checks 50 --repo Avni2000/MergeNB

# Try to get logs from the most recent run
echo -e "\n=== Most Recent Run Logs (last 100 lines) ==="
LATEST_RUN=$(gh run list --repo Avni2000/MergeNB --limit 1 --json databaseId --jq '.[0].databaseId')
if [ -n "$LATEST_RUN" ]; then
  gh run view $LATEST_RUN --repo Avni2000/MergeNB --log 2>&1 | tail -100
fi

Length of output: 19805


🏁 Script executed:

#!/bin/bash

# Examine websocket-related code in WebConflictPanel
echo "=== WebConflictPanel.ts websocket code ==="
rg -n -A 10 -B 2 'WebSocket|ws\.|close\(\)|disconnect' src/web/WebConflictPanel.ts

# Check test files for websocket setup and usage
echo -e "\n=== Websocket usage in tests ==="
rg -n -A 5 -B 2 'WebSocket|ws\.|connect|disconnect|close' src/tests/

# Check for any error handling around websocket
echo -e "\n=== Error handling in websocket code ==="
rg -n -A 5 'catch.*[Ww]eb[Ss]ocket|try.*connect' src/

# Look for any CI-specific configurations or environment checks
echo -e "\n=== CI/Environment checks ==="
rg -n -A 3 -B 3 'CI|process\.env\.CI|GITHUB_ACTIONS' src/tests/

Length of output: 14683


🏁 Script executed:

#!/bin/bash

# Check integration test setup and teardown
echo "=== Integration test runner setup ==="
cat src/tests/runIntegrationTest.ts

# Check for any timeout or connection settings
echo -e "\n=== Timeout and connection settings ==="
rg -n 'timeout|TIMEOUT|connection|CONNECTION' src/tests/

# Look for browser/page close events that might affect websocket
echo -e "\n=== Browser/Page close handling ==="
rg -n -A 5 'page\.close|browser\.close|await.*close' src/tests/

Length of output: 12380


🏁 Script executed:

#!/bin/bash

# Get more details from the failed test run
echo "=== Getting detailed logs from the failed run ==="
gh run view 21794778161 --repo Avni2000/MergeNB --log 2>&1 | grep -A 50 -B 10 "FAILED\|ERROR\|Error\|Exception" | head -200

Length of output: 34400


🏁 Script executed:

#!/bin/bash

# Look at the webServer implementation to understand websocket lifecycle
echo "=== webServer.ts websocket implementation ==="
cat src/web/webServer.ts

Length of output: 18872


🏁 Script executed:

#!/bin/bash

# Check if there are any known Chrome/Chromium version issues
echo "=== Checking Playwright/browser versions ==="
rg -n 'playwright|chromium|chrome|browser' package.json package-lock.json | head -40

# Check for any browser-specific configuration
echo -e "\n=== Browser configuration in tests ==="
rg -n -A 5 'chromium|firefox|webkit|browserType' src/tests/

Length of output: 2038


🏁 Script executed:

#!/bin/bash

# Look at the specific test that's failing
echo "=== undoRedoActions.test.ts - Move Unmatched Cell section ==="
sed -n '190,225p' src/tests/undoRedoActions.test.ts

# Check if there are any known issues with Playwright drag-and-drop
echo -e "\n=== Checking for drag-related code ==="
rg -n -A 3 -B 3 'dragTo|drag.*Drop|DragEvent' src/tests/

# Look for any error handling around websocket closure
echo -e "\n=== WebSocket error handling in client ==="
rg -n -A 5 'WebSocket.*close|ws.*close|socket.*close' src/web/client/

Length of output: 3997


@Avni2000: I've identified the root cause of the websocket closure in CI. Here's what's happening:

Root Cause Analysis

The test 02_undoRedoActions is failing specifically during the "Undo/Redo: Move Unmatched Cell" section. The WebSocket closes unexpectedly mid-test, right after performing an undo operation following a cell drag-and-drop.

Timeline of the failure:

  1. Test performs: await sourceCell.dragTo(targetPlaceholder); (line 208)
  2. Verifies moved cell appears successfully ✓
  3. Calls: await clickHistoryUndo(page);
  4. WebSocket suddenly closes
  5. Test tries to verify undo by waiting for source cell to reappear
  6. Times out because the browser has disconnected

Why This Happens

This appears to be a browser crash or instability issue during complex drag-and-drop operations in headless Chromium, particularly in CI environments. Contributing factors:

  1. Large notebook files: The test uses notebooks with ~2MB of data (1,992,378 bytes for current branch)
  2. Headless Chromium instability: Drag-and-drop operations are notoriously flaky in headless mode
  3. Complex DOM manipulations: The history/undo system involves significant DOM state changes
  4. GPU/rendering issues: The CI logs show GPU errors: "Exiting GPU process due to errors during initialization"

The "firewall warning" you mentioned in the PR description is unrelated—that's about blocking update.code.visualstudio.com which only affects VS Code update checks.

Recommended Fixes

1. Add explicit stabilization delays after drag operations

// In undoRedoActions.test.ts around line 208
await sourceCell.dragTo(targetPlaceholder);
await page.waitForTimeout(500); // Give browser time to stabilize

2. Increase timeouts for drag-related operations

await movedCell.waitFor({ timeout: 10000 }); // Increase from 5000

3. Add retry logic for flaky drag operations

async function dragWithRetry(source: Locator, target: Locator, retries = 2) {
    for (let i = 0; i < retries; i++) {
        try {
            await source.dragTo(target);
            return;
        } catch (e) {
            if (i === retries - 1) throw e;
            await page.waitForTimeout(1000);
        }
    }
}

4. Use Playwright's more reliable drag API

Instead of dragTo(), use the step-by-step approach:

const sourceBbox = await sourceCell.boundingBox();
const targetBbox = await targetPlaceholder.boundingBox();
if (sourceBbox && targetBbox) {
    await page.mouse.move(sourceBbox.x + sourceBbox.width / 2, sourceBbox.y + sourceBbox.height / 2);
    await page.mouse.down();
    await page.mouse.move(targetBbox.x + targetBbox.width / 2, targetBbox.y + targetBbox.height / 2, { steps: 10 });
    await page.mouse.up();
}

5. Capture browser console logs for debugging

Add at the start of the test:

page.on('console', msg => console.log('Browser console:', msg.text()));
page.on('pageerror', err => console.error('Browser error:', err));

6. Consider making drag tests more resilient or optional

Add a try-catch around the drag test section:

try {
    console.log('\n=== Undo/Redo: Move Unmatched Cell ===');
    // ... drag test code ...
} catch (error) {
    console.warn('Cell move test failed (known flaky in CI):', error.message);
    // Continue with other tests
}

Quick Fix to Unblock CI

The simplest short-term fix would be to skip the problematic drag test in CI:

if (!process.env.CI) {
    console.log('\n=== Undo/Redo: Move Unmatched Cell ===');
    // ... drag test code ...
} else {
    console.log('\n=== Skipping cell move test in CI (known flaky) ===');
}

Would you like me to help implement any of these fixes? The combination of stabilization delays (#1) and increased timeouts (#2) would likely be the quickest path to stability.

@Avni2000 Avni2000 changed the title Stabilize undo/redo flows and add history navigation controls [FEAT] Add undo/redo support with history panel Feb 8, 2026
@Avni2000 Avni2000 merged commit 3443476 into main Feb 8, 2026
2 checks passed
@Avni2000
Copy link
Owner

Avni2000 commented Feb 9, 2026

@coderabbitai make an issue so we can decide later whether or not to actually keep the cell drag option for unified cells as well. If so, we need to add a proper drop zone for it.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 9, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

@Avni2000: I'll create an issue to track this decision.


🏁 Script executed:

#!/bin/bash

# Create a GitHub issue for the cell drag decision
gh issue create \
  --repo Avni2000/MergeNB \
  --title "Decide whether to keep cell drag functionality for unified cells" \
  --body "## Context

In PR `#50`, we added undo/redo functionality and row-level drag support. During testing, we discovered that the cell drag option for unified cells needs further consideration.

## Decision Points

- Should we keep the cell drag option for unified cells?
- If yes, we need to add a proper drop zone for it to make the UX clear and consistent

## Background

The current implementation has drag-and-drop working but may need refinement for unified cells specifically. This came up during investigation of websocket closure issues in CI tests.

## References

- PR: https://github.com/Avni2000/MergeNB/pull/50
- Comment: https://github.com/Avni2000/MergeNB/pull/50#discussion_r

Requested by `@Avni2000`" \
  --assignee Avni2000

echo "Issue created successfully"

Length of output: 72


@Avni2000: I've created issue #57 to track the decision about cell drag functionality for unified cells. You can view it here: #57

The issue outlines the decision points and references this PR and discussion. You can refine the details as needed when you're ready to address it.


🧠 Learnings used
Learnt from: Avni2000
Repo: Avni2000/MergeNB PR: 0
File: :0-0
Timestamp: 2026-02-04T23:12:05.308Z
Learning: In src/tests/vscodeIntegration.test.ts: The integration test has verification gaps: it never directly checks the outputs array content (only execution_count), uses getCellSource() normalization which masks source format inconsistencies (string vs array), and derives expected cell values from data-cell attributes containing original cells rather than from resolver output.

Learnt from: CR
Repo: Avni2000/MergeNB PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-02-03T02:39:45.034Z
Learning: Applies to src/conflictDetector.ts : Implement cell-level diffing—show side-by-side or inline diffs for conflicting cells, not raw JSON lines

@coderabbitai coderabbitai bot mentioned this pull request Feb 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEAT] Allow ctrl + z/undo operations

2 participants