Skip to content

Version Packages - #262

Open
github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main
Open

github-actions[bot] wants to merge 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actions github-actions Bot commented Nov 1, 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

@typeonce/effect-machine-devtools@0.47.0

Minor Changes

  • d1d9137: Add MachineTest.check, MachineTest.analyze, and the effect-machine check command, so a machine can be verified with one call and no browser.

    check reports states with no path from the initial state, public events with no handler, nondeterministic planning, planner law violations, invariant failures, and declared branches that were never taken. It derives input and events from the machine's schemas, and each finding from a run includes the events that reproduce it. A report is "exhaustive" only when nothing limited exploration; otherwise limits says why it is "bounded".

    const program = Effect.gen(function*() {
      const report = yield* MachineTest.check(Checkout)
      return report.ok // false when any finding is an error
    })

    From a shell, effect-machine check src/checkout.ts --json prints one JSON object and exits with status 1 on any error.

  • 42e2d90: Declare conditional transitions inline, with branches next to resolve, so one transition can be read and edited alone. The compiler checks one against the other in both directions, and rejects a resolver that does not return a select call on every path:

    Pay: {
      branches: [{ target: "Charging" }, { update: "root" }, { stay: true }, { decline: true }],
      resolve: ({ event, select }) => {
        if (event.amount < 0) return select.decline()
        if (event.amount === 0) return select.stay()
        return event.preview
          ? select.update({ root: { total: event.amount } })
          : select.target("Charging", { data: { amount: event.amount } })
      }
    }

    To migrate: move each make({ branches }) group into its transition and drop its keys and title, so select.key(...) becomes select.target(path, ...), select.update({ owner: value }), select.history(path), select.initialize({ input }), or select.stay(). Two keys that reached the same destination are now one entry. Remove declinable: true, list { decline: true }, and replace the decline() context function with select.decline().

    none is replaced: { none: true } becomes { stay: true }, { none: true, reenter: true } becomes { reenter: true }, and { none: true, resolve } becomes { stay: true, commands }. Every plain transition accepts commands: (context, enqueue) => ....

    update is now a record with one owner, so data only ever means the target's value: { update: "root", data } becomes { update: { root: data } }, and { target, update: "Owner", data: () => ({ target, update }) } becomes { target, data, update: { Owner: value } }. Inside a branches list, an entry still names its owner as a string, { target, update: "Owner" }, and the value goes in its select call.

    guard and decline now exist only on on handlers and always. On onDone, onFailure, onElement, onSnapshot, and choice, which have no other candidate, use { stay: true } or select a destination. A retained transition's branchKey and a transition definition's key are now the entry as written, such as target:Paid, and title is removed.

    In the Oxlint plugin, no-conditional-none-branch becomes no-conditional-stay-branch, and no-redundant-resolve is removed because the compiler now rejects what it reported. Resolvers for invocation outcomes and always may select stay conditionally, because Machine.can queries only events.

Patch Changes

  • 7d0e987: Update the devtools file watcher to chokidar 6. The devtools CLI now requires Node.js 22.22 or newer.

    Build the Oxlint plugin against @oxlint/plugins 1.90.0. The plugin still supports oxlint >=1.80.0 <2.

  • 697c6cb: Install the devtools CLI without pinning a second exact TypeScript or Vite.

    @typeonce/effect-machine-devtools now depends on typescript >=5.9.0 <7.0.0 and vite ^8.1.5 instead of exact versions, so a package manager can reuse compatible versions your project already has. No setup changes are required: the CLI still works when your project uses neither, or uses TypeScript 7.

  • Updated dependencies [67f11cc]

  • Updated dependencies [573636b]

  • Updated dependencies [b24c367]

  • Updated dependencies [d1d9137]

  • Updated dependencies [ca51c52]

  • Updated dependencies [42e2d90]

  • Updated dependencies [104f98a]

  • Updated dependencies [7ffcab7]

    • @typeonce/effect-machine@0.47.0

@typeonce/effect-machine@0.47.0

Minor Changes

  • 67f11cc: Compile errors for common machine mistakes now name the fix instead of reporting never:

    Pay: { target: "Archivd" }
    // Unknown target "Archivd". Declared: Editing, Checkout, Archived
    
    invoke: { src: "loadd", onDone: { stay: true } }
    // Unknown source. Registered: load

    Machine.handle reports a misspelled target, source, or owner, a missing data, the root or a history state used as a target, and an on, always, onDone, or invoke on a final or choice state.

    A transition that targets a state below an inactive valued state, such as { target: "Checkout.Paid" } from outside Checkout, used to fail while planning. It is now a compile error: target "Checkout" with a branches entry and construct the child with select.target("Checkout", { data, states: { Paid: {} } }).

  • 573636b: Ship agent documentation as AGENTS.md, CLAUDE.md, and ai-docs/ in the package, replacing docs/.

    An agent working in a project can now read documentation matching the installed version from node_modules/@typeonce/effect-machine/AGENTS.md. Replace links to docs/agent-guide.md, docs/root-api.md, docs/effect-atom-react.md, and docs/machine-review.md with that file, or with the matching section under ai-docs/src.

  • d1d9137: Add MachineTest.check, MachineTest.analyze, and the effect-machine check command, so a machine can be verified with one call and no browser.

    check reports states with no path from the initial state, public events with no handler, nondeterministic planning, planner law violations, invariant failures, and declared branches that were never taken. It derives input and events from the machine's schemas, and each finding from a run includes the events that reproduce it. A report is "exhaustive" only when nothing limited exploration; otherwise limits says why it is "bounded".

    const program = Effect.gen(function*() {
      const report = yield* MachineTest.check(Checkout)
      return report.ok // false when any finding is an error
    })

    From a shell, effect-machine check src/checkout.ts --json prints one JSON object and exits with status 1 on any error.

  • 42e2d90: Declare conditional transitions inline, with branches next to resolve, so one transition can be read and edited alone. The compiler checks one against the other in both directions, and rejects a resolver that does not return a select call on every path:

    Pay: {
      branches: [{ target: "Charging" }, { update: "root" }, { stay: true }, { decline: true }],
      resolve: ({ event, select }) => {
        if (event.amount < 0) return select.decline()
        if (event.amount === 0) return select.stay()
        return event.preview
          ? select.update({ root: { total: event.amount } })
          : select.target("Charging", { data: { amount: event.amount } })
      }
    }

    To migrate: move each make({ branches }) group into its transition and drop its keys and title, so select.key(...) becomes select.target(path, ...), select.update({ owner: value }), select.history(path), select.initialize({ input }), or select.stay(). Two keys that reached the same destination are now one entry. Remove declinable: true, list { decline: true }, and replace the decline() context function with select.decline().

    none is replaced: { none: true } becomes { stay: true }, { none: true, reenter: true } becomes { reenter: true }, and { none: true, resolve } becomes { stay: true, commands }. Every plain transition accepts commands: (context, enqueue) => ....

    update is now a record with one owner, so data only ever means the target's value: { update: "root", data } becomes { update: { root: data } }, and { target, update: "Owner", data: () => ({ target, update }) } becomes { target, data, update: { Owner: value } }. Inside a branches list, an entry still names its owner as a string, { target, update: "Owner" }, and the value goes in its select call.

    guard and decline now exist only on on handlers and always. On onDone, onFailure, onElement, onSnapshot, and choice, which have no other candidate, use { stay: true } or select a destination. A retained transition's branchKey and a transition definition's key are now the entry as written, such as target:Paid, and title is removed.

    In the Oxlint plugin, no-conditional-none-branch becomes no-conditional-stay-branch, and no-redundant-resolve is removed because the compiler now rejects what it reported. Resolvers for invocation outcomes and always may select stay conditionally, because Machine.can queries only events.

Patch Changes

  • b24c367: The npm page for @typeonce/effect-machine now links to the API reference at https://effect-machine.typeonce.dev.
  • ca51c52: Every API example in the published source now has a title, and the core package's examples compile and run against the current API.
  • 104f98a: Internal: check the compiled execution plan's transition contexts, targets, and commands at compile time instead of through any casts. Machine behavior and the public API are unchanged.
  • 7ffcab7: Internal: check planner target resolution, invocation sources, and runtime child operations at compile time instead of through any casts. Machine behavior and the public API are unchanged.

@typeonce/effect-machine-react@0.47.0

Minor Changes

  • 42e2d90: Declare conditional transitions inline, with branches next to resolve, so one transition can be read and edited alone. The compiler checks one against the other in both directions, and rejects a resolver that does not return a select call on every path:

    Pay: {
      branches: [{ target: "Charging" }, { update: "root" }, { stay: true }, { decline: true }],
      resolve: ({ event, select }) => {
        if (event.amount < 0) return select.decline()
        if (event.amount === 0) return select.stay()
        return event.preview
          ? select.update({ root: { total: event.amount } })
          : select.target("Charging", { data: { amount: event.amount } })
      }
    }

    To migrate: move each make({ branches }) group into its transition and drop its keys and title, so select.key(...) becomes select.target(path, ...), select.update({ owner: value }), select.history(path), select.initialize({ input }), or select.stay(). Two keys that reached the same destination are now one entry. Remove declinable: true, list { decline: true }, and replace the decline() context function with select.decline().

    none is replaced: { none: true } becomes { stay: true }, { none: true, reenter: true } becomes { reenter: true }, and { none: true, resolve } becomes { stay: true, commands }. Every plain transition accepts commands: (context, enqueue) => ....

    update is now a record with one owner, so data only ever means the target's value: { update: "root", data } becomes { update: { root: data } }, and { target, update: "Owner", data: () => ({ target, update }) } becomes { target, data, update: { Owner: value } }. Inside a branches list, an entry still names its owner as a string, { target, update: "Owner" }, and the value goes in its select call.

    guard and decline now exist only on on handlers and always. On onDone, onFailure, onElement, onSnapshot, and choice, which have no other candidate, use { stay: true } or select a destination. A retained transition's branchKey and a transition definition's key are now the entry as written, such as target:Paid, and title is removed.

    In the Oxlint plugin, no-conditional-none-branch becomes no-conditional-stay-branch, and no-redundant-resolve is removed because the compiler now rejects what it reported. Resolvers for invocation outcomes and always may select stay conditionally, because Machine.can queries only events.

Patch Changes

  • a5e80b3: Remove the scheduler peer dependency from @typeonce/effect-machine-react.

    The package never imports scheduler, so upgrading React no longer produces a peer warning from it. The scheduler version is now governed only by react-dom and @effect/atom-react. Remove scheduler from your dependencies if you installed it only for this package.

  • ca51c52: Every API example in the published source now has a title, and the core package's examples compile and run against the current API.

  • Updated dependencies [67f11cc]

  • Updated dependencies [573636b]

  • Updated dependencies [b24c367]

  • Updated dependencies [d1d9137]

  • Updated dependencies [ca51c52]

  • Updated dependencies [42e2d90]

  • Updated dependencies [104f98a]

  • Updated dependencies [7ffcab7]

    • @typeonce/effect-machine@0.47.0

@typeonce/oxlint-plugin-effect-machine@0.47.0

Minor Changes

  • 42e2d90: Declare conditional transitions inline, with branches next to resolve, so one transition can be read and edited alone. The compiler checks one against the other in both directions, and rejects a resolver that does not return a select call on every path:

    Pay: {
      branches: [{ target: "Charging" }, { update: "root" }, { stay: true }, { decline: true }],
      resolve: ({ event, select }) => {
        if (event.amount < 0) return select.decline()
        if (event.amount === 0) return select.stay()
        return event.preview
          ? select.update({ root: { total: event.amount } })
          : select.target("Charging", { data: { amount: event.amount } })
      }
    }

    To migrate: move each make({ branches }) group into its transition and drop its keys and title, so select.key(...) becomes select.target(path, ...), select.update({ owner: value }), select.history(path), select.initialize({ input }), or select.stay(). Two keys that reached the same destination are now one entry. Remove declinable: true, list { decline: true }, and replace the decline() context function with select.decline().

    none is replaced: { none: true } becomes { stay: true }, { none: true, reenter: true } becomes { reenter: true }, and { none: true, resolve } becomes { stay: true, commands }. Every plain transition accepts commands: (context, enqueue) => ....

    update is now a record with one owner, so data only ever means the target's value: { update: "root", data } becomes { update: { root: data } }, and { target, update: "Owner", data: () => ({ target, update }) } becomes { target, data, update: { Owner: value } }. Inside a branches list, an entry still names its owner as a string, { target, update: "Owner" }, and the value goes in its select call.

    guard and decline now exist only on on handlers and always. On onDone, onFailure, onElement, onSnapshot, and choice, which have no other candidate, use { stay: true } or select a destination. A retained transition's branchKey and a transition definition's key are now the entry as written, such as target:Paid, and title is removed.

    In the Oxlint plugin, no-conditional-none-branch becomes no-conditional-stay-branch, and no-redundant-resolve is removed because the compiler now rejects what it reported. Resolvers for invocation outcomes and always may select stay conditionally, because Machine.can queries only events.

Patch Changes

  • 7d0e987: Update the devtools file watcher to chokidar 6. The devtools CLI now requires Node.js 22.22 or newer.

    Build the Oxlint plugin against @oxlint/plugins 1.90.0. The plugin still supports oxlint >=1.80.0 <2.

@github-actions
github-actions Bot force-pushed the changeset-release/main branch 13 times, most recently from f60d636 to f9b7554 Compare November 7, 2026 06:29
@github-actions
github-actions Bot force-pushed the changeset-release/main branch from f9b7554 to 227a883 Compare November 7, 2026 06:40

This branch has not been deployed

No deployments
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.

0 participants