feat(lsp): add missing LspCapability enum values #1063
Merged
hamza.khyari
merged 1 commits from 2026-03-27 12:12:08 +00:00
feature/lsp-capability-enum into master
Dismiss Review
Are you sure you want to dismiss this review?
Labels
Clear labels
auto/needs-reevaluation
controller-managed
overdue
auto/blocked-by-deps
auto/ci-timeout
auto/claimed-implementer
auto/claimed-merge
auto/claimed-reviewer
auto/driver-down
auto/invariant-violation
auto/last-attempt-tier-0
auto/last-attempt-tier-1
auto/last-attempt-tier-2
auto/last-attempt-tier-min
Automation Tracking
auto/needs-conflict-resolution
auto/needs-implementer
auto/postmortem
auto/ready-to-merge
auto/restart-throttled
auto/revert
auto/sentinel
auto/stale-inactivity
auto/unstable
Blocked
Needs Feedback
Signed-off: Owner
Signed-off: Scrum Master
Signed-off: Tech Lead
Spike
Controller deferred this PR; awaiting Phase 6+ scope-evaluator or operator re-enablement.
Auto-agents controller manages this PR/issue (see tools/controller/deploy/RUNBOOK.md). Remove this label to abandon controller management.
PR blocked by an open issue dependency. Operator must close the dep (or remove the dependency link) before the merge driver can act. Auto-cleared by merge_drive when no open deps remain.
Most recent merge cycle hit CI timeout. Driver excludes this PR while last merge_cycle row is < 30 min old; label persists thereafter as visible history.
Currently being processed by an implementer worker.
Currently being processed by the merge driver.
Currently being processed by a reviewer worker.
Merge driver heartbeat stale; pipeline halted. Closed automatically on next clean tick.
Detected master commit violating the strict merge invariant. Tracked as an issue (not a PR label); kept here for label completeness.
In-cycle escalation: most recent attempt ran at the Tier 0 slot (`tier-0`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 1 slot (`tier-1`). Slot's model defined in .opencode/models/tiers.yaml.
In-cycle escalation: most recent attempt ran at the Tier 2 slot (`tier-2`). Slot's model defined in .opencode/models/tiers.yaml. Gated behind IMPLEMENTER_ESCALATION_TIER2_ENABLED.
In-cycle escalation: most recent attempt ran at the Tier -1 slot (`tier-min`). Slot's model defined in .opencode/models/tiers.yaml. Suffix is ``-min`` (not ``--1``) so the Forgejo UI reads naturally.
Tracking issues used by the AI Automation system for agents to communicate and report.
Rebase conflict needs LLM conflict-resolver.
Failing CI needs implementer attention.
Documenting a driver incident or rollback.
Reviewer has APPROVED this PR and no later REQUEST_CHANGES is outstanding. The merge driver requires this label to even consider a PR for merging. Set by the reviewer worker on APPROVE; cleared on REQUEST_CHANGES.
Train repeatedly lost master-tempo races. Driver excludes via merge_cycle until cooldown elapses; label persists as visible history.
Revert PR backing out an invariant violation. Fast-tracked through the merge driver.
Sentinel PR duplicated from upstream into a personal fork by tools/duplicate_prs_to_fork.py for pipeline testing. Lives only in the fork; the canonical pipeline never sees it.
No implementer activity for N days. Flagged for human review. Auto-cleared on next push to head branch.
Repeatedly fails on current master (>= 3 ci-fail-on-rebased-sha releases in 12 h). Excluded from driver until human triage.
A ticket in a blocked state and unable to complete until some other task is completed first.
Bounty
$100
A bounty of $100 for any open-source contributor who provides a MR that solves this issue
Bounty
$1000
A bounty of $1000 for any open-source contributor who provides a MR that solves this issue
Bounty
$10000
A bounty of $10000 for any open-source contributor who provides a MR that solves this issue
Bounty
$20
A bounty of $20 for any open-source contributor who provides a MR that solves this issue
Bounty
$2000
A bounty of $2000 for any open-source contributor who provides a MR that solves this issue
Bounty
$250
A bounty of $250 for any open-source contributor who provides a MR that solves this issue
Bounty
$50
A bounty of $50 for any open-source contributor who provides a MR that solves this issue
Bounty
$500
A bounty of $500 for any open-source contributor who provides a MR that solves this issue
Bounty
$5000
A bounty of $5000 for any open-source contributor who provides a MR that solves this issue
Bounty
$750
A bounty of $750 for any open-source contributor who provides a MR that solves this issue
MoSCoW
Could have
Could have feature in order to satisfy the epic/legendary.
MoSCoW
Must have
Must have feature in order to satisfy the epic/legendary.
MoSCoW
Should have
Should have feature in order to satisfy the epic/legendary.
There are questions in the ticket that can not be completed until the project owner provides clarity.
Points
1
1 man-hours worth of work for an expert with no learning curve.
Points
13
13 man-hours worth of work for an expert with no learning curve.
Points
2
2 man-hours worth of work for an expert with no learning curve.
Points
21
21 man-hours worth of work for an expert with no learning curve.
Points
3
3 man-hours worth of work for an expert with no learning curve.
Points
34
34 man-hours worth of work for an expert with no learning curve.
Points
5
5 man-hours worth of work for an expert with no learning curve.
Points
55
55 man-hours worth of work for an expert with no learning curve.
Points
8
8 man-hours worth of work for an expert with no learning curve.
Points
88
88 man-hours worth of work for an expert with no learning curve.
Priority
Backlog
This ticket has backlogged priority and is not to be worked on yet
Priority
CI Blocker
Critical priority issue that blocks CI/CD pipeline and prevents PR merges
Priority
Critical
The priority is critical
Priority
High
The priority is high
Priority
Low
The priority is low
Priority
Medium
The priority is medium
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
When an epic or legendary is in review it must be signed off by owner, tech lead, and scrum master before being marked as completed.
A ticket for learning a tool or technology that is needed to be able to do future planning and design.
State
Completed
The ticket has been fully implemented, completed, and merged with the source code. This label should only be applied once a ticket is closed.
State
Duplicate
A ticket that represents the same content as an existing ticket.
State
In Progress
A ticket that is actively being developed.
State
In Review
A ticket that has had some code completed to implement but is waiting to pass peer review and is not yet merged in.
State
Paused
This ticket's work started but wasn't finished. It's on hold (likely in a feature branch) and will be resumed later, either due to a blocker or a delay.
State
Unverified
All new tickets start in this state. A developer may set it to show the ticket is unverified. This means we haven't agreed to work on it. It will either move to a verified state or be closed as wontdo.
State
Verified
The issue has been verified by a developer as legitimate. It will be worked on and verified tickets are now considered part of the backlog.
State
Wont Do
This ticket has been decided it wont be done. This may mean the bug has been determined to not be real (cant verify) or the feature is one we have decided we dont want to adopt.
Type
Automation
Any edits or discussion about the AI automated coding system.
Type
Bug
Something that doesnt work as intended.
Type
Discussion
Anytime a ticket represents a discussion about a subject and doesnt fall into one of the other categories.
Type
Documentation
An error or improvement needed in the documentation.
Type
Epic
Any first tier epic. That is, an epic which contains only issues as children and will not have sub-epics.
Type
Feature
Some new functionality not present.
Type
Legendary
A type of Epic which will contain other Epics.
Type
Refactor
A code change that restructures existing code without changing its external behavior.
Type
Support
Someone needs help using the project.
Type
Task
A generic task that doesnt fit into the other type categories.
Type
Testing
Work exclusively focusing on fixing or expanding testing.
Projects
Clear projects
No project
Assignees
aditya (Aditya Chhabra)
aleenaumair (Aleena Umair)
brent.edwards (Brent Edwards)
CoreRasurae (Luis Mendes)
drew (Drew Morris)
eugen.thaci (Eugen Thaci)
freemo (Jeffrey Phillips Freeman)
HAL9000 (HAL 9000)
HAL9001 (HAL9001)
hamza.khyari (Hamza Khyari)
hurui200320 (Rui Hu)
justin.morris
khird (Kyle Hird)
org.cleveragents
Clear assignees
No Assignees
hamza.khyari
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: cleveragents/cleveragents-core#1063
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "feature/lsp-capability-enum"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Adds 5 missing LSP capabilities to the
LspCapabilityenum, aligning it with the spec's 11-capability set. Updates the tool adapter to generate tool specs and input schemas for all capabilities.Closes #834
Changes
Enum (
models.py)DIAGNOSTICSDIAGNOSTICSTYPE_INFOHOVER(renamed)SYMBOLSDOCUMENT_SYMBOLS(renamed)COMPLETIONSCOMPLETIONSREFERENCESREFERENCESRENAMERENAMECODE_ACTIONSCODE_ACTIONSFORMATFORMATDEFINITIONS(new)SIGNATURE_HELP(new)WORKSPACE_SYMBOLS(new)Tool Adapter (
tool_adapter.py)_CAPABILITY_TOOL_MAP: 11 entries with spec-aligned tool suffixes_input_schema_for(): 3 schema categories:queryfield)Server (
server.py)No changes needed —
_STUBBED_CAPABILITIESalready includes all 11 LSP provider keys.Tests
28 Behave scenarios covering: enum member count and values, tool map completeness, tool spec generation for each capability, input schema correctness, stubbed server capability keys.
Spec Reference
docs/specification.mdlines 20705-20717Planning review (Day 42):
bugbut the title and body describe a feature addition (feat(lsp): add missing LspCapability enum values). Should beType/Featureper CONTRIBUTING.md conventions.Otherwise looks good: milestone set (v3.6.0), closes #834, 2 reviewers assigned (freemo + brent.edwards).
PR Review: !1063 (Ticket #834)
Verdict: Request Changes
This PR makes solid progress aligning the
LspCapabilityenum with the spec's 11-capability table and adds well-structured BDD tests. However, the build is broken — renamingTYPE_INFO→HOVERandSYMBOLS→DOCUMENT_SYMBOLSwas not propagated to 3 other files that still reference the old string values, causing 13+ test scenario failures. In addition, there are spec compliance gaps (tool suffix mismatch, enum value mismatch), missing process artifacts (changelog, documentation), and a stale branch. These must be resolved before merge.Critical Issues
1. Broken test fixture
_VALID_YAMLuses removed enum valuetype_infofeatures/steps/lsp_cli_new_coverage_steps.py, line 41- type_infoas a capability. SinceTYPE_INFO = "type_info"was renamed toHOVER = "hover",LspCapability("type_info")now raisesValueError. This breaks 12 test scenarios infeatures/lsp_cli_new_coverage.feature. Confirmed by runningnox -s unit_tests.- type_info→- hoveron line 41.2. Broken test fixture
_VALID_YAML_2uses removed enum valuesymbolsfeatures/steps/lsp_cli_new_coverage_steps.py, line 54- symbolsas a capability. SinceSYMBOLS = "symbols"was renamed toDOCUMENT_SYMBOLS = "document_symbols", this also raisesValueError, compounding the failures from issue #1.- symbols→- document_symbolson line 54.3. Broken Behave scenario uses removed
type_infocapabilityfeatures/consolidated_misc.feature, line 1227And the LSP server config has capabilities "diagnostics,completions,type_info"passes"type_info"to a step that builds a map fromLspCapabilityvalues. Since"type_info"is no longer a valid value, this throwsKeyErrorat runtime. Confirmed failing innox -s unit_tests."diagnostics,completions,type_info"→"diagnostics,completions,hover".Major Issues
4. Tool suffix for
CODE_ACTIONSuses underscore instead of spec-required hyphensrc/cleveragents/lsp/tool_adapter.py, line 52lsp/code-actions(hyphen). The_CAPABILITY_TOOL_MAPentry uses"code_actions"(underscore), producing tool names likelocal/pyright/code_actionsinstead oflocal/pyright/code-actions. The PR modifies this map to align all 11 entries with the spec — leaving this one misaligned defeats the purpose."code_actions"→"code-actions"and update the Behave test example atfeatures/lsp_capability_enum.featureline 51 accordingly.5. Enum value
FORMAT = "format"does not match spec capability nameformattingsrc/cleveragents/lsp/models.py, line 36formatting, notformat. The PR renamesTYPE_INFO→HOVERandSYMBOLS→DOCUMENT_SYMBOLSto align with spec names, but does not apply the same treatment toFORMAT. This is inconsistent and technically violates acceptance criterion #1 ("enum includes all 11 spec-defined values").FORMATTING = "formatting"and update all references. The tool suffix should remain"format"per the spec's tool namelsp/format.6.
_input_schema_for()has an unguarded fallthrough for unknown capabilitiessrc/cleveragents/lsp/tool_adapter.py, lines 161–213file_only,position_based,query_based), the function silently returns{"type": "object", "properties": {}}with norequiredfield. No warning, no assertion, no logging. If someone adds a new enum member but forgets to add it to a tuple, the tool will be generated with an empty schema undetected.elseclause that raisesValueError(f"No schema defined for {capability}"), or add an exhaustive-check assertion.7.
RENAMEcapability schema missing requirednew_nameparametersrc/cleveragents/lsp/tool_adapter.py, lines 169–204RENAMEis categorized asposition_based, generating a schema with onlyfile_path,line,column. However, the LSPtextDocument/renamerequest requires anewNameparameter — you can't rename without knowing what to rename to. While pre-existing, this PR refactored the schema function and had the opportunity to fix it.RENAMEits own schema category that includesfile_path,line,column, andnew_name.8.
docs/reference/lsp.mdis stale and incorrectdocs/reference/lsp.md, lines 23–32 and 96–109TYPE_INFO,SYMBOLS). The YAML example still usestype_info. Acceptance criterion #4 requires "Documentation updated with full capability list." No documentation was updated.9. Missing CHANGELOG.md entry
CHANGELOG.md(not modified)## Unreleaseddescribing the addition of 5 new LSP capabilities.10. Branch is 43 commits behind master — stale artifacts and merge hazards
CHANGELOG.md,CONTRIBUTORS.mdorigin/master. The CHANGELOG on the branch is missing ~120 lines of entries from master.CONTRIBUTORS.mdhas a duplicate "Rui Hu" entry and is missing a contributor that exists on master. A merge would create destructive conflicts.Minor Issues
11. CLI docstring example uses removed
type_infovaluesrc/cleveragents/cli/commands/lsp.py, line 30capabilities: ["diagnostics", "completions", "type_info"]. Users copying this example will get a Pydantic validation error."type_info"→"hover".12. Schema tests only cover 1 member per category — inadequate categorization coverage
features/lsp_capability_enum.feature, lines 59–73diagnostics(file_only),hover(position_based), andworkspace_symbols(query_based) are tested. Ifformatordocument_symbolswere accidentally placed in the wrong category, no test would catch it.Scenario Outlinecovering at least 2–3 members per category.13. Tool name assertion uses fragile substring matching
features/steps/lsp_capability_enum_steps.py, lines 103–108any(suffix in n for n in names)means suffix"symbols"(fordocument_symbols) would also match"workspace-symbols". Could produce false positives.n.endswith(f"/{suffix}")for more precise matching.14. Weak assertion in
step_specs_not_empty_lsp_cap— only checks existencefeatures/steps/lsp_capability_enum_steps.py, lines 96–100len(specs) > 0. Never validates that generated specs have expected keys (name,input_schema). A malformed spec would pass.15. Stubbed capabilities test only checks 5 of 11 provider keys
features/lsp_capability_enum.feature, lines 77–83completionProvider) would go undetected.16. Category tuples in
_input_schema_for()are recreated on every callsrc/cleveragents/lsp/tool_adapter.py, lines 163–179_FILE_ONLY_CAPABILITIES,_POSITION_BASED_CAPABILITIES,_QUERY_BASED_CAPABILITIES).Nits
17. No negative/edge-case test scenarios
features/lsp_capability_enum.featureLspCapability("nonexistent")→ValueError, or empty capabilities list, orNoneconfig togenerate_tool_specs().18. JSON schemas lack
additionalProperties: falsesrc/cleveragents/lsp/tool_adapter.py, line 161"additionalProperties": Falseto the base dict.19. Feature file trailing whitespace alignment inconsistency
features/lsp_capability_enum.feature, line 29| workspace_symbols|is missing the trailing space before|that all other entries have.| workspace_symbols |.20. No
max_lengthconstraint onLspServerConfig.namesrc/cleveragents/lsp/models.py, lines 54–58namehasmin_length=1but no upper bound. An extremely long name would produce oversized tool names and bloat specs.max_length=256.Summary
The PR demonstrates good engineering: a clean commit message matching ticket metadata, well-structured BDD tests with proper naming, thorough tool adapter refactoring, and passing lint/typecheck/format gates. However, the enum rename migration was incomplete, leaving 3 files with stale references that break 13+ test scenarios (confirmed by
nox -s unit_tests). Beyond the broken build, there are spec alignment gaps (code_actionssuffix,formatvsformatting), missing process artifacts (changelog, documentation), and a stale branch. These issues require changes before this PR is mergeable.0c0b3df945to626c2606a8Response to Review (hurui200320)
All 20 findings addressed. Rebased onto master, pushed
626c2606.Critical (1-3): Stale enum references — FIXED
lsp_cli_new_coverage_steps.py:41:type_info->hoverlsp_cli_new_coverage_steps.py:54:symbols->document_symbolsconsolidated_misc.feature:1231:type_info->hoverMajor (4-9):
code_actionsunderscorecode-actions(hyphen) in tool mapFORMATvs specformattingFORMATTING = "formatting". Tool suffix stays"format"per spec tool namelsp/format_input_schema_forelse: raise ValueError(...)defensive clausenew_namefile_path,line,column,new_namedocs/reference/lsp.mdstale## UnreleasedMajor 10: Branch stale — FIXED
Rebased onto current master. Clean rebase.
Minor (11-16):
type_infohovern.endswith(f"/{suffix}")step_spec_has_keysassertingnameandinput_schemakeys_FILE_ONLY_CAPABILITIES,_POSITION_BASED_CAPABILITIES,_RENAME_CAPABILITY,_QUERY_BASED_CAPABILITIESNits (17-20):
additionalProperties: falsemax_lengthonLspServerConfig.nameCurrent state: 37 scenarios, 135 steps, lint clean. All stale references fixed.
PR Review: !1063 (Ticket #834)
Verdict: Request Changes
This PR fixes most of the previously reported defects and aligns the enum/tool mapping with the spec’s 11-capability list.
However, there are still major gaps: one ticket acceptance criterion is not implemented, and there is a runtime correctness mismatch for
workspace_symbols.Critical Issues
None.
Major Issues
Ticket AC not fully implemented: capability negotiation in initialize request not updated
src/cleveragents/lsp/client.py229-243LspClient.initialize()still only advertises diagnostics/completion/synchronization/workspaceFolders; it does not advertise newly added capabilities like hover/definition/signature/document/workspace symbols.params["capabilities"]payload ininitialize()to include the required capabilities (or explicitly adjust ticket/spec expectations if intentionally deferred).workspace_symbolsschema/handler contract mismatch in runtime modesrc/cleveragents/lsp/tool_adapter.py124-127,303-310_input_schema_for(LspCapability.WORKSPACE_SYMBOLS)requires onlyquery, but_make_runtime_handler()unconditionally requiresfile_pathbefore capability dispatch. So schema-valid input can fail with{"error": "file_path is required"}.WORKSPACE_SYMBOLS, accept query-only input (or raise consistentLspNotAvailableErrorwithout demandingfile_path).Minor Issues
“All provider keys” test misses diagnostics provider
features/lsp_capability_enum.feature100-112diagnosticProvider, which exists in_STUBBED_CAPABILITIES.diagnosticProvider(and ideally assert exact expected key set/count).src/cleveragents/lsp/server.py:90.New step file introduces many
type: ignoresuppressions against CONTRIBUTING guidancefeatures/steps/lsp_capability_enum_steps.py20, 26, 36, 48, 56, 65, 67, ... , 161CONTRIBUTING.mddisallows suppression usage.CONTRIBUTING.md:546-548.Input hardening gap: unbounded LSP server name
src/cleveragents/lsp/models.py54-58LspServerConfig.namehasmin_lengthbut no upper bound. This value is embedded in generated tool names and logs, which can inflate payload/log size.max_length(e.g. 256).Nits
ValueErrorbranch in schema builder is not directly testedsrc/cleveragents/lsp/tool_adapter.py311-312Summary
workspace_symbolshandler input contract.626c2606a8to656dc1aeddResponse to Review Round 2 (hurui200320)
All validated findings addressed. Rebased onto master, pushed
656dc1ae.Major
initialize()doesn't advertise new capabilitiesclient.py:229-257to advertise all 11 capabilities: hover (with contentFormat), definition, references, rename, codeAction (with codeActionKind), formatting, signatureHelp (with parameterInformation), documentSymbol (with hierarchical support), and workspace symbol.workspace_symbolshandler requiresfile_pathbut schema only requiresquery_make_runtime_handler()now checksworkspace_symbolsfirst and accepts query-only input without demandingfile_path.Minor
diagnosticProviderdiagnosticProviderin the feature file.type: ignoresuppressions in step fileLspServerConfig.namenomax_lengthNit
ValueErrorbranch untestedCurrent state: 38 scenarios, 138 steps, lint clean. Rebased onto master.
PR Review: !1063 (Ticket #834)
Verdict: Approve
This PR is in excellent shape after three review rounds. All prior critical and major bugs (broken tests, stale enum references, missing capability negotiation, workspace_symbols handler mismatch) have been correctly resolved. Spec compliance is strong — all 11 capabilities are present, tool suffixes match the spec, documentation and CHANGELOG are updated, and commit/branch conventions are correct. The code is functionally correct and complete.
The findings below are suggestions for improvement — none are blockers. Feel free to address them in this PR or defer to follow-up work.
Critical Issues
None.
Major Issues
None.
Minor Issues (Suggestions)
1. No test for
_make_runtime_handlerworkspace_symbols code pathsrc/cleveragents/lsp/tool_adapter.py, lines 124–133WORKSPACE_SYMBOLSbranch in_make_runtime_handlervalidatesqueryinstead offile_pathand short-circuits before the generic validation. This behavioral branch has no direct test coverage. The code is correct, but a regression would go undetected.WORKSPACE_SYMBOLSand verifies it accepts query-only input and rejects empty queries.2. No test for
client.pycapability negotiation changessrc/cleveragents/lsp/client.py, lines 235–268initialize()payload now advertises all 11 capabilities, but no test validates the payload contents. Since these are static hardcoded fields, regression risk is low, but coverage would be nice.3. Error handling inconsistency in
_make_runtime_handler: dict vs exceptionsrc/cleveragents/lsp/tool_adapter.py, lines 127–133 vs 136–137{"error": ...}dicts, while unimplemented capabilities raiseLspNotAvailableError. Callers must handle both. This is a pre-existing pattern that the newworkspace_symbolscode follows consistently.4.
_CAPABILITY_TOOL_MAP.get()fallback silently masks missing map entriessrc/cleveragents/lsp/tool_adapter.py, lines 202–205.get()with a fallback tuple provides a silent default for missing capabilities. Since_input_schema_for()would catch unknown capabilities withValueErroranyway, this is a safety-net gap rather than a bug._CAPABILITY_TOOL_MAP[capability]for clearer error messages.5. No
maxLengthconstraint onqueryandnew_nameschema fieldssrc/cleveragents/lsp/tool_adapter.py, lines 308–321workspace_symbolsqueryandrenamenew_namestring fields have no length bounds. Currently all handlers raiseLspNotAvailableError, so there's no runtime risk, but setting limits now establishes the correct API contract for when these are wired to real LSP servers."maxLength": 1000toqueryand"maxLength": 256tonew_name.6. Function-level imports in step definition file
features/steps/lsp_capability_enum_steps.py, lines 54 and 168_STUBBED_CAPABILITIESandStrEnumare imported inside function bodies. CONTRIBUTING.md requires top-of-file imports.7.
workspacecapability negotiation sends emptysymbolKindobjectsrc/cleveragents/lsp/client.py, line 268"symbol": {"symbolKind": {}}is technically correct per LSP spec (server falls back to defaults), but explicitly declaringvalueSetwould harden the contract.{"valueSet": list(range(1, 27))}.Nits
1. Markdown table misalignment in
docs/reference/lsp.mddocs/reference/lsp.md, line 35 —WORKSPACE_SYMBOLSrow missing trailing space before|.2. No assertion on
additionalProperties: falsein schema testsfeatures/lsp_capability_enum.feature— code adds"additionalProperties": Falseto every schema but no test validates it.3. Schema tests validate
requiredbut notpropertiescontentfeatures/steps/lsp_capability_enum_steps.py, lines 122–135 — steps only checkrequiredarray, never verify property definitions exist with correct types.4.
# type: ignore[arg-type]in negative testfeatures/steps/lsp_capability_enum_steps.py, line 175 — the 22[attr-defined]suppressions follow the systemic Behave pattern (770+ project-wide), but this single[arg-type]is unique. Considercast()or a documenting comment.Summary
The PR delivers on all ticket requirements: the
LspCapabilityenum has all 11 spec-defined values, the tool adapter generates specs for all capabilities with correct suffixes, capability negotiation is implemented, and documentation is updated. The code is clean, well-structured, and follows project conventions. All findings from two prior review rounds have been addressed.The remaining suggestions focus on test coverage for new behavioral code paths and minor hardening — all deferrable at the author's discretion.
656dc1aeddtoc30712da38New commits pushed, approval review dismissed automatically according to repository settings
c30712da38to6a8f724299