The sync step checked out the master the build started from. Fixes merged
on master while the tests ran made that master stale, so the push of the
"Preparation to X release" commit was rejected as non-fast-forward. The
step only warns about it, so the build stayed green while master missed
the released changelog section and What's New page, and the What's New
GitHub Pages site was not published. This happened for 2.48.0.
IdeaVim took Shift+Enter in the AIR prompt, so AIR's new line action never
ran and Insert mode couldn't break a line. Instead of special-casing single
keys, hand any key bound to an `Air.Chat.Prompt.*` action in the active
keymap to AIR, which also covers Enter, Ctrl+Enter and user rebindings.
Rider gets the state of a backend action (e.g. MoveElementRight or ReformatCode for C#) from the backend only for a real hotkey: when the last shortcut seen by the key dispatcher belongs to the action, it wraps the action into a composite that asks the backend. The synchronous tryToExecute goes through the same hotkey update but never gets there. After `:action` the last shortcut is Enter, so the action isn't wrapped, and after an `<Action>` mapping it is wrapped, but tryToExecuteNow updates the original action instead of the wrapped one. Either way only the frontend answers, it reports the action as disabled, and tryToExecute rejects it. The asynchronous tryToExecute updates the action the way a menu does, with an asynchronous request to the backend, so it gets the real state without blocking the EDT. The action then runs later, so executeAction can't tell whether it succeeded, but the backend's changes arrive later anyway.
The new Rider tests also cover the action cases fixed earlier (VIM-3376, VIM-3826, VIM-3861, VIM-3881) that had no Rider test. ReformatCode from a mapping no longer freezes Rider, so its disabled test is replaced by RiderReformatCodeTest, which runs in its own Rider in case it does again.
For a hotkey, Rider replaces its backend actions with a single RiderBackendCompositeAction, so IdeaVim's action listener sees the composite and not e.g. CommentByLineComment. The composite doesn't implement PossiblyDelegatingToBackendAction, so IdeaVim normalized the caret right away, before the backend applied the comment. The frontend took that caret move for a user change made while the request was pending and replayed it on top of the backend's changes, which put the caret back on the line just commented. The unit test didn't catch it because it simulates an action with the interface. The composite is internal to Rider and not available at compile time, so it's recognized by its class name, the same way the interface is.
claude-code-action sets origin to its GitHub App token and revokes it at
the end of its step, so the following push in "Record the release commit
the page describes" failed with "Invalid username or token".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The run reads untrusted ticket text, and `Bash(npx tsx:*)` allowed
`npx tsx -e` with YOUTRACK_TOKEN and the Anthropic key in the environment.
- Allow only the youtrack-cli scripts the prompt uses.
- Force every comment from this run to be private, so it can't publish
anything it read.
- Pass the dispatch input via env instead of interpolating it into `run:`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude reads untrusted text (PR comments, YouTrack tickets) while updating
the changelog, and its PRs were auto-merged, so a prompt injection could
reach master or leak secrets through `gh`.
- Claude can only edit CHANGES.md and use read-only git/gh commands; the
push token is not persisted in .git/config.
- A separate step opens the PR with GITHUB_TOKEN only if CHANGES.md is the
only changed file, dispatches PR verification for it and enables
auto-merge.
- Remove mergeClaudeChangelogPR.yml, Claude no longer opens these PRs.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- youtrackAutoAnalysis: pass step outputs (ticket summary, Claude-generated
statuses and attention reasons) to run scripts via env instead of
interpolating them into the script, so a crafted ticket summary can't
execute shell commands on the runner.
- mergeClaudeChangelogPR: auto-merge only PRs that change CHANGES.md alone,
and disable auto-merge if a later push touches other files.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Anyone could open a fork PR with the What's New title and inject a prompt
via a comment into a Claude run with repository write access.
- Run only for OWNER/MEMBER/COLLABORATOR comments, and verify the PR head is
JetBrains/ideavim:whatsnew-tbr and the commenter has write access.
- Claude can only edit whatsnew-tbr.html and CHANGES.md and has no
commit/push access; the push token is not persisted in .git/config.
- A separate step pushes the edits only if no other files changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sticky lines panel's height depends on the scroll position, so an exact middle doesn't always exist, and the old tolerance range let the previous position count as centred after every other k; instead, try the middle for each panel height we find and keep the closest position, staying put on a tie unless the caret moved to another line, so moves always scroll but typing never scrolls back and forth.
git rev-parse --show-toplevel resolves symlinks, so in /tmp on macOS matches pointed to /private/tmp and opened a second tab for files that were already open
IJPL-257728 removed intellij.platform.kernel, kernel.impl and kernel.backend
from the platform. On builds from master, IdeaVIM.ideavim-backend and both
bookmark backend modules declared a dependency on intellij.platform.kernel.backend,
so the platform skipped them silently. None of the remoteApiProvider extensions
got registered, and Commentary, Format and the other RPC calls failed with
"No remote API found".
IdeaVim doesn't use any class from these modules. The backend-only loading in
split mode is still provided by the dependency on intellij.platform.backend.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The platform reports the editor switch from closing the cmdwin only after the command has run, so redrawing for it closed the output the command had just shown.
`/` action was running intelij SpeedSearch which didin;t work on popups. to make it work there also we find speedsearch component and activate this one directly
Add possibility to disable pushing to primary register on selction change. Needed to disable platform primary publishing so mouse selection won't publish too.
Decide between centring, scrolling up and scrolling down in one place, and keep how we measure the window, in lines or in pixels when block inlays take up most of it, in WindowLines
Move the existing EditorHelper.kt top level functions to EditorHelperRt.kt, matching its JVM name, and group the scrolling code that adjusts for the sticky lines panel
The driver SDK's SelectionModel has no getSelectedText(Boolean) in 2025.3,
which broke the compilation of the ui-rd-tests module in the 2025.3 and
nvim jobs. Call it through our own remote interface instead.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
intellij.platform.rpc doesn't exist in 2025.3, is embedded in the core
classloader in 2026.1-2026.2 and is a standalone module since 2026.3.
Declaring it as a dependency of the embedded ideavim-common module disables
the whole plugin on 2025.3 and breaks the 2025.3 build.
Move the dependency to a new optional ideavim-rpc module that provides
VimRemoteApiResolver via the IdeaVIM.remoteApiResolver extension point.
When the module is skipped (2025.3), fall back to calling
RemoteApiProviderService from the core classloader.
For large files running search count blocked edt which caused IDE freezes.
Now we first try to quickly show coutn and if we are not able in given threshold move it to other thread and later on update UI accordingly.
Additionally added tests for large files
Our pipeline could mark issues on youtrack as fixed even if they were not in release branch.
Added single script for all pipelines to deremine which commits enetered given release so changelog, whats new and release itself are using exactly same logic
Composed text from dead keys and input methods was inserted into the document and replaced the Visual selection before IdeaVim saw the key, so we now drop it in Normal, Visual and Operator-pending modes and only let the committed character through, like Vim in a terminal.