Marksman returns all headings (h1-h6) with SymbolKind.String (15), which
causes them to be treated as low-level symbols and filtered out of
get_symbols_overview results.
Override request_document_symbols in Marksman to remap SymbolKind.String
to SymbolKind.Namespace, which is semantically appropriate for headings
(named sections containing other content) and ensures they appear in
symbol overviews.
Modes could not activate optional tools, because optional tools were not in the base toolset.
Base toolset computation was fully refactored, now considering all initial modes in the sense
that their inclusions are definitely part of the base toolset.
Dynamic mode changes after agent creation are still subject to the constraint that they
can essentially only disable tools; while they can technically also enable tools,
enabling is not effective unless the tools were also in the exposed toolset (as clients
otherwise cannot "see" them).
Fixes#1105
Replace the automatic timed banner rotation with a random initial banner
selection and small, manually operated arrow buttons for navigation.
Previous behavior can be restored by setting BannerRotation.automaticRotationEnabled to true.
The original slides used position:absolute + opacity for transitions.
This was changed to display:none/block because absolutely positioned
children don't contribute to their parent container's dimensions, causing
the banner containers to collapse to zero width/height. The arrow buttons
(position:absolute, top:50%) need a parent with real dimensions to
center correctly. With display:none/block, the active slide determines
the container's natural size.
The fixed height:60px on .gold-banner was removed for the same reason —
it clipped banner images that are taller than 60px.
An explicit height was added to .header-banner to ensure the arrow
buttons can vertically center via top:50% within the platinum banner area.
The test wrote two values to a file and relied on a 3-second sleep for
the filesystem mtime to advance, which fails when both writes land in
the same second (ext4/tmpfs have 1-second mtime granularity).
Fix: use os.utime() to explicitly bump mtime after the second write.
This is deterministic, instant, and tests the actual cache invalidation
logic (mtime comparison) rather than hoping the clock advances.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add "Per-Project Configuration" section to JetBrains plugin docs
with cross-reference anchor for linking from other pages
- Add language_backend to project configuration feature list in workflow docs
- Add cross-reference from global config docs to per-project override
- Move language_backend field from ProjectConfig to SharedConfig,
following the same pattern as symbol_info_budget (review feedback)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The error is raised through `LanguageServerManager.get_language_server`, where it is done conservatively (only if multiple LS are available and we can't decide)