You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+54Lines changed: 54 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,6 +4,59 @@ All notable changes to this project will be documented here.
4
4
5
5
Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versioning: [SemVer](https://semver.org/).
6
6
7
+
## [1.2.0] — 2026-04-22
8
+
9
+
### Added
10
+
-`bin/adapters/sbt-thin-client.js` — persistent-JVM sbt adapter. Activated via `SBT_DIRECT_MODE=thin-client` or `--mode thin-client`. Coordinator spawns `sbt` in server mode once per workspace and proxies each `/call` through `sbt --client "<task>"`; warm calls land in 200-500ms vs 20-40s one-shot cold. Adoption: attaches to an externally-running `sbt shell` if `target/active.json` + live socket detected. Requires `install.sh` allowlist for ipcsocket paths (pre-merged into `sandbox.filesystem.allowWrite`).
11
+
-`hooks/prewarm-direct-wrappers.py` — SessionStart hook. Iterates `~/.cache/*-direct/*/` slots, probes each with `GET /health`, fires `<wrapper>-direct start <workspace>` in the background for any dead slot. First `call` in a new session is warm.
12
+
-`install.sh` — wires the prewarm hook into `~/.claude/settings.json`'s `hooks.SessionStart` (idempotent, `unique_by(.command)`). `uninstall.sh` removes it symmetrically.
13
+
-`scripts/verify.sh VERIFY_STRICT_SHA=1` — env-gated strict mode for CI. Default (unset/0) treats sha256-body mismatch as a warning so downstream users on different pyright/tsserver/csharp-ls versions don't fail the gate; structural-shape match (top_level + total_nodes) remains hard either way. CI workflow exports `VERIFY_STRICT_SHA=1`.
14
+
-`bin/tool-harness.js` — shared coordinator primitives: `resolveWorkspace`, `stateDir`, `freePort`, `serveHttp`, `invalidationLoop`, `callLog`, plus `framing` readers/writers (contentLength, jsonLine, tsserverMixed) and a `jsonRpcClient` correlation helper
-`MIGRATION.md` — describes the refactor, back-compat guarantees, rollback tags
28
+
-`CONTRIBUTING.md` — new "Architecture overview" + rewritten "Hybrid servers" + "Non-LSP tools" sections covering the adapter contract for both module families
29
+
30
+
### Changed
31
+
-`bin/lsp-stdio-proxy.js` body replaced with composition of `tool-harness` + `tool-server-proxy` + `adapters/lsp-stdio`. Steady-state response shape + state-dir layout byte-identical; CLI unchanged. External Node importers keep working — the file name and argv contract are preserved.
32
+
-`bin/vue-direct-coordinator.js` body similarly replaced, now composing `tool-harness` + `tool-server-proxy` + `adapters/vue-hybrid`. Vue LS v3 + tsserver bridging preserved verbatim (configurePlugin → warmup → init order, tsserver/request↔response tuple unwrap + double-wrap).
33
+
-`bin/py-direct`, `bin/ts-direct`, `bin/cs-direct`, `bin/java-direct` now pass `--tool-name <wrapper>` so the harness's `stateDir` resolves to the wrapper's existing slot instead of drifting to `~/.cache/lsp-stdio-proxy-direct/…`.
34
+
-`scripts/install.sh` symlinks the new shared modules + adapters dir + 5 opt-in wrappers + their coordinators. Merges new permission entries + sandbox-write allowlist entries for the new cache dirs.
35
+
-`README.md` lists the new opt-in wrappers; architecture section restructured (layout vs behavior) to describe the three-module split.
36
+
37
+
### Fixed
38
+
- Prettier/eslint adapter preload now consults `npm root -g` so globally-installed packages are picked up when the workspace has no local install.
39
+
- Stale-config bugs on existing LSP wrappers: touching `tsconfig.json`/`pyrightconfig.json`/`*.csproj`/`pom.xml`/`package.json` triggers `workspace/didChangeConfiguration` + `workspace/didChangeWatchedFiles` without a stop/start cycle. Hard-trigger files (`.env`, `.jvmopts`, `global.json`, `pnpm-lock.yaml`, `.python-version`, `.java-version`, `dotnet-tools.json`) force coordinator restart on next call.
-`sbt-direct call version {}` reads a real Play 3 / Scala 3 project's `build.sbt` → `{exit: 0, stdout: "sbt version in this project: 1.11.6\nsbt runner version: 1.10.11"}`.
51
+
-`sbt-direct call task {"task":"scalafmtCheckAll"}` against the same project runs the sbt-scalafmt plugin end-to-end, correctly surfaces per-file formatting diagnostics. Under Claude Bash sandbox, `install.sh` pre-allows `/private/var/folders/**/.sbt/**` + `~/.sbt/**` + `~/.ivy2/**` + `~/.coursier/**` so sbt's BootServerSocket + dependency caches write without `dangerouslyDisableSandbox`.
52
+
-`scalafmt-direct call check-files {...}` against a version-matched fixture → `{exit: 0, stdout: "All files are formatted with scalafmt :)"}`.
See `docs/architecture.md` for the full adapter contract.
18
+
3
19
## Adding a new language
4
20
5
21
Minimal steps for a standard stdio LSP (server speaks LSP over `--stdio`, no hybrid coordination):
@@ -53,11 +69,46 @@ Add the new language to the primary-path table.
53
69
54
70
## Hybrid servers (require paired processes)
55
71
56
-
If the target LSP requires a paired companion process (like Vue LS v3 + tsserver + `@vue/typescript-plugin`), the generic `lsp-stdio-proxy.js` isn't enough. Write a dedicated coordinator modeled on `bin/vue-direct-coordinator.js`:
57
-
- Spawn both children
58
-
- Bridge any custom cross-server notifications
59
-
- Expose the same HTTP surface (`POST /lsp`, `GET /health`)
60
-
- Wire the bash wrapper to point at your new coordinator instead of `lsp-stdio-proxy.js`
72
+
If the target LSP requires a paired companion process (like Vue LS v3 + tsserver + `@vue/typescript-plugin`), the generic `lsp-stdio-proxy.js` isn't enough. Write a dedicated adapter in `bin/adapters/<name>.js` declaring two child specs:
0 commit comments