Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 0 additions & 18 deletions .changeset/debug-freezes-world-values.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/effect-4-1-1.md

This file was deleted.

13 changes: 0 additions & 13 deletions .changeset/node-22.md

This file was deleted.

11 changes: 0 additions & 11 deletions .changeset/pixel-outlines-bent-grids.md

This file was deleted.

5 changes: 0 additions & 5 deletions .changeset/prototype-where-fun-lives.md

This file was deleted.

13 changes: 13 additions & 0 deletions packages/browser/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# @typeonce/ritmo-browser

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [50597a8]
- Updated dependencies [d1d864d]
- Updated dependencies [027634b]
- @typeonce/ritmo@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/browser/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-browser",
"version": "0.20.0",
"version": "0.21.0",
"description": "Browser fixed-step loop, keyboard, gamepad, pointer, and touch actions, merged input, local multiplayer, and input capture for Ritmo",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
24 changes: 24 additions & 0 deletions packages/core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,29 @@
# @typeonce/ritmo

## 0.21.0

### Minor Changes

- 50597a8: **Breaking (debug runtimes only): a runtime made with `debug` freezes every value it is handed, so mutating one afterwards throws where it mutates.** Values were stored by reference: an object passed to `Game.Command.spawn`, `commands.insert`, a cell's `set`/`update`, a resource write, `emit`, `runtime.send`, a next-state `set`, or `Game.Runtime.make` stayed connected to the code that made it. Mutating it later changed the world with no write, so `changed` readers missed it, and a `rewind` brought back the mutated value instead of the checkpointed one. A debug runtime now deep-freezes each value as it is queued or written, and the mutation throws a `TypeError`. Typed arrays are skipped, `Map` and `Set` contents stay writable, and runtimes without `debug` behave as before.

If your game's tests or devtools sessions now throw, build a new value instead of mutating the one you handed over:

```diff
-const body = { x: 1, trail: [] }
-commands.spawn(Game.Command.spawn([Body, body]))
-body.x += 1
+commands.spawn(Game.Command.spawn([Body, { x: 1, trail: [] }]))
+// later, in a system
+data.body.update((body) => ({ ...body, x: body.x + 1 }))
```

`Runtime.tick` now points to `FixedLoop.start` for ticking at a fixed rate from a frame loop. The `ritmo` skill now treats a variable a system closes over like a module variable: host input reaches systems through a resource, a sent event, or an input source service.
- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- 027634b: **The `ritmo-prototype` skill prototypes where the fun lives.** It used to start from a verb or the smallest goal, with one exception for story. Now it names five cases. For a verb, build the verb and its feedback. For goals, build the smallest goal. For a story, characters, or a mystery, write a small slice by hand; paper or text is fine when it is faster. For a place to explore, hand-build a small map with a landmark you can see before you can reach it and something off the obvious path. For a mood, bring in the look and sound early. Before this, a game about wandering and discovery got a one-screen loop as its prototype, which tests none of what makes it fun.

## 0.20.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo",
"version": "0.20.0",
"version": "0.21.0",
"description": "The agent-first, type-safe ECS runtime for TypeScript",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
14 changes: 14 additions & 0 deletions packages/devtools/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# @typeonce/ritmo-devtools

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [50597a8]
- Updated dependencies [d1d864d]
- Updated dependencies [027634b]
- @typeonce/ritmo@0.21.0
- @typeonce/ritmo-netcode@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-devtools",
"version": "0.20.0",
"version": "0.21.0",
"description": "Headless debug sessions, trace history, text reports, replays, and fuzzing for Ritmo runtimes",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/devtools/src/internal/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
* `package.json` by `scripts/sync-version.ts` (run by \`pnpm version-packages\`)
* and checked by a test.
*/
export const libraryVersion = "0.20.0"
export const libraryVersion = "0.21.0"
13 changes: 13 additions & 0 deletions packages/math/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# @typeonce/ritmo-math

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [50597a8]
- Updated dependencies [d1d864d]
- Updated dependencies [027634b]
- @typeonce/ritmo@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/math/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-math",
"version": "0.20.0",
"version": "0.21.0",
"description": "The 2D helpers most Ritmo games would otherwise rewrite (vectors, angles, swept collision, flow field), plain data in and out, built on Ops so they replay the same on every engine",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
13 changes: 13 additions & 0 deletions packages/netcode/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# @typeonce/ritmo-netcode

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [50597a8]
- Updated dependencies [d1d864d]
- Updated dependencies [027634b]
- @typeonce/ritmo@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/netcode/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-netcode",
"version": "0.20.0",
"version": "0.21.0",
"description": "Rollback and lockstep sessions over any transport for Ritmo: input timelines, checkpoint history, pacing, resync, and desync checks",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
6 changes: 6 additions & 0 deletions packages/oxlint-plugin/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @typeonce/oxlint-plugin-ritmo

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

## 0.20.0

## 0.19.1
Expand Down
2 changes: 1 addition & 1 deletion packages/oxlint-plugin/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/oxlint-plugin-ritmo",
"version": "0.20.0",
"version": "0.21.0",
"description": "Oxlint rules for Ritmo games: deterministic, headless simulation code and checked runtime results",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
11 changes: 11 additions & 0 deletions packages/pixi/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,16 @@
# @typeonce/ritmo-pixi

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [d1d864d]
- @typeonce/ritmo-render@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/pixi/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-pixi",
"version": "0.20.0",
"version": "0.21.0",
"description": "Pixi container adapter for Ritmo render-node registries",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
13 changes: 13 additions & 0 deletions packages/render/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# @typeonce/ritmo-render

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.

### Patch Changes

- Updated dependencies [50597a8]
- Updated dependencies [d1d864d]
- Updated dependencies [027634b]
- @typeonce/ritmo@0.21.0

## 0.20.0

### Patch Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/render/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-render",
"version": "0.20.0",
"version": "0.21.0",
"description": "Renderer-agnostic entity-to-node mirroring for Ritmo",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
17 changes: 17 additions & 0 deletions packages/tools/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
# @typeonce/ritmo-tools

## 0.21.0

### Minor Changes

- d1d864d: **Breaking: the packages require Node 22 or newer (Node 20 reached end of life on 2026-04-30).** `engines.node` is `>=22` for `@typeonce/ritmo`, `-browser`, `-render`, `-pixi`, `-math`, and `-netcode`; `>=22.12` for `@typeonce/oxlint-plugin-ritmo` (oxlint's own floor); `>=22.15` for `@typeonce/ritmo-devtools` (unchanged); and `>=22.19` for `@typeonce/ritmo-tools` (what `@effect/platform-node` needs). On Node 20, upgrade Node: `nvm install 22` (or 24), or `"node": ">=22"` in your CI's setup step.
- 215ba15: `ritmo-tools pixel`: one-pixel outlines, bent grids, and a shrink that keeps strokes whole, after [ToPixel](https://github.com/daisuqe/ToPixel).

- **Outlines** (`outlines` in a recipe, `--outlines auto|on|off`, **Outlines** on the page; `"auto"` by default): when the picture's dark strokes are about one cell wide, a stroke a grid line split between two pixels goes back to one, never breaking the outline or a corner, and followed lines keep off dark strokes. The report's `grid.outlines` says whether it ran.
- **Follow lines** is now a choice: `"off"`, `"straight"` (every line placed at once, each on a strong edge with every gap near the cell size, instead of one after another), or `"bend"` (lines placed in each row and column of cells on their own, for a grid the generator warped). The page draws bent lines bent.
- **Keep outlines** when shrinking (`--shrink-to`, **Size**) carries outlines over as strokes: thinned back to one pixel without breaking, one-pixel steps turned into diagonals. A one-pixel ring shrunk from 16 to 11 pixels stays whole, where it used to lose its sides.

Breaking: a recipe's `follow` is `"off"`, `"straight"`, or `"bend"`, no longer `true` or `false`, and `--follow` takes one of them. Replace `"follow": true` with `"follow": "straight"` (`--follow straight`), and `"follow": false` with `"follow": "off"` (or leave it out).

### Patch Changes

- ea008a4: `ritmo-tools` depends on Effect 4.1.1 (`effect`, `@effect/platform-node`, and `@effect/platform-node-shared`, still pinned exactly and together).

## 0.20.0

### Minor Changes
Expand Down
2 changes: 1 addition & 1 deletion packages/tools/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@typeonce/ritmo-tools",
"version": "0.20.0",
"version": "0.21.0",
"description": "Asset tools for games made with Ritmo, for agents: fixes AI-made pixel art and animation sheets onto a true pixel grid and a palette, keeps game sounds as JSON recipes, writes game music as JSON songs built around a hum, and draws pixel art effects as code, each with a review page for a person",
"author": "Sandro Maglione",
"license": "MIT",
Expand Down
2 changes: 1 addition & 1 deletion packages/tools/src/internal/version.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
* `package.json` by `scripts/sync-version.ts` (run by `pnpm version-packages`)
* and checked by a test.
*/
export const toolsVersion = "0.20.0"
export const toolsVersion = "0.21.0"