alt-glitch
40a9327248
fix(lsp): wire CLI subcommands via setup_lsp_parser for plugin registration
...
register_cli_command's setup_fn receives an already-created parser,
not the parent's SubParsersAction. Added setup_lsp_parser() that adds
subcommands (status, list, install, restart, which) to the provided
parser.
Verified: 'hermes lsp status' works from cold shell when plugin is
enabled in plugins.enabled config.
2026-05-12 13:08:49 +00:00
alt-glitch
23344a9a3c
feat(lsp): plugin-based LSP diagnostics with zero core changes
...
Ship LSP semantic diagnostics as a bundled plugin (plugins/lsp/) using
existing hook system. Zero lines of core code modified.
Plugin wiring:
- pre_tool_call: capture LSP baseline before write_file/patch
- transform_tool_result: inject diagnostics into tool result JSON
- on_session_start/on_session_end + atexit: lifecycle management
Key design:
- Baselines keyed by (session_id, abs_path) for concurrent safety
- Diagnostics added as 'lsp_diagnostics' JSON field (preserves shape)
- Per-file workspace detection (no static session-start gate)
- V4A multi-file patch skipped for MVP
- Short timeout (3s) — cold start degrades gracefully
- os.path.exists heuristic for Docker/SSH backend skip
- First relevant write with no server → INFO log with install hint
Tests: 77/77 pass including:
- Protocol framing, reporter formatting, workspace resolution
- Client E2E against mock LSP server (live_system_guard_bypass)
- Eventlog steady-state silence contract
- Backend-gate heuristic (local vs non-local paths)
- Full hook flow integration (pre→write→transform with diagnostics)
Source: PR #24168 by @teknium1, PR #24155 by @OutThisLife
Co-authored-by: Teknium <127238744+teknium1@users.noreply.github.com >
2026-05-12 13:01:13 +00:00