Repository navigation
feat: v8 framework packages — @decocms/tanstack, @decocms/nextjs, @decocms/compat-v7, /preview, lockstep release and the migrator - #722
Merged
Conversation
…695) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/blocks-preview-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…r, decoTanstack) (#696) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/tanstack-v8-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…draft names and Studio origins, withDeco() and a platform-neutral image loader (#697) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/nextjs-v8-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…blocks at 8.3.0 (#699) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/release-8-3-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…cms/nextjs (#700) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/migrator-uses-bindings-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…, scripts and clx (#702) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/compat-v7-core-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…dom (#703) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/compat-v7-matchers-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…#704) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/compat-v7-sections-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/compat-v7-commerce-bindings-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
… loaders, views and image URLs wired (#706) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/migrator-compat-imports-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
…, the page setup, and stubs for v7 runtime (#707) Rebased onto main as one commit per PR (PO, 2026-10-18); the previous history is kept on backup/migrator-invoke-scaffold-2026-10-18. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
The bindings and @decocms/compat-v7 use blocks APIs that 8.3.0 doesn't have (/preview and the rest of this stack), so every package that builds on blocks now takes ^8.4.0, and compat-v7 takes the bindings at ^8.4.0 as well. The release test syncs at 8.4.0 and 8.5.1 and refuses 8.3.x; the migrator writes ^8.4.0 and the docs name 8.4 as the floor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
This was referenced Oct 18, 2026
tlgimenes
marked this pull request as ready for review
October 18, 2026 19:18
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.
This PR replaces the 11 stacked PRs #695 … #707 so the rest of the v8 framework packages land on
mainas one commit and one release, 8.4.0, publishing all 11 packages together:@decocms/blocks,@decocms/tanstack,@decocms/nextjs,@decocms/compat-v7and the seven@decocms/apps-*. Its branch is #707's (feat/migrator-invoke-scaffold), already rebased ontomainwith one commit per former PR and their trees unchanged, plus one commit that raises every@decocms/blockspeer floor to^8.4.0.#693 and #694 are already on
mainand shipped in 8.3.0 (NODE_ENVdev default,deco schema --check, first-match multivariate, the platform-neutral/imagewith@decocms/apps-vtex/imageand@decocms/apps-shopify/image).What lands
#695 —
@decocms/blocks/preview: the draft badge and the Studio bridgeDraftBadge({ pointer, exitHref? }): v7's "Preview mode" pill, unchanged on screen. Renders nothing without a pointer, on the server and inside a frame. The inlined Deco mark is now a 36px PNG (~2KB, v7 inlined ~22KB).StudioBridge({ site, trustedOrigins, editShortcut?, nonce? }): v7'sLiveControlsas one static inline script, so it runs before hydration and a Server Component can render it.trustedOriginsis required; it answers only the parent frame from those origins.@decocms/blocksexports no Studio origins and no draft names: the bindings own them.editShortcut={false}turns it off.#696 —
@decocms/tanstackfor v8@decocms/blocks. Subpaths: root (draft names,draftResponseHeaders,STUDIO_ORIGINS),/worker(createDecoWorker),/server,/start,/router,/react(DecoDocument,NavigationProgress,StableOutlet),/vite(decoTanstack),/scope.createDecoWorker: Studio framing, v7's draft host allowlist (D1), CMS redirects, the edge cache (build + revision + device + segment key, SWR/SIE, never storing private, signed-in or degraded responses), the__csegserver-function cache check, Set-Cookie dedup, immutable assets.onCacheis the only metrics hook (D3); build hash from CI's sha (D4).#697 —
@decocms/nextjsfor v8@decocms/blocks:/proxy(decideDraft,draftProxy, …),/server(bindDraft,contentClient), root (DraftPreviewIndicator,DraftBadge,StudioBridgewith Studio's origins),/config(withDeco),/image-loader(createDecoImageLoader, platform-neutral).isNextDevis gone;createCMSreadsNODE_ENV. PO decision 4: the edit shortcut is on by default. Its own copy of the draft names and Studio origins (PO review of feat(blocks): NODE_ENV dev default, deco schema --check, multivariate stops at the first match #693). Image golden test: 1,212 cases, only the 60 of PO-approved fix 2 (feat: @decocms/blocks/image (platform-neutral) with VTEX and Shopify image providers in their packages #694) change.#699 — lockstep release
.releaserc.jsonpublishes every package inpackages/at one version onlatestfrommain, blocks first, then the bindings.^8.4.0) withworkspace:*only indevDependencies, so a site installs one blocks copy.scripts/sync-versions.mjswrites the version and refuses a plain in-repo dependency or a peer floor above the release.tests/release.test.tschecks the allowlist, the ranges, every export's shape and what each tarball ships; CI runs it on the built dist.#700 — the migrator and skill use the bindings
deco-v7-to-v8-migrationskill move sites onto@decocms/tanstack/@decocms/nextjsinstead of copying v7's worker, draft, bridge and image code.@decocms/tanstack/reactgets v7'sImage,Picture,Source(same props and markup, URLs fromImageUrlProvider); 160 golden markup cases, zero changed.deco schema --checkto the site's CI;decoCdnstrips only a leading asset host and the report lists every URL that changes.#702 —
@decocms/compat-v7: types, device, scripts, clxctx, invoke, request scope), no env reads, nothing added to blocks./types(SectionProps= the loader's awaited return, per the PO),/device,/script,/clx. v7's own files are hash-pinned fixtures and every helper is compared against them over seeded inputs.#703 —
@decocms/compat-v7/matchersrandomis latest 7.x's sticky random on thedeco_segmentcookie (PO decision), keyed by the saved block's name (cohort).#704 —
@decocms/compat-v7/sectionsrunSectionLoaders/runSectionLoader: v7's(props, req)section loaders after a page resolves, with v7's nested walk (deep, ornested: "direct"for 7.77.12 and earlier),__pageUrl/__pagePath, and thedegradedlist. v7's mixins. Readingctxthrows with what to use instead.#705 —
@decocms/compat-v7/commerce,/tanstack,/nextjs/commerce/*: v7's@decocms/apps-commercepure files under the same layout (AST-equal to v7, 5,000 generated inputs each)./tanstackand/nextjs:matcherContext,commitSegmentCookie,cohortSegment,requestDevice,DeviceProvider./tanstack/worker(PO decision 6): v7'swithABTestinglegacy-origin split as acreateDecoWorkerrouteshandler, matched to v7 over 3,000 seeded requests. PO decision 3 checked against the compat random.#706 — the migrator imports
@decocms/compat-v7@decocms/apps-commerceimports onto compat-v7, rewritesctx.device, turnsregisterSectionLoadersintosectionLoadersand wiresloadSections, registers the matchers the content uses and writes the image URLs module.loaderruns, and each one v7 never ran is reported. PO decision 9: blocks are registered under their v7 names only.#707 — the migrator writes invoke, app clients, the page setup and stubs
/deco/invokekey becomes one server function (TanStack StartGETloaders marked private andPOSTactions; Next.js"use server"), imported at each call site.--vtex-invoke keep|v8choice, no default.deco-vtex/-shopify/-wake/-resendapp blocks becomesrc/clients/<app>.ts;src/migration-stubs.tsholds deprecated stubs for v7 runtime with no port; the page setup (src/cms.ts,open-page, the catch-all route) is written per binding.This PR's own commit — peer floors
^8.4.0The bindings and compat-v7 use blocks APIs that 8.3.0 doesn't have (
@decocms/blocks/previewand the rest of this stack), so every@decocms/blockspeer (and compat-v7's optional binding peers) is^8.4.0.tests/release.test.tssyncs at 8.4.0 and 8.5.1 and refuses 8.3.x; the migrator writes^8.4.0; CLAUDE.md, the README and the skill name 8.4 as the floor.Checks
main+ this branch squashed into one commit with this PR's title.semantic-release --dry-run: "Found git tag blocks-v8.3.0 … The next release version is 8.4.0". The prepare step (VERSION=8.4.0 node scripts/sync-versions.mjs && bun run build): 11 manifests at 8.4.0, every peer^8.4.0, all builds exit 0.npm publish --dry-run --tag latestfor all 11:@decocms/blocks@8.4.0…@decocms/apps-wake@8.4.0, each "with tag latest". The 11 tarballs installed together:npm ls @decocms/blocksshows one8.4.0, every other entry deduped; no required peer is unmet.bun run check,bun run build,skills:check,skills:readme:check,bun test tests/release.test.ts(42 pass), the compat-v7 tests (13 files, 153 pass), andbun run testunder a 2 GB cap: 122 files pass, 1 skipped; 2,746 tests pass, 95 skipped, 0 fail.Landing
feat:title. The squash message is the PR body (repo setting), so this body is what commit-analyzer reads: onefeat:, a minor release.latestfor all 11 packages.@decocms/tanstack,@decocms/nextjsand@decocms/compat-v7acceptsmain's.github/workflows/release.yml. The bindings were last published from the 7.x branch: npm's trusted publisher names the repo and workflow file, not a branch, somainshould be accepted, but if either is tied to a GitHub environment, add it formainfirst. compat-v7's trust config already exists and its0.0.0placeholder is published.Once this lands, the 11 stacked PRs can be closed.
npm commands for the PO after the release (not run)
No
latest-7command is needed: #698 already movedlatest-7to 7.80.2 for both bindings.latestmoves to 8.4.0 by itself when the release publishes.Checks afterwards:
🤖 Generated with Claude Code
https://claude.ai/code/session_016ZsmzpZ2zahRBoATBb2tBu
Summary by cubic
Replaces PRs #695–#707 so the v8 framework packages land as one commit and one release: 8.4.0 publishes all 11 packages together (
@decocms/blocks,@decocms/tanstack,@decocms/nextjs,@decocms/compat-v7, and the seven@decocms/apps-*). The v7-to-v8 migrator and its skill now move sites onto these bindings instead of copying v7's worker, draft, bridge, and image code into the site.What ships
@decocms/blocks/preview: the draft badge and Studio bridge, as one static inline script that runs before hydration.@decocms/tanstack: the TanStack Start binding on Cloudflare Workers — drafts, edge cache, CMS redirects, draft names and Studio origins.@decocms/nextjs: the Next.js App Router binding — draft proxy, content client, image loader, Studio bridge, without hosting assumptions.@decocms/compat-v7: v7's pure helpers (types, device, scripts, clx, matchers, section loaders, commerce files) with v7's output, so migrated sites stop keeping their own copies./deco/invokecalls into server functions, writes the page setup per binding, registers v7 matchers and section loaders, and reports everything left for a person.Release and migration
latest; every package that builds on blocks takes it as a^8.4.0caret peer, so a site installs one blocks copy.latest-7;nextdist-tags and misplaced8.0.0/prerelease deprecations must be cleaned up after release (commands in the PR body).Written for commit 6195fe5. Summary will update on new commits.