Commit Graph
100 Commits
Author SHA1 Message Date
Alex PlateandClaude Opus 4.7 45ce2143fe Fix(VIM-4115): NPE in CommandKeyConsumer after plugin disable/enable
Plugin deactivate called fullReset() on the ex panel but left editor
mode and KeyHandlerState.commandLineCommandBuilder untouched. Since
KeyHandler is a singleton, the stale CMD_LINE builder survived a
plugin disable/enable cycle and matched LeaveCommandLineAction on the
next Esc, NPEing when the (already-deactivated) panel was unwrapped.

Call close() before fullReset() so mode, the key handler state, and
the panel are cleared together. Also replace the `!!` at the crash
site with a null-safe branch that logs VIM-4115 and clears the stale
builder, so any other producer of the same desync surfaces via a
Diogen report instead of a crash.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 16:07:48 +03:00
Alex PlateandClaude Opus 4.7 81bf421436 Auto-merge Claude-generated changelog PRs
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 14:39:34 +03:00
Alex PlateandClaude Opus 4.7 9c4f6d0989 Remove .beads/ directory
This project uses YouTrack for issue tracking, not Beads.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 17:22:52 +03:00
Alex PlateandClaude Opus 4.7 9dd2b7c743 Fix(VIM-4180): ReplaceWithRegister no longer overrides user remaps
Delayed extension init runs after .ideavimrc, so the plugin's default
`nmap gr`/`nmap grr`/`vmap gr` used to clobber user mappings. Switch to
`nmapPluginAction`/`vmapPluginAction` which guard on `hasmapto`, matching
the original Vim plugin's behavior.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 15:34:31 +03:00
Alex PlateandClaude Opus 4.7 ddfcf07735 Add multi-caret regression tests for argtextobj and textobj-indent
Guard against VIM-4193 regressing again: both plugins are back on the
pre-migration TextObjectActionHandler API, so multi-caret daa/dia/dii
works today. If either plugin is re-migrated to the new TextObjectScope
API before it grows a per-caret read primitive (withCurrentCaret or
equivalent), these tests will fail loudly instead of the bug sneaking
through silently.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:46:35 +03:00
Alex PlateandClaude Opus 4.7 9ea5116bf4 Revert VimIndentObject plugin migration to new VimApi
Same per-caret gap as the argtextobj revert (VIM-4193): the new
TextObjectScope rangeProvider lambda has no way to read state for the
caret currently being iterated, so the post-migration version falls
back to withPrimaryCaret and breaks multi-caret ai/aI/ii.

Restore VimIndentObject.kt to its state just before a6db9acd7
("Refactor: Migrate VimIndentObject extension to new VimApi"), keeping
it on the old TextObjectActionHandler-based API until the new API
exposes a per-caret read primitive.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:46:35 +03:00
Alex PlateandClaude Opus 4.7 ac53a63adb Revert argtextobj plugin migration to new VimApi
Pending a fix for the current-caret gap in the new TextObjectScope API
(VIM-4193): the rangeProvider lambda has no way to know which caret the
engine is currently iterating over, so the post-migration extension
falls back to withPrimaryCaret and breaks multi-caret daa/dia.

Restore VimArgTextObjExtension.kt to its state just before 86bf54d84
("Migrate argtextobj extension to new textObjects API"), keeping it on
the old TextObjectActionHandler-based API until the new API exposes a
per-caret read primitive.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:46:35 +03:00
Alex PlateandClaude Opus 4.6 2b1bee3c9c Fix thinapi test compilation errors with runBlocking
After the K3 coroutine audit made VimApi methods suspend,
these tests were not updated to wrap calls in runBlocking.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 608e41bfaa Move Plugin API docs under api/ subfolder
Part of the VimApi freeze decision (VIM-4161).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 609f9b9be8 Revert Exchange plugin migration to new VimApi
Part of the VimApi freeze decision (VIM-4161). Reverting the
partial migration to keep Exchange fully on the old API.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 a81cfa67f0 Migrate Exchange highlight from RangeHighlighter to HighlightId
Replace RangeHighlighter field in Exchange with HighlightId. Use
injector.highlightingService for adding/removing highlights instead
of direct markupModel access. Update Util.clearExchange to take
VimEditor. Update test assertHighlighter to check markup model
directly (area validation lost — tracked with TODO).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 06d75c1170 Simplify highlight endAdj condition in Exchange
The old condition `!isVisualLine && (hlArea == EXACT_RANGE || isVisual)`
was equivalent to `ex.type != LINE_WISE` because when !isVisualLine is
true, hlArea is always EXACT_RANGE, making the isVisual branch
unreachable. Pure logic simplification, no behavior change.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 65c5f5eadd Migrate all Exchange mappings to nmapPluginAction/xmapPluginAction
Replace separate nnoremap+nmap/putExtensionHandlerMapping+putKeyMappingIfMissing
with the combined nmapPluginAction/xmapPluginAction helpers for all four
mappings (cx, cxx, cxc, X). Remove ExchangeClearHandler and VExchangeHandler
classes; their logic is now in top-level bridge functions that still delegate
to the old Operator/Util code.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:54 +02:00
Alex PlateandClaude Opus 4.6 6c9f711b51 Refactor Exchange data class to use offsets and line/col instead of Mark
Preparation for new API migration: Exchange now stores startLine/startCol/
startOffset/endLine/endCol/endOffset directly, removing dependency on the
internal Mark type. All comparison and cursor logic updated accordingly.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:53 +02:00
Alex PlateandClaude Opus 4.6 6613a3284c Migrate Exchange N-mode handler (cx, cxx) to new VimApi
Replace ExchangeHandler class with suspend fun VimApi.exchangeAction()
and register via initApi.mappings { nnoremap/nmap }.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:53 +02:00
Alex PlateandClaude Opus 4.6 9d35c748c2 Switch Exchange extension to init(initApi: VimInitApi) signature
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:53 +02:00
Alex PlateandClaude Opus 4.6 f0c9c6d16b Reorganize VimApi into scopes with dual-access pattern
Move loose functions from VimApi into dedicated scope interfaces
(VariableScope, CommandScope, TabScope, StorageScope, TextScope)
and update existing scopes (mappings, textObjects, outputPanel,
digraph, commandLine) from default-empty-lambda to two-function
pattern: lambda `fun <T> scope(block: X.() -> T): T` plus
direct-object `fun scope(): X`.

VIM-4158

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:53 +02:00
Alex PlateandClaude Opus 4.6 9afdd838ba Remove speckit files and spec documents
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 18:31:53 +02:00
Alex PlateandClaude Opus 4.6 70fce5ab2b Migrate Commentary N/X operator mappings to new API
Replace putExtensionHandlerMapping(MappingMode.NX, ..., CommentaryOperatorHandler)
with initApi.mappings { nnoremap/xnoremap("<Plug>Commentary") { ... } }.

Remove CommentaryOperatorHandler class (logic inlined into mapping lambdas).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 90c642ccfe Switch Commentary to init(initApi: VimInitApi) signature
No behavior change — just switches from the old init() to
init(initApi) so we can incrementally migrate to the new API.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 b0a45d47c5 Extend command() API to pass ex-command range to handler
The command() handler now receives startLine and endLine (0-based)
from the resolved ex-command range. Previously the range was received
by the internal CommandAliasHandler but discarded before reaching the
plugin lambda.

Also fix using editor.projectId instead of the VimApiImpl's own
projectId, so the handler resolves the correct editor context.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 653721f13e Mark K3 coroutine audit complete in tasks.md and research.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 696a810ab0 K3-8b: Make methods in non-locking scopes suspend
Per VIM-4144 coroutine audit: methods inside non-locking scopes
(OptionScope, DigraphScope, OutputPanelScope) should be suspend
for RemDev future-proofing. Updated interfaces, implementations,
and extension functions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 f12e6cc51e K3-5: Update KDoc for lock-acquiring openers (read/change)
Per VIM-4144 coroutine audit: read/change functions stay non-suspend
(Kotlin contracts don't support suspend, and they're already callable
from the suspend editor {} block). Block parameters stay non-suspend
(inside locks). Updated stale KDoc that referenced Deferred/Job.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:52 +02:00
Alex PlateandClaude Opus 4.6 7b99c43a98 K3-4+7: Make scope openers and flat VimApi methods suspend
Per VIM-4144 coroutine audit:
- Group 4: Scope-opening functions (editor, forEachEditor, commandLine,
  option, outputPanel, digraph, modalInput) become suspend with suspend
  block parameters
- Group 7: Flat VimApi methods (normal, execute, saveFile, closeFile,
  tab ops, data ops, pattern ops, camel ops) become suspend
- Excluded: properties (mode, tabCount, currentTabIndex), getVariable,
  setVariable, exportOperatorFunction per earlier decisions
- Updated VimApiImpl overrides accordingly
- Fixed extension code (argtextobj, miniai, paragraphmotion,
  replacewithregister, textobjindent) to propagate suspend through
  helper functions

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:51 +02:00
Alex PlateandClaude Opus 4.6 28a405a9ff K3-3g: Make CommandLine input callback suspend
Per VIM-4144 coroutine audit: handler lambdas should be suspend
for RemDev future-proofing. Implementation uses runBlocking bridge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:51 +02:00
Alex PlateandClaude Opus 4.6 7c66224d17 K3-3f: Make modal input handlers suspend
Per VIM-4144 coroutine audit: handler lambdas should be suspend
for RemDev future-proofing. Implementation uses runBlocking bridge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:51 +02:00
Alex PlateandClaude Opus 4.6 eb9d698f2a K3-3d: Make command handler suspend, add command() to VimInitApi
Per VIM-4144 coroutine audit: handler lambdas should be suspend
for RemDev future-proofing. Also exposes command() at init time.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:51 +02:00
Alex PlateandClaude Opus 4.6 0f7ea73c73 K3-3b: Make text object range provider suspend
Per VIM-4144 coroutine audit: handler lambdas should be suspend
for RemDev future-proofing. Implementation uses runBlocking bridge.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:51 +02:00
Alex PlateandClaude Opus 4.6 efc5f0140f K3-5': Remove suspend from CommandLineTransaction methods (inside lock)
Per VIM-4144 coroutine audit: methods inside locks must be synchronous.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:50 +02:00
Alex PlateandClaude Opus 4.6 f7af2631e9 T010-T014: Remove mode-changing methods from VimApi, use normal() instead
Remove enterInsertMode(), enterNormalMode(), enterVisualMode() from VimApi.
Mode changes should use normal() — e.g., normal("<Esc>"), normal("i"),
normal("v") — matching how real Vim plugins handle mode transitions.

Neither Vim nor Neovim has a direct "set mode" API. All mode changes in
real plugins (surround, exchange, commentary, ReplaceWithRegister) use
normal!, feedkeys(), or :stopinsert. The removed methods used incomplete
internal delegation (changeMode Level 2) that skipped proper entry/exit
setup (marks, strokes, dot-repeat, document listeners).

Also removes the now-unused changeMode() function from Modes.kt.

See VIM-4143 for future proper mode-changing API design.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:50 +02:00
Alex PlateandClaude Opus 4.6 f80120db5c T005d: Comment out window management APIs pending IJPL-235369
After setAsCurrentWindow(), getSelectedTextEditor() returns stale data
because the platform propagates the change asynchronously via
flatMapLatest + stateIn, and there is no way to observe when
propagation completes.

Comment out window APIs in VimApi, VimApiImpl, CaretRead, CaretReadImpl.
Add limitation comment to VimWindowGroup. Update EditorContextTest to
call injector.window directly. Track re-enablement in VIM-4138.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:50 +02:00
Alex PlateandClaude Opus 4.6 9072761043 Mark T006 as complete in tasks.md
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:50 +02:00
Alex PlateandClaude Opus 4.6 6889ba37c5 T006: Add VimInitApi delegation wrapper for init-time type safety
Introduce VimInitApi as a restricted wrapper around VimApi that exposes
only init-safe methods (getVariable, mappings, textObjects,
exportOperatorFunction). During plugin init() there is no editor context,
so editor operations should not be callable. VimInitApi enforces this at
the type level via delegation rather than inheritance.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:50 +02:00
Alex PlateandClaude Opus 4.6 918e525d26 T005c: Add EditorContextTest for editor context tracking
Verify that getSelectedEditor(projectId) correctly tracks the active
editor. After opening a new editor in a split window, VimApi's
editor { read { ... } } returns data from the newly selected editor.

Also update tasks.md: mark T005, T005b, T005c complete; drop T007,
T008 per VIM-4122 ADR; mark T009 as already done.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:49 +02:00
Alex PlateandClaude Opus 4.6 22ad32103e T005b: Replace getFocusedEditor() with getSelectedEditor(projectId)
Use FileEditorManager's selected editor (internal model) instead of
focus-based detection. Falls back to injector.fallbackWindow when
projectId is null (init phase, project loading).

- Add getSelectedEditor(projectId) to VimEditorGroup interface
- Implement in EditorGroup.java using FileEditorManager
- Convert all thinapi scope impls from objects to classes accepting projectId
- Fix exportOperatorFunction to use execution-time editor.projectId
  instead of init-time captured null
- Update all thinapi mock tests to mock fallbackWindow and restore
  injector before tearDown
- Update CaretTransactionTest to use real projectId

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 18:31:49 +02:00
Alex PlateandClaude Opus 4.5 5d985ef862 T005b: Add projectId parameter to VimApiImpl for editor context
Add projectId to VimApiImpl and propagate through scope implementations.
This is a pre-refactoring step before switching from getFocusedEditor()
to getSelectedEditor() API.

- VimApiImpl: Add projectId parameter (nullable), with KDoc explaining
  that it's null during init and falls back to fallback editor
- Scope implementations: Pass projectId through construction chain
- MappingScopeImpl, TextObjectScopeImpl: Get projectId from editor
  at execution time via editor.projectId
- Tests: Pass null for projectId (no editor context in setup)
- Remove VimApi.kt extension function (no longer needed)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:49 +02:00
Alex PlateandClaude Opus 4.5 33f219c6d8 T005a: Pre-construct VimApi and pass to extension init method
- Add init(VimApi) experimental method to VimExtension interface
- Make init() a default empty method for backward compatibility
- Create VimApi in VimExtensionRegistrar and pass to extensions
- Migrate 7 extensions from api() to init(api: VimApi) pattern:
  MiniAI, VimTextObjEntireExtension, VimIndentObject,
  VimArgTextObjExtension, ParagraphMotion, ReplaceWithRegister

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:49 +02:00
Alex PlateandClaude Opus 4.5 2032480cac Fix(VIM-1705): use selected editor during macro playback
During macro execution, commands like <C-w>h can change the active
editor. Previously, the editor was captured once at macro start and
reused for all keystrokes, causing window-switching commands to
have no effect on subsequent operations.

Now we re-query FileEditorManager.selectedTextEditor on each keystroke
to get the currently selected editor.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:49 +02:00
Alex Plate fc679a4959 Remove try catch for potemkin progress
It's not necessary to explicitly catch the cancellation exception and return on that. Moreover, it's wrong not to re-throw the ProcessCanceledException
2026-03-20 18:31:48 +02:00
Alex PlateandClaude Opus 4.5 835e9f3226 T004: Define API scope as editor-only
Decision: VimApi works in editor context only, not IDE-wide.
See YouTrack ADR for full rationale.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:48 +02:00
Alex PlateandClaude Opus 4.5 374ac851fc Add T005: document editor obtaining strategy for K1
New task to understand and document how to obtain editors reliably:
- Why focused approach is unreliable (global state, can change mid-op)
- Normal case: capture at shortcut entry point
- Edge cases: macros with :wincmd, API commands that switch windows

Renumbered all subsequent tasks (now 82 total).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:48 +02:00
Alex PlateandClaude Opus 4.5 eef7d17a59 Prioritize K1 Editor Context Fix over State Update Safety
Swap K1 and K2 in Phase 2 tasks - editor context is more critical.
Add decision task T004 to define API scope (IDE-wide vs editor-only).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:48 +02:00
Alex PlateandClaude Opus 4.5 821f281025 Refactor tasks.md: convert research tasks to actionable tasks
- Remove Phase 2 (Foundational) - all tasks were research already in plan.md
- Renumber tasks T004-T081 across 6 phases (was 7 phases, 94 tasks)
- Convert "Verify X" tasks to "Write test: X" (T026-T033)
- Convert "Review/Audit" tasks to specific implementation tasks
- Convert "Evaluate/Document" tasks to "Skip" with clear reason
- Remove duplicate tasks (extension list, test requirements)
- Update phase dependencies and parallel opportunities

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:48 +02:00
Alex PlateandClaude Opus 4.5 563a46bffc Complete Phase 1: Setup tasks for API layer
Verified API module structure, documented VimApi interface methods,
and identified all VimExtensionFacade usages requiring migration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:47 +02:00
Alex PlateandClaude Opus 4.5 3646a5b419 Address specification analysis findings
- Document TeamCity CI compatibility checker in spec, plan, and tasks
- Enhance T038 with specific Vimscript execution test cases
- Enhance T039 with specific variable scope test cases
- Add T043a for vim-engine separation verification

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:47 +02:00
Alex PlateandClaude Opus 4.5 b235a04970 Add API layer implementation tasks
94 tasks organized by user story:
- US4 (API Finalization): 24 tasks for K1-K4 issues and G1-G4 gaps
- US1 (Complete API): 14 tasks for API module completeness
- US2 (Internal Migration): 24 tasks for built-in extension migrations
- US3 (External Experience): 18 tasks for documentation and external plugin PRs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-20 18:31:47 +02:00
Alex PlateandClaude Opus 4.6 d0103f1cef Register new dependent plugins for compatibility checks
Add gg.ninetyfive, com.github.pooryam92.vimcoach, lazyideavim.whichkeylazy,
and com.github.vimkeysuggest to known plugins list and TeamCity compatibility job.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 08:14:57 +02:00
Alex PlateandClaude Opus 4.6 9bef9a2ab1 Add git-workflow skill with commit, branch, and PR conventions
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 18:45:41 +02:00
Alex PlateandClaude Opus 4.6 4f611c47d4 Update changelog rules: exclude Vim Everywhere project
This project (including Hints toggle) is not yet ready for public
changelog entries.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 14:28:26 +02:00
Alex PlateandClaude Opus 4.5 a0059f9e26 Amend constitution v1.2.2: prefer feature branches with frequent rebasing
- Feature branches SHOULD be used for development work
- Feature branches MUST be rebased to master frequently (e.g., daily)
- Update API layer spec and plan to use feature branch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:37:27 +02:00
Alex PlateandClaude Opus 4.5 36f522a822 Update API layer to trunk-based development, amend constitution v1.2.1
- spec.md, plan.md: Change from feature branch to master (trunk-based)
- constitution.md: Expand branch selection guidelines
  - Long-running features develop on master to avoid divergence
  - Short-lived changes may use feature branches
  - Planning must analyze scope to determine branch strategy

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:30:21 +02:00
Alex PlateandClaude Opus 4.5 89f81058a3 Amend constitution to v1.2.0 (trunk-based development)
Add Principle VIII: Trunk-Based Development
- Master branch as trunk, always release-ready
- Prefer direct commits to master when safe
- Feature branches for long-running work
- Rebase-only integration (no merge commits)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:25:56 +02:00
Alex PlateandClaude Opus 4.5 140a04f461 Add API layer implementation plan and research
- plan.md: Implementation plan with 4 phases covering API finalization,
  internal migration, external plugin migration, and stabilization
- research.md: Design decisions for critical issues (K1-K4) including
  state update safety, editor context, coroutines, and test accessibility
- Updated migration status: 4 extensions fully migrated (textobjentire,
  textobjindent, paragraphmotion, miniai), 2 partial, 8 remaining

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:20:50 +02:00
Alex PlateandClaude Opus 4.5 4038238620 Clarify API layer spec: external plugins and deprecation
Clarifications from /speckit.clarify session:
- External plugins: Use list from doc/IdeaVim Plugins.md, re-research
  before migration to ensure completeness
- Deprecation: No harsh deprecation; approach defined after successful
  external plugin migrations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:01:58 +02:00
Alex PlateandClaude Opus 4.5 6c421bbe14 Add API layer feature specification
Defines requirements for IdeaVim extension API layer:
- Complete API module exposing all extension functionality
- Internal plugin migration to validate API design
- External plugin support with team-provided migration PRs
- API safety (state updates, editor context, test accessibility)

Based on prior Mia API analysis and design decisions:
- XML-based extension registration (not @VimPlugin annotation)
- Listener/event API deferred to future version

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:50:49 +02:00
Alex PlateandClaude Opus 4.5 090dcc38fe Amend constitution to v1.1.0 (new principles + commit clarity)
Added principles:
- V. External Contributors: Recognizes community contributions
- VI. Documentation Goals: Commits to improving code documentation
- VII. Architecture Decision Records: ADRs tracked in YouTrack

Expanded:
- IV. Code Quality Standards: Added commit clarity requirements

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:50:45 +02:00
Alex PlateandClaude Opus 4.5 58a865ecca Add IdeaVim project constitution v1.0.0
Establish project governance with 4 core principles:
- Vim Compatibility (IDE-First): Match Vim where feasible, IDE behavior takes precedence
- IntelliJ Platform Integration: Follow SDK patterns, Kotlin-first
- vim-engine Separation: Keep core engine platform-independent
- Code Quality Standards: Tests required, YouTrack for issues

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 12:14:46 +02:00
Alex Plate f158824d0c Add .beads/sync_base.jsonl to gitignore 2026-01-30 11:41:13 +02:00
Alex PlateandClaude Opus 4.5 2f83606662 Change UI tests schedule to every 30 minutes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:35:24 +02:00
Alex PlateandClaude Opus 4.5 9394788e34 Add UI test debugging principles to autofix prompt
Add general guidance for fixing flaky UI tests:
- Flaky = race condition, not timeout issue
- Wait for unique state identifiers, not shared elements
- Understand framework built-in waits (findText already waits)
- Trace causality backwards to find correct wait condition
- State transitions have intermediate states

These principles should improve autofix success rate for UI test failures.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:34:50 +02:00
Alex PlateandClaude Opus 4.5 5445878d21 Fix testTrackActionId UI test flakiness
Wait for "Action id copied" confirmation notification after clicking
"Copy Action Id". This ensures the clipboard was actually updated before
proceeding to paste, fixing the race condition where the test would
paste stale clipboard data.

The old wait for "Stop Tracking" was unreliable because that button
exists in both the old and new notifications during the transition.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 12:26:04 +02:00
Alex PlateandClaude Opus 4.5 b7607934a1 Change IntelliJ UI tests schedule from every 5 minutes to daily
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-22 11:50:28 +02:00
Alex PlateandClaude Opus 4.5 da4d0bdee3 Add extensions-api-migration skill for Claude Code
Documents how to use the new IdeaVim extension API and how to
migrate existing extensions from VimExtensionFacade to the new
@VimPlugin annotation-based API.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 18:44:44 +02:00
Alex PlateandClaude Opus 4.5 86bf54d84c Migrate argtextobj extension to new textObjects API
Replace VimExtensionFacade.putExtensionHandlerMapping with the new
api.textObjects { register(...) } pattern. This simplifies the
extension by removing the ArgumentHandler class and its inner
ArgumentTextObjectHandler.

Key changes:
- Add LineInfoProvider interface to decouple ArgBoundsFinder from Document
- Create findArgumentRange extension function on VimApi
- Use api.textObjects { } for registering ia/aa text objects
- Remove unused imports and old handler code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 18:28:45 +02:00
Alex Plate 9decb6152d Add sync.lock to gitignore 2026-01-16 16:29:17 +02:00
Alex PlateandClaude Opus 4.5 f49d36fa02 Add comprehensive tests for argtextobj extension
Add tests covering: change outer argument, single argument handling,
whitespace handling, cursor positioning, nested function calls,
quoted strings, multiline arguments, and various bracket types.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 15:54:00 +02:00
Alex Plate eed102d035 Convert VimArgTextObjExtension to kotlin 2026-01-16 15:48:33 +02:00
Alex Plate 38f428dec3 Rename .java to .kt 2026-01-16 15:48:32 +02:00
Alex PlateandClaude Opus 4.5 ed0f74d85c Run UI tests every 5 minutes to test stability
Testing the UI tests stability with more frequent runs.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 15:08:59 +02:00
Alex PlateandClaude Opus 4.5 3627d62175 Disable build cache for PyCharm and Rider UI tests
Same fix as ui-ij-tests - ensures tests actually run instead of
using cached results.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 15:03:36 +02:00
Alex PlateandClaude Opus 4.5 add0c5b327 Run UI tests every 30 minutes instead of daily
Increase frequency to verify test stability.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 14:55:17 +02:00
Alex PlateandClaude Opus 4.5 0312531361 Disable build cache for UI tests to ensure they always run
UI tests were being skipped due to Gradle build cache restoring
previous results. This defeats the purpose of stability testing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 14:55:00 +02:00
Alex PlateandClaude Opus 4.5 41c462c975 Remove Claude from contributors and exclude from authors workflow
Claude AI should not be listed as a contributor. This removes the
entry and adds an exclusion to prevent it from being re-added.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 13:56:41 +02:00
Alex PlateandClaude Opus 4.5 6a2429c849 Add issues-deduplication skill for YouTrack issue management
Documents the approach for handling duplicate issues including:
- Choosing primary issues based on age and activity
- Protecting customer-tagged issues from duplication
- Avoiding duplication into closed issues
- Consolidating duplicates to a single primary
- Leaving courteous comments for reporters

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 13:53:58 +02:00
Alex PlateandClaude Opus 4.5 9cd28d4721 Add change granularity guidelines to tests-maintenance skill
Document that each CI run should make only one logical change
to ensure granular, reviewable PRs. Multiple annotations can
only be grouped if they share the same reason and fix pattern.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 09:31:42 +02:00
Alex Plate 79d36c1edc Ignore last-touched file in beads workspace 2026-01-13 07:33:05 +02:00
Alex Plate e407d9ebad Add beads workflow tracking 2026-01-13 07:18:38 +02:00
Alex PlateandClaude Opus 4.5 275475755d Add --console=plain note for gradle tasks in CLAUDE.md
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 07:09:37 +02:00
Alex PlateandClaude Opus 4.5 9ef7ce1d36 Add Neovim installation to Claude Code workflows
Install Neovim in workflows that run tests:
- testsMaintenance.yml: deals with @TestWithoutNeovim annotations
- codebaseMaintenance.yml: can run gradle tests
- youtrackAutoAnalysis.yml: uses TDD for bug fixes and features

Also add guidance in testsMaintenance to verify actual Neovim behavior
when working with skip reasons, and allow nvim/echo bash commands.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-13 07:05:27 +02:00
Alex PlateandClaude Opus 4.5 26154061f7 Add clear output when Neovim testing is enabled
Print "NEOVIM TESTING ENABLED" message when running tests with -Dnvim
flag so AI can verify Neovim testing is actually active.

Also fix skill documentation to use correct -Dnvim flag.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 14:04:43 +02:00
Alex PlateandClaude Opus 4.5 fa2b54bc2d Deprecate SkipNeovimReason.UNCLEAR
Similar to DIFFERENT, UNCLEAR is too vague and should be replaced
with a more specific reason after investigation.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 14:00:59 +02:00
Alex PlateandClaude Opus 4.5 85ccfcd4b0 Add instructions for handling deprecated DIFFERENT annotation
Document the process for tests-maintenance skill:
1. Try removing annotation and running with Neovim first
2. If test passes, remove the outdated annotation
3. If test fails, replace with a more specific reason

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 13:58:56 +02:00
Alex PlateandClaude Opus 4.5 3c967d1f03 Fix Neovim test annotations in SearchGroupTest
- Change `test negative lookbehind regression` to use IDEAVIM_API_USED
  (test uses internal search() helper that calls VimPlugin API directly)
- Remove outdated TestWithoutNeovim annotations from 5 tests that now
  pass with Neovim: smartcase/ignorecase search tests

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 13:55:04 +02:00
Alex PlateandClaude Opus 4.5 47215cfda1 Deprecate SkipNeovimReason.DIFFERENT in favor of more specific reasons
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 13:55:04 +02:00
Alex PlateandClaude Opus 4.5 20f86bc0b4 Add explanations for disabled tests in MultipleCaretsTest
Document why each disabled test is disabled:
- testCopyVisualText: CopyTextCommand processes carets sequentially,
  causing document shifts that corrupt subsequent caret operations
- testPutVisualLines: Multi-caret :put with visual selection only
  processes one caret (also fixed invokeAndWait wrapper)
- testMoveText* tests: MoveTextCommand explicitly throws exception
  for multiple carets

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-12 13:55:04 +02:00
Alex PlateandClaude Opus 4.5 64dfcdb9fa Remove clean task from PR verification workflow
Allows Gradle caching to be effective.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 19:05:34 +02:00
Alex PlateandClaude Opus 4.5 1935444033 Remove clean task from TeamCity builds to enable Gradle caching
The clean task was invalidating the Gradle cache on each build,
making the caching feature ineffective.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 18:59:22 +02:00
Alex PlateandClaude Opus 4.5 8fea386169 Fix TeamCity build cache paths to use Gradle User Home
The relative paths .gradle/caches and .gradle/wrapper don't exist in the
checkout directory - Gradle stores caches in ~/.gradle/ by default.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 17:30:33 +02:00
Alex PlateandClaude Opus 4.5 eaeb3eeb79 Fix artifact upload paths in PR verification workflow
Remove incorrect ideavim/ prefix from paths - the checkout is at repo root.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 17:22:09 +02:00
Alex PlateandClaude Opus 4.5 642ed628a5 Enable Gradle build cache for release builds
Add --build-cache and --configuration-cache flags to all gradle steps
in ReleaseDev and ReleaseEap builds to match other build configurations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 17:12:48 +02:00
Alex PlateandClaude Opus 4.5 7d8655a624 Add tests for replace with register inside empty brackets
Tests for VIM-3798: replacing inside empty braces, quotes, parentheses,
and square brackets.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 17:05:42 +02:00
Alex PlateandClaude Opus 4.5 9a8d7eda71 Update TeamCity DSL version to 2025.11
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 17:02:24 +02:00
Alex PlateandClaude Opus 4.5 8595d53983 Remove SlackNotificationTest patch
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 16:59:52 +02:00
Alex PlateandClaude Opus 4.5 799d450886 Update plugin description with more detailed feature information
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 16:53:04 +02:00
Alex PlateandClaude Opus 4.5 b24dd33e3b Temporarily disable macOS UI tests in IJ workflow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 17:15:59 +02:00
Alex PlateandClaude Opus 4.5 0bdecdc4c2 Fix disk space issues in Linux UI test workflows
Add disk space cleanup and reduce video recording size for Linux runners:
- Add "Free up disk space" step to remove .NET, Android SDK, GHC, CodeQL
- Reduce Xvfb resolution from 1920x1080 to 1280x720
- Optimize ffmpeg: 15fps, ultrafast preset, crf 28

This aligns with the existing Rider Linux workflow settings.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 17:15:59 +02:00
Alex PlateandClaude Sonnet 4.5 63275de20b Add NEOVIM_RPC_SPECIAL_KEYS_INSERT_MODE reason for clearer test documentation
Replace UNCLEAR annotations with a properly documented reason explaining why backspace and other special keys fail in Neovim RPC testing. This makes the limitation clear for future developers and consolidates 8 tests under a single, well-explained reason.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 17:15:58 +02:00
Alex PlateandClaude Sonnet 4.5 64eca1ca11 Fix missing dependencies and git staging rule in UI test analysis jobs
Added missing dependencies:
- Java 21 setup (required for compilation verification)
- FFmpeg installation (required for ffprobe video analysis)

Added critical git staging rule to all UI test workflows:
- NEVER use `git add -A` or `git add .` when creating fix branches
- Always add modified files explicitly by path
- This prevents accidentally staging unrelated files that could cause
  push failures due to GitHub App workflow permission restrictions

Affected workflows:
- runUiTestsIJ.yml (unified IntelliJ IDEA tests)
- runUiPyTests.yml (PyCharm macOS tests)
- runUiPyTestsLinux.yml (PyCharm Linux tests)
- runUiRdTests.yml (Rider macOS tests)
- runUiRdTestsLinux.yml (Rider Linux tests)
- runUiOctopusTests.yml (Non-Octopus tests)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-08 07:32:43 +02:00
Alex PlateandClaude Sonnet 4.5 2bf418978a Update PyCharm UI test to handle new startup behavior
PyCharm now opens with a project directly instead of showing the Welcome Frame. Removed the project creation logic and unused imports.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-07 23:36:55 +02:00