본문으로 건너뛰기

언어 서버 프로토콜 (LSP)

Hermes는 전체 언어 서버를 실행합니다. - pyright, gopls, rust-analyzer, typescript-language-server, clangd, 그리고 ~20 더 — 배경으로 subprocesses와 post-write에 그들의 semantic 진단을 먹이 write_filepatch에 의해 사용되는 lint 체크. 에이전트가 편집 할 때 파일, 그것은 소개 된 편집 오류를 정확하게 볼 수 있습니다 — 단지 구문 오류, ** 유형 오류, 정의되지 않은 이름, 누락 된 수입, and project-wide semantic issues** 언어 서버가 감지됩니다.

이것은 동일한 건축 최고 층 기호화 에이전트 사용입니다. 헤르메스 자체 유지: 편집기 호스트 필요 없음, 플러그인 없음 설치, 관리 할 별도의 데몬 없음.

LSP 실행

LSP는 git workspace detection에 게이트가 있습니다. 에이전트의 일 때 디렉토리 (또는 편집 된 파일)는 git 저장소 내부, LSP 작업 공간에 대해 실행합니다. git repo, LSP에서 할 때 dormant - cwd가 있는 메시징 게이트웨이에 유용합니다. 사용자의 홈 디렉토리와 진단 할 프로젝트가 없습니다.

검사는 계층화됩니다: in-process 문법 검사 첫번째 (microseconds), 그런 다음 LSP 진단은 syntax가 깨끗합니다. flaky 또는 누락 언어 서버는 쓰기를 결코 끊을 수 없습니다 — 각 LSP 실패 경로 syntax-only 결과에 다시 떨어졌다.

구체적으로, 모든 성공적인 write_file 또는 patch에:

  1. Hermes는 파일에 대한 현재 진단의 기본을 캡처합니다.
  2. 쓰기 수행.
  3. Re-queries 언어 서버, 그 진단을 필터링 이미 유선 및 표면 만 새로운 것.

에이전트은 같이 산출을 보십시오:

{
"bytes_written": 42,
"dirs_created": false,
"lint": {"status": "ok", "output": ""},
"lsp_diagnostics": "LSP diagnostics introduced by this edit:\n<diagnostics file=\"/path/to/foo.py\">\nERROR [42:5] Cannot find name 'foo' [reportUndefinedVariable](Pyright)\nERROR [50:1] Argument of type \"str\" is not assignable to \"int\" [reportArgumentType](Pyright)\n</diagnostics>"
}
``lint` 필드는 구문 검사 결과를 나타낸다 (마이크로세컨)
in-process 파스를 통해 `ast.parse`, `json.loads` 등)
`lsp_diagnostics` 필드는 semantic 진단을 수행합니다
실제 언어 서버. 두 채널, 독립적 인 신호 -
문법상 문제는 없지만 semantic 문제가 있는 파일이라면 에이전트는 `lint: ok`와 함께 채워진 `lsp_diagnostics`를 보게 됩니다.

## 지원 언어 \{#supported-languages}

| 언어 | 서버 | 자동 설치 |
|----------|--------|--------------|
| Python | `pyright-langserver` | npm |
| TypeScript / JavaScript / JSX / TSX | `typescript-language-server` | npm |
| Vue | `@vue/language-server` | npm |
| Svelte | `svelte-language-server` | npm |
| Astro | `@astrojs/language-server` | npm |
| Go | `gopls` | `go install` |
| Rust | `rust-analyzer` | 수동 (rustup) |
| C / C++ | `clangd` | 수동 (LLVM) |
| Bash / Zsh | `bash-language-server` | npm |
| YAML | `yaml-language-server` | npm |
| Lua | `lua-language-server` | 수동 (GitHub releases) |
| PHP | `intelephense` | npm |
| OCaml | `ocaml-lsp` | 수동 (opam) |
| Dockerfile | `dockerfile-language-server-nodejs` | npm |
| Terraform | `terraform-ls` | 수동 |
| Dart | `dart language-server` | 수동 (dart sdk) |
| Haskell | `haskell-language-server` | 수동 (ghcup) |
| Julia | `julia` + LanguageServer.jl | 수동 |
| Clojure | `clojure-lsp` | 수동 |
| Nix | `nixd` | 수동 |
| Zig | `zls` | 수동 |
| Gleam | `gleam lsp` | 수동 (gleam 설치) |
| Elixir | `elixir-ls` | 수동 |
| Prisma | `prisma language-server` | 수동 |
| Kotlin | `kotlin-language-server` | 수동 |
| Java | `jdtls` | 수동 |

`manual` 항목은 해당 언어의 툴체인 관리자(rustup, ghcup, opam, brew 등)로 서버를 설치하세요. Hermes는 PATH 또는 `<HERMES_HOME>/lsp/bin/`에서 바이너리를 자동 감지합니다.

일부 서버는 npm이 자동으로 끌어오지 않는 peer dependency와 함께 설치됩니다. 현재 대표 사례는 `typescript-language-server`이며, 같은 `node_modules` 트리에서 import 가능한 `typescript` SDK가 필요합니다. `hermes lsp install typescript`를 실행하거나 첫 사용 시 auto-install이 동작하면 Hermes가 두 패키지를 함께 설치합니다.

## CLI \{#cli}

hermes lsp status # service state + per-server install status hermes lsp list # registry, optionally --installed-only hermes lsp install <id> # eagerly install one server hermes lsp install-all # try every server with a known recipe hermes lsp restart # tear down running clients hermes lsp which <id> # print resolved binary path


`hermes lsp status`는 가장 좋은 출발점입니다. 현재 semantic diagnostics를 받을 수 있는 언어와 별도 바이너리 설치가 필요한 언어를 보여줍니다.

## 구성 \{#configuration}

일반적인 설정에서는 기본값으로 충분합니다. 필요한 바이너리가 PATH에 있다면 따로 설정할 것은 없습니다.

```yaml
# config.yaml
lsp:
# Master toggle. Disabling skips the entire subsystem — no servers
# spawn, no background event loop runs.
enabled: true

# How long to wait for diagnostics after each write.
wait_mode: document # "document" or "full"
wait_timeout: 5.0

# How to handle missing server binaries.
# auto — install via npm/pip/go install into &lt;HERMES_HOME&gt;/lsp/bin
# manual — only use binaries already on PATH
install_strategy: auto

# Per-server overrides (all optional).
servers:
pyright:
disabled: false
command: ["/abs/path/to/pyright-langserver", "--stdio"]
env: &#123; PYRIGHT_LOG_LEVEL: "info" &#125;
initialization_options:
python:
analysis:
typeCheckingMode: "strict"
typescript:
disabled: true # skip TS even when its extensions match

서버 키

  • disabled: true - 이 서버를 완전히 건너 뛸 때 확장 파일 일치.
  • command: [bin,...args] - 사용자 정의 바이너리 경로 핀. 계정 관리 자동 설치.
  • env: {KEY: value} - 스파네이드 프로세스에 전달된 여분의 env vars.
  • initialization_options: {...} - LSP에 병합 initializationOptions 페이로드는 initialize에 전송 임계값 Server-specific; 언어 서버의 docs를 참조하세요.

설치 위치

install_strategy: auto일 때, Hermes는 binaries를 설치합니다 &lt;HERMES_HOME&gt;/lsp/bin/입니다. NPM 패키지 토지 &lt;HERMES_HOME&gt;/lsp/node_modules/ bin symlinks 1 레벨 업. ...GOBIN 가 수록된 통가 dir를 구합니다.

/usr/local/, ~/.local/, 또는 다른 곳에서는 설치되지 않습니다 공유 위치 - staging dir는 완전히 Hermes 소유이며 프로필을 재설정 할 때 제거.

성능 특성

LSP 서버는 lazy-spawned 첫 번째 사용. Python 파일 편집 절대 본 프로젝트에서 .py 트래픽은 pyright 스페인은 대부분의 서버를 위해 1-3 초 걸립니다 (rust-analyzer는 10 +를 취할 수 있습니다 찬 프로젝트에). 같은 workspace re-use에서 동일한 편집 실행 서버.

LSP 레이어는 몇 밀리 초를 청소하지 않을 때 쓰기를 추가 진단은 방출됩니다. 진단이 방출되면 대기 예산은 wait_timeout 초입니다. 일반적으로 서버가 응답합니다 pyright/tsserver 및 몇 초 동안 밀리 초의 10 녹-analyzer 중간 색인.

서버는 Hermes 프로세스의 삶에 살아있다. 더 알아보기 idle-timeout reaper - 서버의 인덱스를 재시작하는 비용 모든 글은 데몬을 들고보다 훨씬 높을 것입니다.

지원하다

lsp.enabled: falseconfig.yaml로 설정하여 전체를 비활성화합니다 서브시스템 post-write 체크는 in-process 문법으로 돌아갑니다 체크 (ast.parse 파이썬, json.loads JSON 등 이전 버전에서 변경되지 않은 배송.

전체 레이어를 비활성화하지 않고 단일 언어를 비활성화하려면:

lsp:
servers:
rust-analyzer:
disabled: true

문제 해결

**hermes lsp status는 "missing"으로 서버를 보여줍니다. * 이름

이진은 PATH가 아니며 &lt;HERMES_HOME&gt;/lsp/bin/에 없습니다. 지원하다 hermes lsp install &lt;server_id&gt; 자동 설치를 시도하거나 언어의 정상적인 툴체인을 통해 이진을 수동으로 설치합니다.

Backend warnings 섹션에서 hermes lsp status

일부 서버는 외부 CLI 주변의 얇은 래퍼로 배송됩니다 진단 - 그들은 깨끗하게 말하고 요청을 수락하지만 결코 방출하지 sidecar 바이너리가 누락 될 때 오류. 가장 일반적인 케이스는 bash-language-server, shellcheck에 진단을 위임합니다. hermes lsp statusBackend warnings 섹션을 표시하면 설치됩니다 OS 패키지 관리자를 통해 지정된 도구:

apt install shellcheck      # Debian / Ubuntu
brew install shellcheck # macOS
scoop install shellcheck # Windows

동일한 경고는 서버에서 한 번에 기록됩니다 ~/.hermes/logs/agent.log입니다.

** 서버는 시작하지만 진단을 반환하지 않습니다 * * 이름

~/.hermes/logs/agent.log[agent.lsp.client] 항목에 체크하세요 언어 서버 및 프로토콜 오류 땅에서 모두 stderr 있습니다. 일부 서버(rust-analyzer 특히)는 완료해야 합니다 프로젝트 전체 색인은 per-file 진단을 방출하기 전에; 첫번째 서버 시작 후에 편집은 아무 진단도 없이, 완료할지도 모릅니다 그(것)들을 데려오기 후에 편집합니다.

*서버 충돌 * 이름

추락된 서버가 파손된 상태로 추가되며, 다시 시도할 수 없습니다 세션의 나머지. hermes lsp restart 을 실행하여 설정을 취소합니다; 다음 편집 re-spawns.

어떤 git repo 이외의 파일을 편집

디자인에 의해, LSP는 단지 git 저장소 안쪽에 실행합니다. 프로젝트가 없다면 그러나 초기화, 실행 git init LSP 진단을 가능하게. 그렇지 않으면 in-process syntax-only fallback 적용.