Skip to content

v2.0.0

Latest

Choose a tag to compare

@github-actions github-actions released this 28 Aug 00:27
· 2 commits to main since this release
c66268d

2.0.0 (2026-08-28)

Bug Fixes

  • correct every tool to Sherweb's published API contract (#67) (1ae23d7)

BREAKING CHANGES

  • tool input schemas changed. sherweb_catalog_list_products
    now requires customerId; sherweb_billing_payable_charges takes date instead
    of billingCycleType/periodFrom/periodTo; page/pageSize and the customers
    search pagination parameters are removed; and
    sherweb_subscriptions_change_quantity returns an async receipt rather than a
    completed change. The previous parameters had no effect, since the endpoints
    they were sent to did not exist.

  • refactor: share result helpers and derive the category registry

Cleanup pass over the endpoint-contract fix. No change to which endpoint any
tool calls.

  • Extract jsonResult/errorResult/findByKey/matches and the shared date-param
    description into utils/types.ts. The four domain handlers were spelling out
    {content:[{type:"text",text:JSON.stringify(x,null,2)}]} 11 times and the
    isError shape 7 times, and each had hand-rolled its own fetch-collection /
    find-by-id / not-found sequence.
  • Give the "there is no GET /customers/{id}" workaround one owner: export
    findCustomer from domains/customers.ts and call it from the subscription
    card lookup, which had a verbatim second copy.
  • Derive the lazy-loading category registry from handler.getTools() instead of
    hand-listing tool names, and single-source the domain descriptions as
    DOMAIN_DESCRIPTIONS. The hand-written copy had already drifted in the
    previous commit: two of four descriptions still read the pre-fix wording.
    A tool missing from that list fails asymmetrically -- advertised by
    sherweb_list_category_tools, rejected by sherweb_execute_tool -- so
    endpoints.test.ts now pins that every exposed tool resolves to a domain.
  • Run the subscription-details fetch and the card's customer lookup
    concurrently; they share only customerId, so serializing them was pure
    latency. The details payload has no customer name, so the second request is
    genuinely required.
  • Unify the two copies of the "no search -> return everything" branch, which
    had silently diverged: the customers path dropped sibling response fields
    while the catalog path preserved them. Both preserve them now.
  • Delete elicitSelection/elicitText/ElicitOption, dead since the parameters
    they prompted for (billing cycle, product search) turned out not to exist in
    the Sherweb API. Correct the card.builder docblock, which still cited the
    removed /customers/{id} endpoint.
  • Drop the hand-built params objects that re-did the undefined-skipping
    utils/client.ts already does, and log at the call sites so charge_details and
    customers_get stop emitting another tool's label.

Deliberately not done: no response caching or memoization was added. The
collection-per-lookup cost is real, but a shared cache here would have to be
tenant-keyed, and this codebase removed a cross-tenant token cache two commits
ago (3ee79d9) -- not worth reintroducing that shape for a latency win. List
results are also still unbounded; capping them is a behavior change worth
deciding separately.

  • ci: adopt the fleet reusable CI workflow (no PR ever ran the tests)

release.yml already states that "PR-time lint/test gating is each repo's
ci.yml concern" -- but no ci.yml existed, so that concern had no owner. The
repo's only two workflows were mcp-assert.yml (boot + canary tool) and
release.yml (release path, main-only), which means npm test, npm run lint and
npm run typecheck have never run on a pull request here.

That is the same shape as the bug this branch fixes: the endpoint-contract
defect shipped past 33 green tests, none of which asserted an outbound URL --
and no automation was running them in either case. The new URL-asserting
contract tests would have caught it, and without this file they would never
have executed in CI either.

Adopts wyre-technology/.github mcp-server-ci.yml, pinned to adad2aa6 (the
current head of that file, 2026-08-07, which adds the process.env
credential-mutation guard). Defaults cover the Node 22/24 matrix, lint,
typecheck, build, unit tests, and that guard. Pre-flighted the two inputs that
could fail on this repo before enabling them:

  • credential-mutation guard: grep for process.env assignment in src/ is clean
    (the only such assignment is in s2s-guard-ordering.test.ts, which the
    guard's own exclusion list skips).
  • lint-destructive-warnings: left off -- this repo has no
    scripts/lint-destructive-warnings.mjs.

docker-smoke-test is on so Dockerfile breakage surfaces at PR time instead of
at release time; release.yml builds the same image on main. Integration inputs
are left empty because every test here is hermetic (fetch is stubbed), so
there is no vendor secret to gate on.

mcp-assert.yml stays: boot-and-list is a genuinely different signal from the
test suite, and it caught nothing wrong here only because the failure was in
the request URLs rather than the tool list.