Skip to content

Repository files navigation

jumpy 🐸

Inspired by 99


imageimageimage

The main difference between jumpy and other tools, like 99, are:

featurejumpy99avante / sidekickcodecompanion inlineclaude code / aider
Interaction modelInline prompt → hunks in buffersearch / visual / vibe → qfix or inline replaceSidebar chat → applyInline edit → accept/rejectCLI agent → full file writes
Review granularityPer-hunk accept/rejectPer-result (search) or selection replace (visual)Per-file or per-suggestionPer-changePost-hoc (git diff)
Context switchNone: you stay in bufferMinimal; qfix for searchSidebar opensMinimalLeave editor or split terminal
LLM output formatSearch/replace blocksCLI provider output (opencode, claude, etc.)Full file / patchFull fileFull file via temp
Token efficiencyHigh (only changed lines sent back)Mode-dependent; visual is targetedLower (full context)LowerLower
ScopeSingle targeted editSelection edit, project search, agentic workMulti-file refactors, chatSingle edit or chatWhole-project agentic tasks

  • inline prompt: describe a change without leaving the buffer
  • selection-scoped edits: visually select a function (or any region) and prompt — the whole buffer is still sent as context so the model understands the surroundings, while it focuses on your selection
  • multi-line prompt + history: <C-CR> submits, <CR> adds a newline, <Up>/<Down> recall earlier prompts
  • async & parallel prompts: requests run in the background; each response lands in its own buffer (:JumpyCancel aborts everything in flight)
  • multi-file prompts: @mention several files in one prompt and review the cross-file hunks
  • search/replace hunks: the LLM returns only changed sections, not whole files
  • in-buffer diff review: proposed edits shown inline with accept/reject before anything is written
  • per-hunk control: accept, reject, or reprompt individual hunks
  • hunk navigation: jump between proposed changes with ]h / [h
  • quickfix integration: collect pending hunks across buffers into one list
  • session sidebar: a panel logging every prompt and its per-file hunk outcomes; jump to, accept/reject, and reprompt from one place (:JumpySidebar)
  • persistent sessions: sessions are saved per project root and can be reopened later (:JumpySessions)
  • @lsp context: pull workspace symbols into the prompt when needed
  • multi-provider: openrouter, openai, Anthropic API, Claude Code subscriptions

Install

-- lazy.nvim
{
"cachebag/jumpy",
config=function()
require("jumpy").setup({
provider="anthropic", -- or "openai", "openrouter", "claude_code"
})
end,
}

Set your API key: export ANTHROPIC_API_KEY="sk-ant-..." (or OPENAI_API_KEY, JUMPY_API_KEY for openrouter).

Claude Code / Max

Claude Pro and Max subscribers can use Jumpy without an API key. Install Claude Code, run claude login, then:

require("jumpy").setup({
provider="claude_code",
model="sonnet", -- optional: uses your Claude Code model selection
})

Jumpy runs Claude Code non-interactively (tools, MCP servers, and session persistence disabled) and remains the only process that can apply changes. It removes ANTHROPIC_API_KEY from the child process so an inherited key cannot switch a subscription user to API billing. Set claude_code_command if claude is not on PATH.

Use

KeybindAction
<leader>jOpen prompt
<C-CR>Submit prompt (insert mode); <CR> inserts newline
<CR>Submit prompt (normal mode)
<Up> / <Down>Cycle prompt history (session)
]h / [hNext / previous hunk
<leader>aAccept hunk
<leader>xReject hunk
<leader>AAccept all hunks
<leader>XReject all hunks
<leader>rReprompt the hunk under cursor
<leader>qReview pending hunks in quickfix
<leader>sToggle the session sidebar

In the quickfix list, a accepts and x rejects the selected hunk, advancing to the next pending hunk (including hunks in other files). :JumpyCancel cancels every request currently in flight.

Session sidebar

:JumpySidebar (<leader>s) toggles a panel logging every prompt and the hunks it proposed, with each hunk's status. :JumpySessions reopens a saved session (sessions are persisted per project root under stdpath("data")/jumpy/sessions/; reopened ones are read-only).

Cycle through a session's hunks with <Tab> / <S-Tab>: each one is previewed in the buffer with a yellow inline before/after overlay — including hunks you've already accepted — so you can see exactly what changed without leaving the sidebar.

Configure where it opens (handy if a left-side file tree is in the way):

require("jumpy").setup({
sidebar= {
position="left", -- or "right"width=42,
},
})
KeyAction
<CR>Open the file + hunk under the cursor (focus the editor)
<Tab> / <S-Tab>Cycle to the next / prev hunk and preview it inline
a / xAccept / reject the hunk (or all pending on a file)
rReprompt the hunk under the cursor
RClear the current session
q / <Esc>Close the sidebar

Contributing

See CONTRIBUTING.md.

License

MIT

About

Min-maxing AI assisted programming.

Resources

Contributing

Stars

26 stars

Watchers

1 watching

Forks

Releases

Contributors

Languages