The second v2/main → main milestone merge, cutting 2.2.0.
main currently holds 2.1.0 (merged via #1903 / #1876). Since then v2/main has accumulated 27 merged PRs (91 non-merge commits) spanning the v2.2.0 and v2.3.0 milestone work that has already closed.
Scope
- Branch from
main, merge origin/v2/main (verified locally: clean, zero conflicts).
- Bump the root
package.json 2.1.0 → 2.2.0 (--no-git-tag-version; the clients/* packages carry no version).
- Open a PR against
main, run npm run ci green on the merged tree.
- After merge: draft a GitHub Release for tag
2.2.0 targeting main — publishing runs pack:verify, asserts the tag matches package.json, and publishes the latest dist-tag.
Version note
main is at 2.1.0 and the v2.2.0 milestone has not shipped, so this release takes the next sequential number, 2.2.0, rather than 2.3.0 — even though the payload also contains v2.3.0 work that landed early (#1988, #1956).
The five issues still open on the v2.2.0 milestone (#1973, #1942, #1941, #1940, #1939 — the Windows/flake cluster) are not in this payload and should be moved to a later milestone as part of closing it out.
Payload highlights
| Group |
PRs |
| Packaging / install correctness |
#1934 (ship clients/web/static, #1859), #1983 (bundle React-rendering TUI deps, #1952), #1971 (root-only MCP SDK deps, #1970), #1962 (zod lockstep) |
| SDK |
#1989 (MCP TypeScript SDK 2.0.0-beta.5 → 2.0.0) |
| Protocol / runtime fixes |
#1963 (forward Mcp-Protocol-Version through the proxy), #1967 (modern listen stream), #1946 (Firefox SSE hang), #1975 (structuredContent in Tools), #1961 (duplicate tool names), #1972 (number-field typing), #1954 (surface list-fetch errors) |
| Secrets / keychain |
#1945, #1948 (degrade instead of crash on unsupported platforms) |
| Test stability |
#1986 (leaked Mantine timers), #1987 (dead-session race), #1958, #1978 (throwaway smoke catalog) |
| Docker |
#1974 (loopback by default, writable mounted state dir) |
| CI / tooling |
#1966 (pin actions, gate claude.yml), #1976, #1968 |
| Docs |
#1960 (v1 → v2 migration guide), #1981 (roadmap), #1982 (DCO), #1932 (triage rules) |
The second
v2/main→mainmilestone merge, cutting 2.2.0.maincurrently holds 2.1.0 (merged via #1903 / #1876). Since thenv2/mainhas accumulated 27 merged PRs (91 non-merge commits) spanning the v2.2.0 and v2.3.0 milestone work that has already closed.Scope
main, mergeorigin/v2/main(verified locally: clean, zero conflicts).package.json2.1.0 → 2.2.0 (--no-git-tag-version; theclients/*packages carry no version).main, runnpm run cigreen on the merged tree.2.2.0targetingmain— publishing runspack:verify, asserts the tag matchespackage.json, and publishes thelatestdist-tag.Version note
mainis at 2.1.0 and the v2.2.0 milestone has not shipped, so this release takes the next sequential number, 2.2.0, rather than 2.3.0 — even though the payload also contains v2.3.0 work that landed early (#1988, #1956).The five issues still open on the v2.2.0 milestone (#1973, #1942, #1941, #1940, #1939 — the Windows/flake cluster) are not in this payload and should be moved to a later milestone as part of closing it out.
Payload highlights
clients/web/static, #1859), #1983 (bundle React-rendering TUI deps, #1952), #1971 (root-only MCP SDK deps, #1970), #1962 (zod lockstep)Mcp-Protocol-Versionthrough the proxy), #1967 (modern listen stream), #1946 (Firefox SSE hang), #1975 (structuredContentin Tools), #1961 (duplicate tool names), #1972 (number-field typing), #1954 (surface list-fetch errors)claude.yml), #1976, #1968