Repository navigation
feat(api): site-scoped public API contract and beta hardening - #37
Merged
Merged
Conversation
Adapt handlers to MRTR response enums, result metadata defaults, and renamed session configuration. BREAKING CHANGE: MCP handlers now target rmcp 3 response types.
Refresh workspace, dashboard, and web package ranges with Bun lockfile. BREAKING CHANGE: TanStack Table 9 and framework majors require API migrations.
Register table features and row models explicitly under the v9 API. BREAKING CHANGE: Data table integration now uses TanStack Table 9 APIs.
Use the current Orama static client and remove the obsolete direct Orama setup.
Keep inline animation styles compatible with updated React type definitions.
… and MCP
Move public REST under /api/v1/sites/{site_id}, add preview/publish scopes,
optimistic entry versions, typed gRPC payloads, signed upload replay
protection, and drop schema/webhook management from public adapters.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
update_public_entry and update_singleton recorded their HeaderMap in the instrument span, writing bearer tokens, session cookies and CSRF tokens to the log files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deferred transactions that read before writing failed the lock upgrade with SQLITE_BUSY immediately, bypassing busy_timeout, so concurrent edits returned 500. Begin SQLite write transactions with BEGIN IMMEDIATE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
One baseline migration per backend. Cross-site ownership is now enforced declaratively with composite foreign keys instead of trigger sets; entry versions, per-field file references and signed upload uses are part of the baseline. Drop legacy-archive restore defaults and the upgrade guard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Site settings, schema write, webhook and deployment scopes only guarded dashboard-only operations that tokens can no longer reach. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Negotiate the session-lifecycle revisions again, and let the stdio proxy forward the client's own protocol version instead of stamping 2026-07-28 on every message, which broke initialize for every stdio client. Re-apply input schema cleanup in tools/list and return object-shaped structured output from list_sites and list_singletons. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 403s name the missing token scope; hard-denied actions say tokens cannot reach them - unknown collection slugs return 404 from the entry list - public entry and file lists continue only through cursors; malformed cursors get their own 400 message - drop token branches from dashboard-only entry handlers and OpenAPI annotations from handlers the public spec does not include Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- content and definitions are google.protobuf.Struct and timestamps are google.protobuf.Timestamp; the JSON-text and string-timestamp twins are gone - every list pages with page_size/page_token only, revisions included - every site-scoped request requires site_id; no implicit site from a site key - files carry delivery URLs instead of storage keys; DeleteResponse reports deleted and missing ids return NOT_FOUND - token verification reuses the REST verifier, so gRPC no longer keeps its own copy, and permission errors name the missing scope - uploads honour the live instance upload limit Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The root now exposes only sites and site(id:). site(id:) is a namespace: each nested field authorizes its own action, so a content-only token reads entries without site.read, matching REST. Move entry, collection, file, file reference and revision reads onto Site; drop currentSite, the flat root queries, the X-VCMS-Site header, unsupported filter/orderBy inputs, fake page cursors and unreachable batch file mutations. Rename Collection.entry to entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Public REST and MCP shared the 100-per-minute login limiter, so a site build could lock out sign-in and hit 429 quickly, while GraphQL and gRPC had no limit at all. Content APIs now share a separate per-client limiter (1200 requests per minute) and login keeps its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- orphaned storage/trait_def.rs, never compiled into the crate - repository field-rename migration and file reference methods with no callers - read-only search index mode, now that vcms mcp stdio proxies over HTTP - Services::new_read_only and unused backup, storage, content-type, error and test helpers Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every other read in every protocol uses include_drafts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- authentication: scope table, credential types, and the per-protocol site selection rule - REST, GraphQL, gRPC and MCP guides rewritten for site-scoped reads, conditional updates, cursor and token paging, and supported MCP revisions - files: uploads in every protocol and how references are tracked - webhooks and deployments are dashboard-only - queries and errors: versions, problem+json, rate limits - fold the coverage table and known limits into the reference pages and drop the unlinked architecture page Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CLAUDE.md and AGENTS.md had drifted apart and both described removed migrations, env vars, test files and the old API key model. Merge them into an accurate AGENTS.md and import it from CLAUDE.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 225 files, which is 125 over the limit of 100. To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. This review couldn't start because sufficient usage credits or metered capacity aren't available. Add credits or update usage-based reviews in the billing tab, then retry. ⚙️ Run configuration
⛔ Files ignored due to path filters (11)
📒 Files selected for processing (225)
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…-0285 Run cargo update across the workspace. Notably h2 0.4.15 -> 0.4.20 (unbounded empty DATA frames) and rustls 0.23.43 -> 0.23.45 with rustls-webpki 0.103.15 (TLS 1.3 handshake messages accepted across encryption levels). rmcp 3.5 renames ServerInfo to ServerConfig. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
croner 4 rejects shortcut step syntax such as 5/5; write 5-59/5. The dashboard presets are unaffected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Parameters are RefOr values in utoipa 6. Also mark the injected site_id path parameter as required, which OpenAPI demands of path parameters. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
object_store 0.14.2 depends on quick-xml 0.41, which fixes RUSTSEC-2026-0194 and RUSTSEC-2026-0195. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Clears the open Next.js advisories (image optimizer and next/og RCE, server action SSRF and DoS, cache confusion). The site is a static export, so production was not exposed, but next dev was. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deploying cms with
|
| Latest commit: |
95ea5fd
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://6be05a4d.cms-8f5.pages.dev |
| Branch Preview URL: | https://api.cms-8f5.pages.dev |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Makes the public API one site-scoped contract across REST, GraphQL, gRPC and MCP, fixes the issues found in an audit of the branch, and rewrites the API docs to match.
Contract
/api/v1/sites/{site_id}/…, GraphQLsite(id:)plus mutationsiteId, gRPCsite_id, MCPsite_id.site.read,schema.read,content.read,content.preview.read,content.write,content.publish,files.read,files.write,mcp.use. Scopes for dashboard-only areas are removed.include_draftsandcontent.preview.read. Entry and singleton updates accept an expected version (RESTIf-Match).sitesandsite(id:).site(id:)is a namespace whose fields each authorize themselves.Struct/Timestamp, token paging, and file URLs. The JSON-text twin fields are removed.Fixes
database is locked; write transactions now useBEGIN IMMEDIATE.2025-06-18/2025-11-25clients, and the stdio proxy brokeinitializefor all of them.tools/liststopped cleaning input schemas.Cleanup
AGENTS.mdis the single agent guide;CLAUDE.mdimports it.Breaking for existing dev setups
The baseline migration changed, so delete local
vcms_data/before running. The product has not launched, so this PR carries no data migration.Test plan
cargo fmt --check,cargo clippy --no-default-features --all-targets -- -D warningsbun run test:pg), run before the rate-limit and cleanup commitsbiome ci; web build2026-07-28MCP handshakes over HTTP and stdio🤖 Generated with Claude Code