chore: version packages - #324
Merged
Merged
Conversation
This was referenced Aug 8, 2026
omridevk
added a commit
that referenced
this pull request
Aug 8, 2026
…ror body text (#329) The outcomePattern for codex pinned OpenAI's full 401 body ("Missing bearer or basic authentication in header") plus the cf-ray tail, both of which we don't own and which OpenAI changed, breaking the assertion on every CI run and blocking #324 (tracked in #327). The regex now keeps only what's ours to assert: the "Reconnecting... N/M" banner shape, "unexpected status 401 Unauthorized", and the wss://api.openai.com/v1/responses URL. Note the 401 path is unreachable on a machine with a real codex login (an authenticated run gets a normal reply instead of the reconnect banner), so this can only be proven end-to-end in CI, which runs without credentials. Fixes #328 Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
github-actions
Bot
force-pushed
the
changeset-release/main
branch
from
August 13, 2026 18:26
4e4ffcd to
4a8e442
Compare
omridevk
added a commit
that referenced
this pull request
Aug 13, 2026
…oving merge ref RCA on a false positive on this PR's own run: check-changesets --require-coverage reported every published package as touched, when the PR's actual diff only touches packages/publish (private), workflow files, and pnpm-lock.yaml. Confirmed mechanism (not the suspected H4a dependency-attribution direction or a root-package inversion - both refuted by evidence): pull_request's default actions/checkout ref is the ephemeral merge of the PR head into the CURRENT tip of main, not the PR branch alone. `--base` is pinned to github.event.pull_request.base.sha, a snapshot from when the event fired. Between that snapshot and the job actually running, `chore: version packages (#324)` landed on main - a changesets release bumping every package.json (a code extension) and CHANGELOG.md across all 38 published packages. Diffing the stale base against the moving merge commit swept in that unrelated release, reproduced locally via `git diff --name-status --no-renames <stale-base>...<merge-ref>`. Fix: pin the checkout to `ref: ${{ github.event.pull_request.head.sha }}` so both sides of the diff are fixed commits, independent of what lands on main afterward. Added regression coverage in packages/publish/test/: root-level files (lockfile, workflow) plus a dependent-less private package change passes with zero changesets, alongside the existing case where a private package a published package genuinely depends on (workspace:*) still requires coverage. Also confirms buildDependencyGraph only follows workspace:* edges (not ordinary semver ranges) and that the workspace root itself is never enumerated as a package. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
omridevk
added a commit
that referenced
this pull request
Aug 13, 2026
* ci: gate changeset package names before merge (#316) Add a `check-changesets` guard (same shape as assertPublicSet) that parses every .changeset/*.md frontmatter and asserts each named package resolves against the workspace. Wire it into the repo checks CI job and into `conciv-publish version`, so an invalid changeset (e.g. `'conciv': patch`) fails a PR check instead of silently detonating `changeset version` in the post-merge release job, which is what happened in #274/#315. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(publish): parse changesets with @changesets/parse Swap the hand-rolled frontmatter regex for the library changesets itself uses to parse .changeset/*.md, so assertChangesetsResolve accepts exactly what `changeset version` accepts. Duplicate package entries now surface as the library's own YAML "duplicated mapping key" error (wrapped with the filename) instead of a bespoke check; unquoted and double-quoted entry names both flow through to workspace-name validation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci(release): commit version bumps via the GitHub API, not a persisted credential commitMode: github-api (supported by the pinned changesets/action v1.9.0) pushes the version commit/tags through the GitHub API instead of the git CLI: commits and tags come back GPG-signed and attributed to the token's identity, and setupGitUser: false skips configuring a git user that would otherwise go unused. The job's checkout no longer needs a persisted git credential (persist-credentials: false), so the zizmor artipacked suppression is no longer needed. Also documents that cancel-in-progress's mid-publish cancellation window is safe because `changeset publish` is resumable per package. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * feat(publish): check-changesets --require-coverage gates PRs without a changeset New conciv-publish check-changesets --require-coverage --base <ref> flag: diffs <base>...HEAD, and if any non-test code file inside a published package (manifest private unset/false) changed, requires at least one changeset naming any @Conciv package (fixed versioning releases the whole set together, so one entry suffices). Failure lists every uncovered package. ci.yml wires this as a pull_request-only step in repo-checks, base set to the PR's merge-base sha, skipped when the PR carries the "no-changeset" label (read from the PR event payload, no API call). The checkout for that job now fetches full history on pull_request events so the diff has the base commit available. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(publish): manypkg-driven workspace enumeration, zod manifests, coverage attribution Fix wave on #468's changeset guard: - Delete PACKAGE_GROUPS and the hand-rolled packages/+packages/extensions/ directory scan. Enumerate the workspace via @manypkg/get-packages, the same resolver `changeset version` uses, reading pnpm-workspace.yaml's real glob list (packages/*, packages/extensions/*, apps/*, apps/examples/*, e2e/*). Fixes a live CI-red bug: apps/* packages (@conciv/app) were invisible to the old scan, so a changeset naming @conciv/app failed name-validation. - zod-parse every manifest where it enters (packages/publish/src/manifest.ts), fail-closed on schema violations (e.g. private as a string instead of a boolean), naming the manifest path. - Coverage counts only changesets added by this PR (git diff --name-status --no-renames, status Added), not every changeset already committed at the merge base. - Attribute a changed private workspace package to every published package that depends on it, directly or transitively, via a workspace:* dependency graph (packages/publish/src/workspace.ts). - A changed file matching a published package's manifest `files` glob (minimatch) counts as a publishable change regardless of extension. - Coverage requires the added changeset to name a published package, not merely an @conciv/* prefix. - --no-renames closes a rename-evasion gap in the touched-file diff. - Extensionless files under a published package now count as code; the test-directory exclusion is scoped to the package-relative top-level test/tests directory plus *.test.*/*.spec.* filenames. - A changeset with empty frontmatter (zero releases) now throws naming the file. - Test fixtures clean up via onTestFinished instead of leaking on assertion failure. New deps in packages/publish: @manypkg/get-packages@1.1.3 (the line @changesets/cli already resolves in node_modules) and minimatch@10.2.5 (already present in the lockfile). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: split changeset coverage into verify-changesets.yml, fix zizmor findings - Split both check-changesets steps out of ci.yml's repo-checks into a new .github/workflows/verify-changesets.yml, triggered on [opened, synchronize, reopened, labeled, unlabeled] against main. This lets the "no-changeset" label bypass retrigger the check on a label flip - pull_request's default event types don't include labeled/unlabeled, and adding them to ci.yml would rerun the whole build+test matrix on every label change. repo-checks keeps only the plain (non-coverage) check-changesets so push/main runs still validate names. - Fix zizmor's unsound-ternary finding: ci.yml's repo-checks checkout used `fetch-depth: ${{ github.event_name == 'pull_request' && 0 || 1 }}`, which always evaluates to 1 since 0 is falsy in Actions expressions. The ternary is gone along with the coverage step that needed full history; verify-changesets.yml's checkout gets an unconditional fetch-depth: 0. - Fix zizmor's ref-version-mismatch finding: release.yml's checkout comment said "# v7.0.0" for a SHA that resolves to v7.0.1 everywhere else in the repo's workflows. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(ci): pin verify-changesets checkout to the PR head sha, not the moving merge ref RCA on a false positive on this PR's own run: check-changesets --require-coverage reported every published package as touched, when the PR's actual diff only touches packages/publish (private), workflow files, and pnpm-lock.yaml. Confirmed mechanism (not the suspected H4a dependency-attribution direction or a root-package inversion - both refuted by evidence): pull_request's default actions/checkout ref is the ephemeral merge of the PR head into the CURRENT tip of main, not the PR branch alone. `--base` is pinned to github.event.pull_request.base.sha, a snapshot from when the event fired. Between that snapshot and the job actually running, `chore: version packages (#324)` landed on main - a changesets release bumping every package.json (a code extension) and CHANGELOG.md across all 38 published packages. Diffing the stale base against the moving merge commit swept in that unrelated release, reproduced locally via `git diff --name-status --no-renames <stale-base>...<merge-ref>`. Fix: pin the checkout to `ref: ${{ github.event.pull_request.head.sha }}` so both sides of the diff are fixed commits, independent of what lands on main afterward. Added regression coverage in packages/publish/test/: root-level files (lockfile, workflow) plus a dependent-less private package change passes with zero changesets, alongside the existing case where a private package a published package genuinely depends on (workspace:*) still requires coverage. Also confirms buildDependencyGraph only follows workspace:* edges (not ordinary semver ranges) and that the workspace root itself is never enumerated as a package. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * refactor(publish): pleb-style generator workspace walk replaces @manypkg Owner wants pleb's (github.com/AviVahl/pleb) exact shape for workspace enumeration: a sync generator tree walk plus minimatch against pnpm-workspace.yaml's package globs, not a resolver dependency. - deepFindFiles: function* sync generator ported from pleb's deepFindFilesSync, readdirSync withFileTypes, skips dot-dirs and node_modules. - resolveWorkspacePackages: normalizes each glob to end with /package.json, minimatches walked paths' cwd-relative form, dedupes, parses each match through the existing zod manifest schema. - readWorkspaceGlobs: parses pnpm-workspace.yaml's packages: list with js-yaml, pinned to 4.3.1 (the exact release @changesets/parse already resolves), throwing on a missing file, malformed YAML, or a non-array packages field. - @manypkg/get-packages dropped as a dependency; guards.ts and coverage-files.ts are untouched since readWorkspacePackages keeps its return shape. - New parity regression test compares the real repo's enumerated package-name set against the authoritative `pnpm ls -r --json` output, pinning the port against pnpm glob-semantics drift. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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 was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
Releases
@conciv/cli@0.0.19
Patch Changes
ea23bf6,ea23bf6]:@conciv/client@0.0.19
Patch Changes
ea23bf6,ea23bf6]:@conciv/contract@0.0.19
Patch Changes
#349
ea23bf6Thanks @omridevk! - Browser rpc rides one websocket per (tab, apiBase).makeBrowserRpcClient,makeDeferredRpcClient,makeRebindableRpcClientand the browser form ofmakeExtRpcClientnow resolve a shared connection from a versionedglobalThisregistry instead ofbuilding a fetch link each. The connection picks its transport once, at boot, by dialling
/rpc-wswith a bounded open timeout and sticking to fetch/SSE when that fails;
widget.transportpins eithertransport explicitly.
makeRpcClientstays on fetch for the CLI, testkit and node integration tests.This removes the six-connection starvation that broke the widget from the third tab onwards.
#349
ea23bf6Thanks @omridevk! - Closing a browser rpc connection no longer raises an unhandled error.A disposed connection now answers writes itself instead of letting them reach a dead socket: peer
control frames (cancellations and client event-iterator payloads) are dropped, so oRPC's abort path
runs to completion and closes the call it was cancelling, while a request frame still fails fast so a
caller holding a stale link learns the connection is gone instead of hanging. Dispose delivers a
close event only when partysocket's own
close()emits none — it already dispatches onesynchronously unless the socket never dialled or is already closing — so the peer observes exactly
one terminal event.
Unmounting the widget now releases the tab's connection: the socket is closed and the registry entry
dropped, instead of leaving partysocket and its reconnect timers alive for the rest of the tab's
life. A later mount re-creates the connection through the same registry, running the full transport
probe again.
handle.rebindnow drops the old connection before tearing its consumers down, and rebinding to thebase the widget is already on re-runs the probe rather than being a no-op, so a tab that fell back to
fetch/SSE while the engine was unreachable can ride the websocket again once it recovers.
A live connection reports partysocket's real state: open while open, connecting while it will
reconnect, closed once it will not, so oRPC fails a send fast instead of waiting on a socket that is
never coming back.
Updated dependencies []:
@conciv/core@0.0.19
Patch Changes
#357
c6aa92cThanks @omridevk! - The configured engine port is a preference on the Vite dev server: when it is already taken theengine falls back to a free port, logs the address it actually bound, and the page is stamped with
that address, so two dev servers can run at once instead of the second dying on EADDRINUSE. The
Next.js integration and the generic webpack/rspack plugin still bind their port exactly, because
both hand the client a fixed address before the engine ever boots.
#343
78977f0Thanks @omridevk! - Detect and announce a stale engine. The engine builds its staleness probe as its own modules are first imported, fingerprinting the contents of every published entry of the server packages it loaded, and re-hashes them on demand — so a rebuild that lands on disk under a running dev server stops being invisible — and a re-link or cache extraction that only moves mtimes with identical bytes does not raise a false alarm./healthgains anenginefield (stale,changed,tracked,bootedAt,fingerprint), a newmeta.engineRPC carries the same reading to the widget, and the MCP server folds a warning into itsinstructionswhen the loaded code is behind the disk. The widget raises a standing danger notice naming what actually moved: the server code on disk is newer than the running engine, restart the dev server. The notice is keyed by fingerprint, so it clears itself when the engine is restarted, stays down once dismissed for that same stamp, and speaks up again after a further rebuild.#319
af72648Thanks @omridevk! - Serve one composite oRPC router (core procedures plusext.<slug>extension routers) over both a fetch mount at/rpcand a new additive WebSocket mount at/rpc-ws. Per-call request headers are now derived from the oRPC standard request by a single shared root interceptor, so session-scoped calls behave identically on both transports.@conciv/servegains an explicitmaxPayload, a graceful socket close that only terminates after a deadline, and afetchtype that accepts the server env argument. Existing/rpcand/rpc/ext/<slug>URLs are unchanged.Updated dependencies [
e628f93,39c6072,23f62c9,ea23bf6,ea23bf6,b329b47]:@conciv/db@0.0.19
Patch Changes
@conciv/embed@0.0.19
Patch Changes
#349
ea23bf6Thanks @omridevk! - Closing a browser rpc connection no longer raises an unhandled error.A disposed connection now answers writes itself instead of letting them reach a dead socket: peer
control frames (cancellations and client event-iterator payloads) are dropped, so oRPC's abort path
runs to completion and closes the call it was cancelling, while a request frame still fails fast so a
caller holding a stale link learns the connection is gone instead of hanging. Dispose delivers a
close event only when partysocket's own
close()emits none — it already dispatches onesynchronously unless the socket never dialled or is already closing — so the peer observes exactly
one terminal event.
Unmounting the widget now releases the tab's connection: the socket is closed and the registry entry
dropped, instead of leaving partysocket and its reconnect timers alive for the rest of the tab's
life. A later mount re-creates the connection through the same registry, running the full transport
probe again.
handle.rebindnow drops the old connection before tearing its consumers down, and rebinding to thebase the widget is already on re-runs the probe rather than being a no-op, so a tab that fell back to
fetch/SSE while the engine was unreachable can ride the websocket again once it recovers.
A live connection reports partysocket's real state: open while open, connecting while it will
reconnect, closed once it will not, so oRPC fails a send fast instead of waiting on a socket that is
never coming back.
Updated dependencies [
e628f93,6ce79cf,39c6072,23f62c9,ea23bf6,ea23bf6,b329b47]:@conciv/extension@0.0.19
Patch Changes
#335
b329b47Thanks @omridevk! - Move the rpc mount seam (makeCompositeRpcRouter,rpcFetchMiddleware,rpcWebsocketRoute,RPC_PREFIX,RPC_WS_PATH) from@conciv/coreinto@conciv/extension/rpc-mount, so extension fixtures and test harnessesmount the same composite router over both transports instead of hand-rolling a second one.
@conciv/coreimports the seam from there; behavior is unchanged.
rpcWebsocketRoute(router, {upgrade, onError})now takes itsupgradeWebSocketadapter as an injectedargument instead of importing
@hono/node-serverdirectly, so every caller (core's own mount, the testharnesses, extension fixtures) shares one
@hono/node-servermodule instance for the upgrade — a secondinstance silently refuses the upgrade.
@conciv/servere-exportsupgradeWebSocketas the one sanctionedsource for that adapter; pass it (and an optional
onErrorfor rejected frames) at every call site.Updated dependencies [
6ce79cf,ea23bf6,ea23bf6]:@conciv/extension-compiler@0.0.19
Patch Changes
b329b47]:@conciv/extension-ios@0.0.19
Patch Changes
b329b47]:@conciv/extension-page@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/extension-recorder@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/extension-tanstack@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/extension-terminal@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/extension-test-runner@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/extension-whiteboard@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/harness@0.0.19
Patch Changes
@conciv/harness-init@0.0.19
Patch Changes
@conciv/it@0.0.19
Patch Changes
c6aa92c,ea23bf6]:@conciv/plugin@0.0.19
Patch Changes
c6aa92cThanks @omridevk! - The configured engine port is a preference on the Vite dev server: when it is already taken theengine falls back to a free port, logs the address it actually bound, and the page is stamped with
that address, so two dev servers can run at once instead of the second dying on EADDRINUSE. The
Next.js integration and the generic webpack/rspack plugin still bind their port exactly, because
both hand the client a fixed address before the engine ever boots.
c6aa92c,78977f0,ea23bf6,b329b47,af72648]:@conciv/preact@0.0.19
Patch Changes
ea23bf6]:@conciv/react@0.0.19
Patch Changes
ea23bf6]:@conciv/serve@0.0.19
Patch Changes
#335
b329b47Thanks @omridevk! - Move the rpc mount seam (makeCompositeRpcRouter,rpcFetchMiddleware,rpcWebsocketRoute,RPC_PREFIX,RPC_WS_PATH) from@conciv/coreinto@conciv/extension/rpc-mount, so extension fixtures and test harnessesmount the same composite router over both transports instead of hand-rolling a second one.
@conciv/coreimports the seam from there; behavior is unchanged.
rpcWebsocketRoute(router, {upgrade, onError})now takes itsupgradeWebSocketadapter as an injectedargument instead of importing
@hono/node-serverdirectly, so every caller (core's own mount, the testharnesses, extension fixtures) shares one
@hono/node-servermodule instance for the upgrade — a secondinstance silently refuses the upgrade.
@conciv/servere-exportsupgradeWebSocketas the one sanctionedsource for that adapter; pass it (and an optional
onErrorfor rejected frames) at every call site.Updated dependencies []:
@conciv/skills@0.0.19
Patch Changes
47732b4Thanks @omridevk! - New@conciv/skillspackage ships first-party agent skills for conciv (setup, extensiondevelopment, harness adapters, debugging) discoverable via
@tanstack/intent, plus a CI-checkeddrift script that keeps skill citations in sync with the source they describe.
@conciv/solid@0.0.19
Patch Changes
ea23bf6]:@conciv/solid-stick-to-bottom@0.0.19
Patch Changes
e628f93Thanks @omridevk! - Chat transcript scrolling is now owned by @conciv/solid-stick-to-bottom, a faithful Solid port of use-stick-to-bottom: the viewport only moves for pinned streaming follow, the scroll-to-bottom button, and sending a message. Chain-of-thought/reasoning cards auto-close once when their own content completes, and user toggles after that are permanent. Tool approval force-opens the tool card once. User card toggles never shift the viewport. Chain content defaults to grow, with agrowprop for the capped pane.@conciv/tools@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9,b329b47]:@conciv/try@0.0.19
Patch Changes
c6aa92c,78977f0,af72648]:@conciv/ui-kit-chat@0.0.19
Patch Changes
#437
e628f93Thanks @omridevk! - Chat transcript scrolling is now owned by @conciv/solid-stick-to-bottom, a faithful Solid port of use-stick-to-bottom: the viewport only moves for pinned streaming follow, the scroll-to-bottom button, and sending a message. Chain-of-thought/reasoning cards auto-close once when their own content completes, and user toggles after that are permanent. Tool approval force-opens the tool card once. User card toggles never shift the viewport. Chain content defaults to grow, with agrowprop for the capped pane.#313
39c6072Thanks @omridevk! - The widget composer now runs on the TipTap rich text field from @conciv/ui-kit-tap: slash commands and mentions are atomic chips with typeahead popovers, lowering to the same directive strings the server always received. The string-splice trigger layer is removed from @conciv/ui-kit-chat (trigger popover primitives, slash/mention adapters, directive formatter, the styled composer popover slot); ComposerPrimitive.Input remains the plain textarea primitive.#460
23f62c9Thanks @omridevk! - Transcript virtualization: long threads render through a TanStack virtual-core window with stable turn identity, pretext-based height estimates, and lazy collapsed card bodies; fast-scroll main-thread stalls drop from ~380ms to ~70ms.Updated dependencies [
e628f93,6ce79cf]:@conciv/ui-kit-chat-tools@0.0.19
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9]:@conciv/ui-kit-system@0.0.19
Patch Changes
6ce79cfThanks @omridevk! - NewLoadercompound (Loader.Root/Indicator/Text/Label/Description) built on Ark's indeterminate Progress: a conic-gradient orb whose arcs animate registered@propertyangles rather than rotating a rasterized texture, drawn entirely incurrentColorso it inherits any surface. Sizes ride a--pw-loader-sizevariable throughdata-size, andLoader.Indicatorrenders whatever children it is given, so a different visual replaces one part instead of the component. Styled entirely through the shared@conciv/uno-preset(keyframes, adata-sizerule and shortcuts), like every other component in the package — no separate stylesheet to@import.@conciv/ui-kit-tap@0.0.19
Patch Changes
6ce79cf]:@conciv/ui-kit-terminal@0.0.19
Patch Changes
@conciv/grab@0.0.19
@conciv/mascot@0.0.19
@conciv/protocol@0.0.19
@conciv/solid-diffs@0.0.19
@conciv/solid-streamdown@0.0.19
@conciv/storage-history@0.0.19
@conciv/app@0.0.19
Patch Changes
#469
8a1ddc9Thanks @omridevk! - Extension instance disposal is now owned bycreateConcivRouteritself: aWrapcomponent registersonCleanupfor every extension instance'sdispose(), riding whatever unmounts the tree that renderedRouterProvider. The threeapps/concivbrowser suites that used to pairdisposeConcivRouterwith a manual unmount no longer need to — they were forgettable by construction, and every consumer that forgot leaked extension state.disposeConcivRouterstays exported as an explicit, idempotent escape hatch for the one caseWrapcan't cover: a router created but never rendered (e.g. a boot that fails beforerender()runs) still needs an owner for its eagerly-created extension instances. It shares one guarded disposer withWrap'sonCleanup— first call disposes, every later call (whether from a normal unmount or a repeat call) is a no-op — sopackages/embed/src/mount-impl.tsxcan keep calling it unconditionally in its disposer list without double-disposing.Updated dependencies [
e628f93,c6aa92c,6ce79cf,78977f0,39c6072,23f62c9,ea23bf6,ea23bf6,b329b47,af72648]:nextjs-app@0.1.19
Patch Changes
ea23bf6]:tanstack-start-example@0.0.19
Patch Changes
ea23bf6,b329b47]:site@0.0.19
Patch Changes
ea23bf6]:conciv-storybook@0.0.9
Patch Changes
e628f93,6ce79cf,39c6072,23f62c9]:conciv-e2e-astro@0.0.12
Patch Changes
conciv-e2e-harnesses@0.0.9
Patch Changes
conciv-e2e-nextjs@0.1.11
Patch Changes
conciv-e2e-nextjs-component@0.1.11
Patch Changes
conciv-e2e-solid-start@0.0.11
Patch Changes
conciv-e2e-svelte@0.0.12
Patch Changes
conciv-e2e-vite-preact-component@0.0.11
Patch Changes
conciv-e2e-vite-react@0.0.11
Patch Changes
conciv-e2e-vite-react-component@0.0.11
Patch Changes
conciv-e2e-vite-solid@0.0.11
Patch Changes
conciv-e2e-vite-solid-component@0.0.11
Patch Changes
conciv-e2e-vite-vanilla@0.0.11
Patch Changes
@conciv/extension-testkit@0.0.19
Patch Changes
e628f93,c6aa92c,6ce79cf,78977f0,39c6072,23f62c9,ea23bf6,ea23bf6,b329b47,af72648]:@conciv/extension-try-it@0.0.19
Patch Changes
6ce79cf,b329b47]:@conciv/harness-testkit@0.0.19
Patch Changes
ea23bf6,ea23bf6,b329b47]:@conciv/page@0.0.19
Patch Changes
ea23bf6,ea23bf6,b329b47]:@conciv/e2e-utils@0.0.19
@conciv/browser-fixture@0.0.19
@conciv/bundle-size@0.0.19
@conciv/oxlint-plugin@0.0.19
@conciv/publish@0.0.19
@conciv/uno-preset@0.0.19
@conciv/vitest-config@0.0.19