Skip to content

chore: version packages - #324

Merged
omridevk merged 1 commit into
mainfrom
changeset-release/main
Aug 13, 2026
Merged

chore: version packages#324
omridevk merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

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

  • Updated dependencies [ea23bf6, ea23bf6]:
    • @conciv/contract@0.0.19
    • @conciv/tools@0.0.19
    • @conciv/harness-init@0.0.19
    • @conciv/protocol@0.0.19

@conciv/client@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6, ea23bf6]:
    • @conciv/contract@0.0.19
    • @conciv/protocol@0.0.19

@conciv/contract@0.0.19

Patch Changes

  • #349 ea23bf6 Thanks @omridevk! - Browser rpc rides one websocket per (tab, apiBase).

    makeBrowserRpcClient, makeDeferredRpcClient, makeRebindableRpcClient and the browser form of
    makeExtRpcClient now resolve a shared connection from a versioned globalThis registry instead of
    building a fetch link each. The connection picks its transport once, at boot, by dialling /rpc-ws
    with a bounded open timeout and sticking to fetch/SSE when that fails; widget.transport pins either
    transport explicitly. makeRpcClient stays 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 ea23bf6 Thanks @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 one
    synchronously 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.rebind now drops the old connection before tearing its consumers down, and rebinding to the
    base 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/protocol@0.0.19

@conciv/core@0.0.19

Patch Changes

  • #357 c6aa92c Thanks @omridevk! - The configured engine port is a preference on the Vite dev server: when it is already taken the
    engine 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 78977f0 Thanks @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. /health gains an engine field (stale, changed, tracked, bootedAt, fingerprint), a new meta.engine RPC carries the same reading to the widget, and the MCP server folds a warning into its instructions when 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 af72648 Thanks @omridevk! - Serve one composite oRPC router (core procedures plus ext.<slug> extension routers) over both a fetch mount at /rpc and 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/serve gains an explicit maxPayload, a graceful socket close that only terminates after a deadline, and a fetch type that accepts the server env argument. Existing /rpc and /rpc/ext/<slug> URLs are unchanged.

  • Updated dependencies [e628f93, 39c6072, 23f62c9, ea23bf6, ea23bf6, b329b47]:

    • @conciv/ui-kit-chat@0.0.19
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/serve@0.0.19
    • @conciv/extension-page@0.0.19
    • @conciv/tools@0.0.19
    • @conciv/db@0.0.19
    • @conciv/harness@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/solid-diffs@0.0.19

@conciv/db@0.0.19

Patch Changes

  • Updated dependencies []:
    • @conciv/protocol@0.0.19

@conciv/embed@0.0.19

Patch Changes

  • #349 ea23bf6 Thanks @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 one
    synchronously 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.rebind now drops the old connection before tearing its consumers down, and rebinding to the
    base 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/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/extension-page@0.0.19
    • @conciv/ui-kit-chat-tools@0.0.19
    • @conciv/client@0.0.19
    • @conciv/extension-ios@0.0.19
    • @conciv/ui-kit-tap@0.0.19
    • @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/extension@0.0.19

Patch Changes

  • #335 b329b47 Thanks @omridevk! - Move the rpc mount seam (makeCompositeRpcRouter, rpcFetchMiddleware, rpcWebsocketRoute, RPC_PREFIX,
    RPC_WS_PATH) from @conciv/core into @conciv/extension/rpc-mount, so extension fixtures and test harnesses
    mount the same composite router over both transports instead of hand-rolling a second one. @conciv/core
    imports the seam from there; behavior is unchanged.

    rpcWebsocketRoute(router, {upgrade, onError}) now takes its upgradeWebSocket adapter as an injected
    argument instead of importing @hono/node-server directly, so every caller (core's own mount, the test
    harnesses, extension fixtures) shares one @hono/node-server module instance for the upgrade — a second
    instance silently refuses the upgrade. @conciv/serve re-exports upgradeWebSocket as the one sanctioned
    source for that adapter; pass it (and an optional onError for rejected frames) at every call site.

  • Updated dependencies [6ce79cf, ea23bf6, ea23bf6]:

    • @conciv/ui-kit-system@0.0.19
    • @conciv/contract@0.0.19
    • @conciv/grab@0.0.19
    • @conciv/protocol@0.0.19

@conciv/extension-compiler@0.0.19

Patch Changes

  • Updated dependencies [b329b47]:
    • @conciv/extension@0.0.19

@conciv/extension-ios@0.0.19

Patch Changes

  • Updated dependencies [b329b47]:
    • @conciv/extension@0.0.19
    • @conciv/grab@0.0.19

@conciv/extension-page@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9, b329b47]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/page@0.0.19
    • @conciv/protocol@0.0.19

@conciv/extension-recorder@0.0.19

Patch Changes

@conciv/extension-tanstack@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9, b329b47]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/ui-kit-chat-tools@0.0.19
    • @conciv/page@0.0.19
    • @conciv/protocol@0.0.19

@conciv/extension-terminal@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9, b329b47]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/ui-kit-terminal@0.0.19

@conciv/extension-test-runner@0.0.19

Patch Changes

@conciv/extension-whiteboard@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9, b329b47]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/ui-kit-chat-tools@0.0.19
    • @conciv/ui-kit-tap@0.0.19
    • @conciv/grab@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/solid-diffs@0.0.19

@conciv/harness@0.0.19

Patch Changes

  • Updated dependencies []:
    • @conciv/harness-init@0.0.19
    • @conciv/protocol@0.0.19

@conciv/harness-init@0.0.19

Patch Changes

  • Updated dependencies []:
    • @conciv/protocol@0.0.19

@conciv/it@0.0.19

Patch Changes

  • Updated dependencies [c6aa92c, ea23bf6]:
    • @conciv/plugin@0.0.19
    • @conciv/embed@0.0.19
    • @conciv/extension-recorder@0.0.19
    • @conciv/extension-terminal@0.0.19
    • @conciv/extension-test-runner@0.0.19
    • @conciv/extension-whiteboard@0.0.19
    • @conciv/extension-ios@0.0.19
    • @conciv/extension-compiler@0.0.19

@conciv/plugin@0.0.19

Patch Changes

  • #357 c6aa92c Thanks @omridevk! - The configured engine port is a preference on the Vite dev server: when it is already taken the
    engine 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.
  • Updated dependencies [c6aa92c, 78977f0, ea23bf6, b329b47, af72648]:
    • @conciv/core@0.0.19
    • @conciv/embed@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/cli@0.0.19
    • @conciv/extension-compiler@0.0.19
    • @conciv/protocol@0.0.19

@conciv/preact@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6]:
    • @conciv/embed@0.0.19

@conciv/react@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6]:
    • @conciv/embed@0.0.19

@conciv/serve@0.0.19

Patch Changes

  • #335 b329b47 Thanks @omridevk! - Move the rpc mount seam (makeCompositeRpcRouter, rpcFetchMiddleware, rpcWebsocketRoute, RPC_PREFIX,
    RPC_WS_PATH) from @conciv/core into @conciv/extension/rpc-mount, so extension fixtures and test harnesses
    mount the same composite router over both transports instead of hand-rolling a second one. @conciv/core
    imports the seam from there; behavior is unchanged.

    rpcWebsocketRoute(router, {upgrade, onError}) now takes its upgradeWebSocket adapter as an injected
    argument instead of importing @hono/node-server directly, so every caller (core's own mount, the test
    harnesses, extension fixtures) shares one @hono/node-server module instance for the upgrade — a second
    instance silently refuses the upgrade. @conciv/serve re-exports upgradeWebSocket as the one sanctioned
    source for that adapter; pass it (and an optional onError for rejected frames) at every call site.

  • Updated dependencies []:

    • @conciv/protocol@0.0.19

@conciv/skills@0.0.19

Patch Changes

  • #419 47732b4 Thanks @omridevk! - New @conciv/skills package ships first-party agent skills for conciv (setup, extension
    development, harness adapters, debugging) discoverable via @tanstack/intent, plus a CI-checked
    drift script that keeps skill citations in sync with the source they describe.

@conciv/solid@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6]:
    • @conciv/embed@0.0.19

@conciv/solid-stick-to-bottom@0.0.19

Patch Changes

  • #437 e628f93 Thanks @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 a grow prop for the capped pane.

@conciv/tools@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9, b329b47]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/extension-page@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/solid-diffs@0.0.19

@conciv/try@0.0.19

Patch Changes

  • Updated dependencies [c6aa92c, 78977f0, af72648]:
    • @conciv/core@0.0.19
    • @conciv/extension-terminal@0.0.19
    • @conciv/harness@0.0.19
    • @conciv/protocol@0.0.19

@conciv/ui-kit-chat@0.0.19

Patch Changes

  • #437 e628f93 Thanks @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 a grow prop for the capped pane.

  • #313 39c6072 Thanks @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 23f62c9 Thanks @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/solid-stick-to-bottom@0.0.19
    • @conciv/ui-kit-system@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/ui-kit-chat-tools@0.0.19

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension-page@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/solid-diffs@0.0.19

@conciv/ui-kit-system@0.0.19

Patch Changes

  • #461 6ce79cf Thanks @omridevk! - New Loader compound (Loader.Root/Indicator/Text/Label/Description) built on Ark's indeterminate Progress: a conic-gradient orb whose arcs animate registered @property angles rather than rotating a rasterized texture, drawn entirely in currentColor so it inherits any surface. Sizes ride a --pw-loader-size variable through data-size, and Loader.Indicator renders 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, a data-size rule and shortcuts), like every other component in the package — no separate stylesheet to @import.

@conciv/ui-kit-tap@0.0.19

Patch Changes

  • Updated dependencies [6ce79cf]:
    • @conciv/ui-kit-system@0.0.19

@conciv/ui-kit-terminal@0.0.19

Patch Changes

  • Updated dependencies []:
    • @conciv/protocol@0.0.19

@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 8a1ddc9 Thanks @omridevk! - Extension instance disposal is now owned by createConcivRouter itself: a Wrap component registers onCleanup for every extension instance's dispose(), riding whatever unmounts the tree that rendered RouterProvider. The three apps/conciv browser suites that used to pair disposeConcivRouter with a manual unmount no longer need to — they were forgettable by construction, and every consumer that forgot leaked extension state.

    disposeConcivRouter stays exported as an explicit, idempotent escape hatch for the one case Wrap can't cover: a router created but never rendered (e.g. a boot that fails before render() runs) still needs an owner for its eagerly-created extension instances. It shares one guarded disposer with Wrap's onCleanup — first call disposes, every later call (whether from a normal unmount or a repeat call) is a no-op — so packages/embed/src/mount-impl.tsx can keep calling it unconditionally in its disposer list without double-disposing.

  • Updated dependencies [e628f93, c6aa92c, 6ce79cf, 78977f0, 39c6072, 23f62c9, ea23bf6, ea23bf6, b329b47, af72648]:

    • @conciv/ui-kit-chat@0.0.19
    • @conciv/core@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/tools@0.0.19
    • @conciv/ui-kit-chat-tools@0.0.19
    • @conciv/client@0.0.19
    • @conciv/ui-kit-tap@0.0.19
    • @conciv/page@0.0.19
    • @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

nextjs-app@0.1.19

Patch Changes

  • Updated dependencies [ea23bf6]:
    • @conciv/embed@0.0.19
    • @conciv/extension-tanstack@0.0.19
    • @conciv/it@0.0.19

tanstack-start-example@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6, b329b47]:
    • @conciv/embed@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/extension-tanstack@0.0.19
    • @conciv/cli@0.0.19
    • @conciv/it@0.0.19
    • @conciv/protocol@0.0.19

site@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6]:
    • @conciv/embed@0.0.19
    • @conciv/extension-terminal@0.0.19
    • @conciv/it@0.0.19
    • @conciv/extension-try-it@0.0.19
    • @conciv/mascot@0.0.19
    • @conciv/protocol@0.0.19

conciv-storybook@0.0.9

Patch Changes

  • Updated dependencies [e628f93, 6ce79cf, 39c6072, 23f62c9]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension-page@0.0.19
    • @conciv/ui-kit-chat-tools@0.0.19
    • @conciv/ui-kit-tap@0.0.19
    • @conciv/solid-diffs@0.0.19
    • @conciv/solid-streamdown@0.0.19

conciv-e2e-astro@0.0.12

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-harnesses@0.0.9

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-nextjs@0.1.11

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-nextjs-component@0.1.11

Patch Changes

  • Updated dependencies []:
    • @conciv/extension-terminal@0.0.19
    • @conciv/it@0.0.19
    • @conciv/react@0.0.19

conciv-e2e-solid-start@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-svelte@0.0.12

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-vite-preact-component@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/extension-terminal@0.0.19
    • @conciv/it@0.0.19
    • @conciv/preact@0.0.19

conciv-e2e-vite-react@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-vite-react-component@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/extension-terminal@0.0.19
    • @conciv/it@0.0.19
    • @conciv/react@0.0.19

conciv-e2e-vite-solid@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

conciv-e2e-vite-solid-component@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/extension-terminal@0.0.19
    • @conciv/it@0.0.19
    • @conciv/solid@0.0.19

conciv-e2e-vite-vanilla@0.0.11

Patch Changes

  • Updated dependencies []:
    • @conciv/it@0.0.19

@conciv/extension-testkit@0.0.19

Patch Changes

  • Updated dependencies [e628f93, c6aa92c, 6ce79cf, 78977f0, 39c6072, 23f62c9, ea23bf6, ea23bf6, b329b47, af72648]:
    • @conciv/ui-kit-chat@0.0.19
    • @conciv/core@0.0.19
    • @conciv/ui-kit-system@0.0.19
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/harness-testkit@0.0.19
    • @conciv/extension-compiler@0.0.19
    • @conciv/browser-fixture@0.0.19
    • @conciv/grab@0.0.19
    • @conciv/protocol@0.0.19
    • @conciv/uno-preset@0.0.19

@conciv/extension-try-it@0.0.19

Patch Changes

  • Updated dependencies [6ce79cf, b329b47]:
    • @conciv/ui-kit-system@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/protocol@0.0.19

@conciv/harness-testkit@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6, ea23bf6, b329b47]:
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/serve@0.0.19
    • @conciv/protocol@0.0.19

@conciv/page@0.0.19

Patch Changes

  • Updated dependencies [ea23bf6, ea23bf6, b329b47]:
    • @conciv/contract@0.0.19
    • @conciv/extension@0.0.19
    • @conciv/grab@0.0.19
    • @conciv/protocol@0.0.19

@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

@github-actions
github-actions Bot requested a review from omridevk as a code owner August 8, 2026 08:12
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
github-actions Bot force-pushed the changeset-release/main branch from 4e4ffcd to 4a8e442 Compare August 13, 2026 18:26
@omridevk
omridevk merged commit e49f34d into main Aug 13, 2026
23 checks passed
@omridevk
omridevk deleted the changeset-release/main branch August 13, 2026 18:50
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>
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.

1 participant