Replace markdown-to-slack library with Claude Code CLI for generating
Slack messages. This simplifies the code and adds retry logic where
Claude analyzes Slack errors and fixes the message format.
Changes:
- Add callClaudeCode() to shell out to `claude --print`
- Add sendToSlackWithRetry() with 3 retry attempts
- Add dry-run mode (4th argument) for testing
- Add slackNotificationTest gradle task
- Add TeamCity build config for testing
- Remove mark-down-to-slack dependency
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Only update the workflow-changelog tag if the Claude step completes
successfully, preventing tag advancement on failures.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updated build.gradle.kts changeNotes section to reflect the [To Be Released]
content from CHANGES.md:
- VIM-4097: Fixed NextOccurrence with backslashes
- VIM-4094: Fixed UninitializedPropertyAccessException
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Replace reference to deleted changelog-instructions.md with
the changelog skill for loading maintenance instructions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add changelog entries for version 2.28.0 and upcoming fixes.
Restore structured changelog format after previous simplified approach.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move changelog maintenance instructions from a standalone markdown file
to a proper Claude Code skill that is auto-detected when updating the
changelog.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Enables automatic JDK toolchain resolution from the Foojay API when
a required toolchain version is not installed locally.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace fragile 'yole' marker with section header constants
- Add isJetBrainsEmployee property to Author (checks @jetbrains.com)
- Route JetBrains employees to "Contributors with JetBrains IP:" section
- Extract emails from entire file to prevent duplicates across sections
- Add unit tests for author adding logic
- Remove markdown parser dependency for section finding
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add new section "Contributors with JetBrains IP" to track contributors
who have assigned intellectual property rights to JetBrains
- Add "(JetBrains employee)" notes to maintainer entries
- Remove duplicate contributor entries
- Move JetBrains employees and contractors from Contributors to the
new IP section to avoid duplication
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The license awards program for quality contributions has ended.
Removed references from CONTRIBUTING.md, build.gradle.kts changeNotes,
and maintenance-instructions.md.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Rewrite ParagraphMotion extension using the new VimApi DSL instead of
the legacy VimExtensionFacade API. The functionality remains identical.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
In very nomagic mode (\V), backslash still has special meaning and
introduces escape sequences. When selected text contained a backslash
(e.g., \IntegerField), it was interpreted as a regex atom instead of
a literal character.
The fix escapes backslashes in the search text before building the
pattern, ensuring literal matching.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Use lazy initialization for logger to avoid accessing injector during
static class initialization when the service is loaded.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Remove selection parameter from updateCaret - selection now extends
automatically if present, matching Vim's native cursor movement behavior.
- Remove selection: Range.Simple? parameter from updateCaret
- Add mode-aware range validation ([0, fileSize) vs [0, fileSize])
- Remove selection-related tests that are no longer applicable
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Range.Simple and Range.Block now always have start <= end
- Document that ranges are normalized with exclusive end semantics
- Normalize Range.Block by using min/max on vimSelectionStart and offset
- Add tests verifying ranges are normalized regardless of selection direction
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Change Range.Block from storing an array of per-line ranges to using
simple start/end offsets, matching how block selection is stored
internally in VimBlockSelection. The conversion to per-line ranges
now happens internally in CaretTransactionImpl.
Changes:
- Range.Block now uses (start: Int, end: Int) like Range.Simple
- Add replaceTextBlockwise(Range.Block, String) overload for single text
- Update CaretReadImpl to return block start/end from primary caret
- Add blockToLineRanges() helper in CaretTransactionImpl
- Update ReplaceWithRegisterNewApi to use simplified API
- Add 17 new tests for block selection and replacement
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Added comprehensive test coverage for all ExitCommand variants that were
previously untested. The ExitCommand implementation supports multiple
command aliases (qa/qall, xa/xall, wqa/wqall, quita/quitall), but the
test suite only covered qa and qall.
Changes:
- Added tests for xa and xall commands (exit all, with save)
- Added tests for wqa and wqall commands (write quit all)
- Added tests for quita and quitall commands (alternative quit all spelling)
- Added assertPluginError(false) checks to all tests to ensure commands
execute without errors, following the pattern used in similar test files
This ensures all command variants are properly tested and prevents
regressions in any of the exit command aliases.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Changed incorrect abbreviation "e.q." to the correct "e.g." (exempli gratia)
in a comment explaining change command behavior in MotionWordEndAction.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add environment("YOUTRACK_TOKEN", youtrackToken) to JavaExec tasks
that use YouTrack API: releaseActions, eapReleaseActions,
updateYoutrackOnCommit, integrationsTest, and updateChangelog.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add extension functions for creating plugin mappings in specific modes:
- nmapPluginAction: normal mode
- vmapPluginAction: visual and select modes
- xmapPluginAction: visual mode
- smapPluginAction: select mode
- omapPluginAction: operator-pending mode
- imapPluginAction: insert mode
- cmapPluginAction: command-line mode
Each function checks if a mapping already exists for that specific mode
before adding, allowing users to override default mappings per-mode.
Also update mapPluginAction to check each mode individually instead of
using the generic hasmapto check.
- Update MappingScope documentation: v* functions now correctly
documented as "visual and select modes", x* functions as "visual mode"
- Fix MappingScopeImpl: vmap, vnoremap, vunmap, vhasmapto now operate
on both MappingMode.VISUAL and MappingMode.SELECT
Fixed missing space after colon in CommandLineReadImpl class declaration
to comply with Kotlin coding conventions.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>