Repository navigation
feat(ui): drag-and-drop Git actions (DAN-90) - #158
Merged
Merged
Conversation
This was referenced Oct 19, 2026
danielss-dev
marked this pull request as ready for review
October 19, 2026 15:30
danielss-dev
force-pushed
the
developements/drag-and-drop-git-actions-7781
branch
from
October 19, 2026 15:30
01bd0a7 to
aecd3f9
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linear: https://linear.app/daniels-dev/issue/DAN-90/strand-drag-and-drop-git-actions
Common Git operations can be done by dragging. Every drop stops on a confirmation that names the source, the target, and the operation. Escape cancels with no checkout and no Git write. Keyboard and menu commands are unchanged and call the same functions.
Slices
Out of scope: dragging changes or hunks into commits.
Menu and palette equivalents
MergeDialog.Repo::rebaseafter its confirm.Repo::push_branch.MainlineDialog.sinRebaseEditor.Proof
finishDrag(session, false)inui/src/lib/gitDrag.test.ts, and the demo session closed every confirm with Escape before any further action. A no-drop release also confirms nothing.ui/fixtures/gitDrag.fixture.test.tsrun the drag argv against real git and compare it to the menu command: feature onto main Merge (git merge --no-edit -- feature), Rebase (git rebase -- feature), the swapped direction after checkout, push of feature onto origin with--set-upstream(branch.feature.remote=origin,branch.feature.merge=refs/heads/feature), cherry-pick, and a prefilled rebase todo for reorder and squash.meta.operationis merge or rebase. A commit off the linear tip, a drop onto itself, and a reorder that would not move anything also resolve to null.ui/src/lib/gitDrag.test.tsandui/src/lib/rebase.test.ts.pnpm --filter ./ui test— 106 files, 653 tests, green.pnpm --filter ./ui exec tsc --noEmit— green.The confirm shots below were taken after
popInandfadeInfinished. The first set was captured on the frame those animations were still at opacity 0, which let the graph show through. The dialog is the sharedDialogshell: opaquevar(--bg-panel)and the samepalette-backdropas the other confirms.Merge or rebase confirmation after dropping feature/auth-retry on main
Push confirmation offering to set origin/spike/edge-runtime as upstream
Cherry-pick confirmation naming the commit and main
Interactive rebase editor prefilled to squash one commit into another
No-drop cursor while dragging main onto itself
To show artifacts inline, enable in settings.
Review fixes
commitIndexfor bothdata-git-indexand the selection.MergeDialog/MainlineDialogtake awrapstep instead ofprepare.gitDrag.test.ts.meta.operation. It switches back only when nothing is in progress. Otherwise it stays on the target branch and says the operation is paused there. It also stays when the state can't be read, and a detached start says where it was left.commitIndexByHash(graph rows minus stash rows) is extracted forCommits.tsx. The stash-index test now uses interleaved stash rows.Merge order 157 → 153 → 155 → 154 → 156 → 158: this PR merges last. It must adapt to #155's
rebase(onto, updateRefs)andRebaseOntoDialog, #154's ApprebaseDialogstate, and #156'sCommits.tsxattribute.