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
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Precision code intelligence now ships in the base install.find_refs / rename_symbol precision used to live behind an optional lsp extra
(serena-agent, 33 transitive dependencies) that uvx chad-code never installed —
so every published install ran name-match only. chad now drives language servers
through its own ~350-line LSP client (lspclient.py) plus a declarative registry
(lspservers.py, the nvim-lspconfig shape): pyright via uvx (guaranteed present on
the uvx install path), the TypeScript 7 native LSP via npx, gopls / rust-analyzer /
clangd / solargraph / intelephense from PATH. Zero new Python dependencies; the lsp extra and serena-agent are gone. Servers that would answer confidently-wrong
empties without project context (clangd without compile_commands.json, TS without
a tsconfig) are refused, keeping the honestly-labeled name-match fallback.
Qualified symbol paths in every language.view_symbol("Engine/process"), replace_symbol("Engine.process", …) etc. now resolve the method — not a same-named
free function — in Python, TS/JS, Go, Rust, Java, Ruby, C#, PHP, Kotlin and C++
alike, via scope chains derived from tree-sitter spans (plus receiver/impl context
for Go/Rust/C++, whose methods don't nest lexically). This was Python-only via
jedi before; jedi is deleted and every language takes one code path (verified
against jedi on this repo: 230/230 span-identical). A qualified path whose
container doesn't match is now a miss instead of silently editing the bare name.
Broken grammars fixed for 4 of 12 fixture languages — and shell added outright.
First polyglot measurement found the language pack ships NO tags query for
TypeScript/TSX, a PHP query that doesn't compile against the current grammar, C
with no reference captures, and C++ missing out-of-class method definitions. chad
now carries its own tags queries for those (repomap._TAGS_OVERRIDE), plus a new
bash query the pack never had: shell functions and top-level variables now appear
in repo_map/overview, find_refs finds invocations across scripts, and replace_symbol edits a shell function by name — shell is the one surface nearly
every real repo (and 89 of 91 terminal-bench-2.1 tasks) contains. All pinned by a
13-language coverage test.
Post-edit typecheck in the edit result. When a language server is warm, every
edit/symbol-edit result appends the server's type errors (errors only, capped,
~50 tokens) — a type error surfaces immediately instead of one failed test run
later. Edits never pay a cold server start (lever: post_edit_diagnostics).
New hover tool. The resolved type signature + docs of one symbol via the
language server — one line instead of opening the defining file.
mcp 2.x, single code path. The mcp<2 cap (below) was serena-agent collateral;
with serena gone chad runs natively on mcp 2.0 (protocol 2026-07-28). The two
renames that fail silently through getattr defaults (isError→is_error, readOnlyHint→read_only_hint) are each pinned by a test that fails on the 1.x
spelling.
Fixes a broken install.uvx chad-code (and any other fresh resolve) crashed on
startup with ImportError: cannot import name 'streamablehttp_client'. The mcp
dependency was unbounded, so a clean resolve picked up the SDK's 2.0 major, which
removed the HTTP transport chad uses, moved to httpx2, and split the wire types into
a separate distribution. (The cap has since become the deliberate 2.x port above.)
A broken MCP SDK can no longer take the agent down. Every other MCP failure already
degraded — a server that's missing, misconfigured, or crashing costs you its tools and
nothing else — but the SDK import itself ran unguarded at chad.mcp load, which happens
on every Agent. It's guarded now: an incompatible SDK means no MCP tools plus one
warning line in /mcp, and the rest of chad runs. Relatedly, /mcp no longer reports
"no MCP servers configured" when servers are configured but all failed — it shows the
warnings that explain why.
CI now catches this class of break. The fresh-resolve job and the weekly install
canary only ran chad --help, which exits inside argparse and never imports the modules
that load on the first turn. Both now import every chad submodule against a clean
resolve and fail if the MCP SDK guard fires.