Skip to content

chore(release): 0.9.0 (also lands #36, #37, #38) - #39

Merged
imbenrabi merged 15 commits into
mainfrom
claude/project-thread-1w8fky-release-0-9-0
Nov 5, 2026
Merged

imbenrabi merged 15 commits into
mainfrom
claude/project-thread-1w8fky-release-0-9-0

Conversation

@imbenrabi

Copy link
Copy Markdown
Contributor

Requested by Ben · project thread

Read first: #36, #37 and #38 are not on main yet

#35 merged into main, but #36 (vite-plugin-dts 5), #37 (CI on Node 26) and #38 (JSON Schema tools) were still based on #35's branch, so GitHub merged them into that branch, not into main. main currently holds only #35 (5b27848). This PR carries the already-reviewed merge commits of those three (claude/project-thread-1w8fky, merged with current main) plus the release commit, so one merge lands everything.

Merge order

  1. Merge this PR into main (base is main; there is nothing to merge before it). Do not merge chore(deps): update vite-plugin-dts to ^5.1.2 (stacked on #35) #36–fix: advertise and validate JSON Schema tools via fromJsonSchema (T3) #38 again.
  2. Tag v0.9.0 on main HEAD (Ben, after saying so; nothing is tagged or published here).

What changed

Verification (Node 26.13.0, this branch)

  • npm run typecheck ✔, npm run build ✔, npm run test:run ✔ 433 tests (27 files, includes multiClient.e2e, jsonSchemaTools.e2e, dependencies).
  • npm audit: 0 vulnerabilities; npm audit --audit-level=critical ✔.
  • Smoke demos against the built source: DYNAMIC, STATIC (TOOLSETS=ALL), permission-config, permission-header all pass.
  • npm publish --dry-run: toolception@0.9.0, 64 files, 110.9 kB, only dist/, README.md, CHANGELOG.md, LICENSE, package.json. dist/index.js imports @modelcontextprotocol/server, /server/validators/ajv, /node, zod, fastify, @fastify/cors and bundles none of them.
  • Release notes extraction used by release.yml (awk on ## [0.9.0]) yields a non-empty entry (23 lines).
  • Versions: package.json = package-lock.json (both entries) = 0.9.0; changelog heading 0.9.0; engines >=25.3.0 unchanged.

After the tag

The FMP server's S1 PR (imbenrabi/Financial-Modeling-Prep-MCP-Server#126) points at toolception ^0.9.0 and must not merge until 0.9.0 is on npm and npm run verify:toolception -- --source 0.9.0 passes there.


Generated by Claude Code

claude and others added 15 commits November 4, 2026 11:58
Clears the sprintf-js / minimatch advisories reported through vite-plugin-dts 4
(@microsoft/api-extractor, @vue/language-core). api-extractor 7.60.1 is the
latest release and still pins minimatch 10.2.3 (GHSA-g3hv-75wg-m249), so an
override moves only that dev-only dependency to minimatch ^11.0.1. The built
dist (declarations and bundle) is identical to the previous build.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGSYMuTcM7fquxzRook
vitest 5 declares node ^22.12 || ^24 || >=26, so the pinned Node 25.3.0 is
outside its supported range. Use Node 26 in ci.yml and release.yml; `engines`
stays >=25.3.0 so consumers are unaffected.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGSYMuTcM7fquxzRook
JSON Schema inputSchema values registered as an open object, so clients
saw no parameters and arguments were not validated. They now go through
the SDK v2 fromJsonSchema(), with one validator per DynamicToolManager so
a client's schemas (and $id values) never cross to another client.
Schemas that do not compile, or are not a Zod 4 shape or a JSON Schema
object, fail the toolset's enable with E_VALIDATION.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGTprrczjscL9XyWxYz
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGSYMuTcM7fquxzRook
Drop the root $id before compiling so tools sharing one $id keep their own
validator, make the per-manager validator an eager field, pin test
assertions, and add rollback, same-$id and concurrent-client tests.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGTprrczjscL9XyWxYz
Copy the schema only when a root $id must be dropped so Ajv's identity
cache still hits, pin the per-manager validator with a constructor spy,
tighten docs and assertions, and cover absolute $refs to a nested $id.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGTprrczjscL9XyWxYz
…-dts

chore(deps): update vite-plugin-dts to ^5.1.2 (stacked on #35)
…-node

ci: run CI and release on Node 26 (stacked on #35)
fix: advertise and validate JSON Schema tools via fromJsonSchema (T3)
Version 0.9.0 in package.json and package-lock.json, and the [0.9.0] changelog
entry for the MCP SDK v2 / Zod 4 move (#35), vite-plugin-dts 5 (#36), Node 26
CI (#37) and validated JSON Schema tools (#38).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VmUXGSYMuTcM7fquxzRook
@imbenrabi imbenrabi self-assigned this Nov 5, 2026

Copy link
Copy Markdown
Contributor Author

TS review: pipeline-ts-reviewer (feature-pipeline)

Verdict: APPROVE (round 1, no CRITICAL/HIGH/MEDIUM). Static review of the diff against main. Checked: the [0.9.0] heading is exactly what release.yml's awk extracts and is non-empty; every consumer-visible change from #35, #36, #37 and #38 is in the changelog with correct links, breaking items marked and migration notes present; package.json and both package-lock.json entries are 0.9.0 (npm view shows 0.8.0 as the only published version); README, AGENTS.md invariants 7 and 9 and the TSDoc match DynamicToolManager.ts; no new any or non-null assertions in src, no TODO/debug leftovers.

# Sev Location Finding Disposition
1 LOW src/core/DynamicToolManager.ts ~L486-494, CHANGELOG [0.9.0], src/core/AGENTS.md inv. 7 Docs say a shape mixing Zod and non-Zod values fails with E_VALIDATION; a mixed shape that also carries a key type: "object" would go to fromJsonSchema() instead. Left unchanged: the input is a malformed schema that is very unlikely in practice, and this code and wording were already reviewed in #38's own thread. Not worth another push and a re-review of this release PR; it can be tightened in a follow-up if it ever shows up.
2 LOW tests/e2e/jsonSchemaTools.e2e.test.ts EOF Extra trailing blank line (cosmetic). Left unchanged: cosmetic, in a file owned by #38.
{
  "recommendation": "APPROVE",
  "summary": "Release PR is consistent: CHANGELOG [0.9.0] is complete, correctly linked and extractable by release.yml, versions are aligned at 0.9.0, docs match DynamicToolManager.ts, and the new code meets the TS/karpathy standards with only two LOW nits.",
  "findings": [
    { "severity": "LOW", "file": "src/core/DynamicToolManager.ts", "line": 489, "issue": "A mixed Zod/non-Zod shape that also carries type: \"object\" is routed to fromJsonSchema() rather than failing with E_VALIDATION; negligible edge." },
    { "severity": "LOW", "file": "tests/e2e/jsonSchemaTools.e2e.test.ts", "line": null, "issue": "File ends with an extra trailing blank line (cosmetic)." }
  ]
}

Generated by Claude Code

@imbenrabi
imbenrabi merged commit 7ba8405 into main Nov 5, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants