The Push dialog's target branch field was free text only. It now completes
from the branches the chosen remote already has (typing, Up/Down, click; a
typed origin/ prefix is accepted). Prefix matches come first, then other
contiguous matches, then looser ones. Enter only takes a row once one was
chosen, free text still creates a new branch, and the "New" hint shows only
for a name the remote doesn't have. The list widens to the longest name up
to 640px, with the full name as a tooltip beyond that.
Co-authored-by: Veng0923 <+Veng0923@users.noreply.github.com>
A dev container's forwardPorts may name a port of another Compose service
("selenium:4444"). Those entries were skipped; they are now forwarded like the
container's own ports: the relay in the container connects to the service by
name, forwards are keyed by (host, port), and the Ports window shows them as
selenium:4444 -> localhost:4444. Service ports aren't saved with the ports added
by hand, since forwardPorts forwards them on every connection.
Refs #1083
Co-authored-by: andreabasile <7715018+andreabasile@users.noreply.github.com>
The JUnit run configuration type is called JUnit in every locale, a product
name like Docker; the catalog check that Chinese and Korean texts differ from
English now allows it.
The task's Changes pane gets Rollback: the selected files, or all of them, go
back to how they were when the task started, after a confirmation. Files the
user had already changed in the project's checkout when the task started are
copied aside then, so rolling back restores the user's own edits instead of
the last commit; files the agent created are removed. The copies stay with the
task (forks share them) and are removed with it. Rollback is refused while the
agent is working.
Refs #1777
Run/Debug Configurations gets a JUnit type: a module and its tests (all, a
package, a class, a method or class-name patterns) with VM options. It runs
through the module's detected Maven or Gradle test configuration with the same
arguments as the gutter's Run on a test, so results show in the test runner
and Debug and Rerun Failed Tests work as for those runs. VM options go to
Surefire as -DargLine, and to Gradle's test JVMs through the init script.
Closes#2515
Completion inside a version string under dependencies, devDependencies,
peerDependencies or optionalDependencies lists the package's versions from the
npm registry (abbreviated metadata, shared version cache), newest first,
without deprecated versions and without pre-releases when the package has
releases. Aliases, paths, URLs and workspace protocols are left alone; the
scanner tolerates a document being edited.
Closes#2558
Move Worktree… in the Worktrees dialog and the Git tool window's Worktrees
tab moves the selected worktree's folder into the chosen folder, or to it when
it already has the worktree's folder name. An empty folder at the target is
replaced (Git would move the worktree inside it) and any other existing target
is refused. The main worktree and the one holding the open project can't be
moved.
Closes#1238
MCP servers for coding agents are kept in OpenIDEA's own settings: User
(settings.toml) and Workspace (.openidea/settings.toml), where a workspace
server replaces a user server of the same name. Enabled servers that match the
session's agent and the transports it negotiated (stdio, http, sse) are passed
in session/new, session/load and session/fork alongside the IDE's own server.
Settings > Agents > Model Context Protocol (MCP) lists, adds, edits, enables
and removes them; Import copies .mcp.json and .vscode/mcp.json entries into the
workspace settings once without changing those files.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Convert to cURL and Copy copies the request at the caret as a cURL command with
the selected environment applied; pasting a `curl ...` command into a .http file
inserts the request it sends (headers, data variants, --json, -F multipart, -u,
-b, -A, -e, -G, POSIX and Windows line continuations). Add Environment to
Public / Private File opens the env file that applies to the request file,
creating it next to it when missing. The conversion lives in ide-http and
shares request preparation with running.
Refs #2435
Go to Declaration on a declaration shows its usages only when the answer was the
declaration alone; a plugin definition merged into it (the MyBatis XML statement of a
mapper method) turned it into a chooser and the callers became unreachable. An answer
containing the declaration at the caret now shows usages too.
Fixes#1745
A session tab restored with the project read its conversation while the agents
connection was still being set up; connecting then cleared the entry cache and
the tab kept spinning. The session now loads its conversation, subagent views and
changes once the connection is ready.
Fixes#2414
Co-authored-by: draylegend <16114644+draylegend@users.noreply.github.com>
On macOS 11 with the original Safari 14 the system web engine cannot parse the
Safari 16 bundle, and startup failed with only "Could not load startup script".
When the engine lacks Safari 16 features, the failure page now says the system
Safari (or WebKitGTK) is too old and how to update it.
Refs #2008
In a project with several Git repositories, Update and Push… on one repository's
current branch (Branches popup, Git Log branch menu, Git Log Update Selected) acted
on every repository because vcs.update / vcs.push were called without naming it.
They now pass the repository: only it is pulled, and only it is checked in the
multi-repository Push dialog. When the upstream branch was deleted on the remote,
the Push dialog lists the commits no remote branch contains instead of the last 50.
Co-authored-by: pdasilem <74730932+pdasilem@users.noreply.github.com>
af selects the function, method, constructor or lambda around the cursor and
if its body, from the syntax tree; whole-line functions are taken linewise, and
a repeat in Visual mode or a count takes the enclosing function. Mapped only in
Operator-pending and Visual mode, and restored after an rc reload.
Closes#2365
jdtls adds a generated source folder only when it exists at import, so code from a
later generate-sources stayed unresolved. The Maven tool window gets Generate Sources
and Update Folders For All Projects (toolbar, Find Action) and a per-project variant in
the context menu: it runs generate-sources and, once a run succeeds, reloads the Maven
projects. run.runConfig accepts an onExit callback so a feature can wait for the run.
Fixes#2508
Plugin line markers on the same line with the same resolved icon now render as one
gutter button; duplicate destinations from several providers are dropped and every
distinct target goes to the existing target chooser. Run markers and different icons
stay separate. The default `navigate` icon gets its own navigation glyph instead of
reusing the implementing-method one, as the WIT documents them as distinct icons.
Closes#2573
Co-authored-by: arnaud-ritti <77437157+arnaud-ritti@users.noreply.github.com>
Make the refactoring preview dialog (Rename, Safe Delete, Pull Up / Push Down) and the
Pull Members Up / Push Members Down dialog resizable. The preview had a fixed width and
a 320px list cap; the list now fills the dialog, the size is remembered and full paths
show as tooltips. The member table in the pull/push dialog takes the extra space.
Closes#2570
Project View › Options › Appearance gains Show Root Paths (on by default). Off, workspace roots and a single project's root show only their name; the path stays in the tooltip. Workspace roots now abbreviate the home folder as ~.
Fixes#2557
Debugging a configuration the Run feature starts with a JDWP agent (Maven, Gradle, Spring Boot, Tomcat, scripts set to the Java debugger) attaches the debugger to that process, and its output stayed in the Run tab while the Debug console was empty. The run feature now provides its sessions' output by process (`RunOutputService`), and a debug session attached to one follows it in its Console until the session is closed.
Fixes#2494
Plugins could not rely on each other: nothing said "this plugin needs that one", and a plugin had no way to let others extend it. Plugin API 1.5 adds both.
- `[[depends]]` in `plugin.toml` (version range, `optional`). A plugin whose required dependency is missing, disabled, the wrong version, cyclic or unable to run is shown as Blocked with the reason and starts once the dependency can run again. Plugins start in dependency order; disabling a plugin others need asks first. Granting or revoking a dependency's permissions also settles its dependents.
- `[[extension-points]]` declares points with typed fields. Dependents contribute to them from `plugin.toml` (checked at install time); the owner reads them through the read-only `extensions` interface (`host::extension_contributions`) and hears changes through the `extensions-changed` event.
The plugin details page shows what a plugin requires, who requires it, and its extension points with their contributors. Covered by the `ext-owner` fixture and `plugin_dependencies.rs`.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
`read-file` returns UTF-8 text only, so a plugin could not read a PDF, image, archive or font inside the open project, and `fs.read-bytes` needs a per-path grant. `workspace.project` gains `read-bytes(path)` with `read-file`'s rules (`project.read`, `resolve_in_root` confinement, `not-found` for missing paths, 16 MiB cap; always the file on disk). The Rust SDK exposes `Project::read_bytes` and the mock host `add_file_bytes`. Web custom editors get `document.bytes()` (at most 64 MiB, read-only).
Fixes#2347
Co-authored-by: Inf1mum <8135225+Inf1mum@users.noreply.github.com>
Two merged changes (#2568, #2572) each appended entries next to "Recent color", and the textual merge dropped the comma between them, so en.json and zh.json no longer parsed.
In the modal Local Changes view (Git tool window), double-click and Enter always opened the diff. `openNode` in `CommitView.tsx` ignored the commit interface. The modal view now opens the source file and the non-modal Commit tool window keeps the diff. A new `vcs.commit.doubleClickOpensDiff` setting (unset = follow the interface) is exposed as Show on Double-Click → Source / Diff / Follow the Interface.
Co-authored-by: aconeshana <52204454+aconeshana@users.noreply.github.com>
The Dependencies checklist offered every recently opened project as a candidate, which made the list long and noisy. A standalone project now lists only its configured dependency projects; in a workspace the other roots attached to the window stay candidates, and Add Project… picks a new one (the empty-state note says so).
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
The location choosers (Choose Declaration / Implementation and the gutter marker targets) showed the name, a source-line preview, the file name and often a full absolute path on every row. Rows now have one layout: icon + name, the declaring container, and `path:line` right-aligned.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Servers that answer implementation requests with nothing (Pyrefly) still know the subtypes in the type hierarchy. When a type's implementation batch comes back empty, the gutter asks `typeHierarchy/subtypes` and uses its answer for the ↓ marker. The ↑ marker on class declarations is dropped.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Colour swatches overlapped the Git change indicators, and the native colour picker could open at the window's top-left corner. The gutter spacing is adjusted and the native picker is replaced by a picker anchored beside the swatch (react-colorful) with screen sampling, a preview, recent colours and R/G/B/A%/HEX input. Markup files use the syntax tree, so colour-like template or HTML text no longer gets a swatch while embedded and inline styles still do.
Co-authored-by: ffgenius <106022674+ffgenius@users.noreply.github.com>
The Select In popup (Alt+F1) labels its first nine selectable rows 1–9, and pressing the digit activates the row. `MenuList`/`Menu` gained an optional `numbers` flag and `showContextMenu` an options argument; only Select In opts in, and submenus never inherit the numbering.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
The run, npm-script, HTTP-endpoint and bookmark gutters reserved a column even when a file had none of their icons, pushing the code right by an empty strip. Each now emits a zero-width, non-interactive spacer marker when it has nothing to show, so the column collapses; files with icons are unchanged. A shared `gutterSpacer` factory keeps the spacer from reacting to clicks.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
The Java language level settings offered only the LTS releases, and only those reached jdtls. Every level from 5 to 25 is now listed, and each maps to JDT's compliance value (1.5 to 1.8, then 9 to 25), so projects on 6 or 7 can be set up with a jdtls that still compiles them.
Fixes#2465
Workspace roots always sorted by name and only Maven/Gradle roots had a type icon. Project types are now detected from root build/SDK file names (no file contents or tools are read, up to four concurrent listings) through one registry (projectType.ts) that supplies names, icons, markers and refresh handling; roots show the type's icon, and Sort by Type groups roots by type with natural name order inside each type. Flutter and Vite logos come from Simple Icons (CC0, recorded in THIRD_PARTY_LICENSES.md).
Co-authored-by: shohruh-genius <7658451+shohruh-genius@users.noreply.github.com>
Docker Compose files get Compose Specification completion, hover and validation from yaml-language-server: languages/yaml.toml maps the pinned compose-spec schema to the standard Compose filename globs, and ide-sdk / ide-lsp feed content-detected Compose files and user overrides (Kept / Excluded as !path negations) into yaml.schemas, reconfiguring only when that set changes. The Compose editor completes and navigates (⌘-click / ⌘B) references to declared services, networks, volumes, configs and secrets in depends_on, links, volumes_from, extends.service, networks, volumes, configs and secrets.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
Double-clicking the title bar ran NSWindow zoom:, and WebKit doesn't lay the page out during an animated resize, so the window grew empty and the content appeared only at the end. The backend now steps the frame itself over 350 ms (smoothstep), waiting for each webview presentation (_doAfterNextPresentationUpdate:, checked with respondsToSelector: and falling back to a fixed 16 ms step), so the page grows with the window. A window restored maximized by the window-state plugin goes back through AppKit's unmaximize; the frame to restore to is kept in window-zoom.json so a window left zoomed at quit can still restore. Marker lanes recompute at most every 120 ms during resize bursts.
Closes#1448
Co-authored-by: IsGuibo <40512175+IsGuibo@users.noreply.github.com>
Settings › Project Structure › Dependencies lists other projects this one depends on (and, in a workspace, the roots each member depends on). Dependency projects join the content roots, so the index, Project view and run see them, and navigation resolves across them: nav_resolve_module maps an import path to a file in the file's navigation roots, and nav_index_definitions answers bare-name lookups filtered to those roots inside the index (so own-root matches can't evict dependency matches). navigation_roots is memoized for 1 s, and hand-written member_dependencies keys with the other path separator match on Windows.
Co-authored-by: muutot <92625353+muutot@users.noreply.github.com>
Oracle data sources now connect through the pure-Rust oracledb thin driver (pinned to 26.0.0-beta.5) instead of ODPI-C, so no Oracle Instant Client, ORACLE_HOME or Instant Client setting is needed; TNS descriptors and tnsnames.ora aliases still work in the Database field. The database tree gains a packages folder for Oracle schemas, and a package's DDL opens as its specification and body. The database guide's Oracle section is rewritten for the thin driver.
Co-authored-by: boenkkk <17746937+boenkkk@users.noreply.github.com>
Settings › Keymap › gear menu › Import IntelliJ IDEA Keymap… reads a keymap XML exported from IntelliJ IDEA (or one from its keymaps folder): the parent attribute picks the matching preset, IDEA action ids map through the table IdeaVim's :action uses (moved to src/platform/ideaActions.ts), Swing keystrokes, two-stroke chords and mouse shortcuts are converted, and the result is saved as a new custom keymap with a summary of actions that have no counterpart and skipped shortcuts.
Co-authored-by: ntbang0901 <121003585+ntbang0901@users.noreply.github.com>
Settings › Editor › General › Appearance › Rainbow indent guides (off by default, under Show indent guides): guide N is drawn in --syn-rainbow-((N-1) mod 5 + 1), so each level of a deep block has its own colour. With the per-guide strips this only swaps the image each guide uses (--openidea-guide-1…5 from theme.ts), so theme and scheme switches recolour open editors through CSS; code lens rows follow the setting.
Closes#1560
Co-authored-by: mansur-akhmadi <10739460+mansur-akhmadi@users.noreply.github.com>
Drawn Mermaid diagrams in the Markdown preview and agent replies get Full screen and Download image buttons. Full screen fits and centres the drawing, pans on drag and zooms with Ctrl/Cmd+wheel; Esc closes it. Download saves a 2x PNG on the editor background through the native save dialog. reid() moved to svgIds.ts so the full-screen copy reuses it.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
Annotate gutter lines get a background tint per commit, ordered from older (cool) to newer (warm) using the project colour tokens, and hovering highlights every line of that commit. Hovering a line opens a non-modal commit popup with the full hash (opens the commit in Git Log), author, date and the full message with issue and commit-hash links; commit metadata comes from the single-commit log fast path and is cached.
Co-authored-by: dengliu <5108773+dengliu@users.noreply.github.com>
The changes tree registered drag sources only for rows that already belonged to a changelist, so files under Unversioned Files could not be dragged. Drag sources and drop targets are now separate: every file or folder row drags, and dropping unversioned paths on a changelist runs Add to VCS (git add) before moving them into that list.
Co-authored-by: panda-student <71381346+panda-student@users.noreply.github.com>
On WebKit, CodeMirror drops the first keydown within 100 ms of compositionend (meant for the IME's own Enter). In Normal mode that key never reached Vim, and a printable key was written into the document — e.g. Korean ㄱ, switch to English, quick j. A single ASCII character that arrives as text input in that window now runs as a Vim key through vimKeyFromEvent (so <Space>, <CR> and langmap apply); a keydown that does reach the editor clears the window, and keys that type no text are still dropped.
Fixes#2562
Co-authored-by: rkdgusxo66 <26762981+rkdgusxo66@users.noreply.github.com>
A resize drag set document.body.style.cursor, so as soon as the pointer left the 1px handle the element under it (tree, editor, button) showed its own cursor mid-drag. The drag now holds the cursor on <html> with a data-drag-cursor rule that overrides descendant cursors, released on pointerup/pointercancel/window blur, with nested locks restoring the outer cursor. Tool-window gaps, split and stripe handles, the dialog resize grip and database / Git Log column resizing share it, and the handles use ew-resize / ns-resize throughout.
Co-authored-by: makise2060 <263516586+makise2060@users.noreply.github.com>
A Maven goal or Gradle task run from the build tool window carried the JAVA_HOME the build model had when the tree was built, and that value was frozen into the (persisted) temporary configuration, so correcting the JDK in Settings only took effect after a restart, or not at all. For IDE-generated build-tool configurations JAVA_HOME is now derived: Settings (the Maven runner JRE, the Gradle JVM) decide at each launch, a saved configuration drops the derived value, and a dead path no longer outlives its setting. Configurations of the user's own, and Tomcat's JDK field, keep their JAVA_HOME.
Fixes#2433
Co-authored-by: ppxb <17081240+ppxb@users.noreply.github.com>
Small upward scrolls while a reply streamed were still treated as being at the end, so each update pulled the view back down. Following pauses on upward wheel, touch or keyboard input before the browser scrolls, and queued updates can't resume it until the user scrolls down or jumps to the latest reply; streaming, resize and late diagram updates leave the viewport alone meanwhile.
Search Everywhere had a fixed 220px preview and a separate results height cap. It now has a remembered vertical split (initially one third results, two thirds preview); the query keeps focus while resizing and the active result stays visible when the list shrinks. Action names line up with file names, shortcuts stay readable, and scope controls move to a second row in narrow popups.
Find results and Show Usages use the native 16px file/folder icons, and the four search indicators share the 16px eight-spoke animation, replacing 12/14px overrides; the preview and rerun controls get their proper icons.
Run and Services test trees now use 16px status and filter icons and the shared eight-spoke running indicator. The fixed 11/13px glyphs made columns uneven, and a status change shifted the name; the running indicator now follows the tree's icon size.
The Name field was squeezed and the dialog overflowed in narrow or zoomed windows because the sidebar, label column and header controls had fixed widths. Add a remembered sidebar splitter, shared label columns, and wrapping Name/storage and footer groups; Before launch actions stay together and both panes keep scrolling independently when the dialog is resized.
Update could fail when incoming files collided with local untracked files and show nothing, because VCS popups were disabled. The shared Git command runners now mark progress and results as responses to a user command, so Update, Pull, Fetch, Push and local Git operations stay visible; background notifications and explicitly handled or cancelled failures stay quiet.