@homie-rocks/studio 0.33.0 → 0.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -17,9 +17,19 @@ To bring a studio up to date, tell Claude: "Upgrade my studio to the newest Homi
17
17
  `npx -y @homie-rocks/studio@latest upgrade`, which shows what's new since the version your studio pins (from this
18
18
  file) and what the upgrade would change, and changes nothing until you agree.
19
19
 
20
+ ## [0.33.1] - 2026-10-08
21
+
22
+ **Plugin 0.34.1** · [#65](https://github.com/homie-rocks/homie/pull/65)
23
+
24
+ A fix for studios upgrading to 0.33.0, found by upgrading one of Homie's own.
25
+
26
+ ### Fixed
27
+
28
+ - **A game that already had its own `src/rules.ts` builds again.** 0.33.0 treated any game with a file of that name as a game whose rules run on the server, checked it against those rules and refused the build. A game is written that way only when its game.json has a `"room"` object; every other game builds exactly as it did, whatever its files are called.
29
+
20
30
  ## [0.33.0] - 2026-10-08
21
31
 
22
- **Plugin 0.34.0** · [#57](https://github.com/homie-rocks/homie/pull/57)
32
+ **Plugin 0.34.0** · [#57](https://github.com/homie-rocks/homie/pull/57) · [release-2026-10-08-studio-0.33.0](https://github.com/homie-rocks/homie/releases/tag/release-2026-10-08-studio-0.33.0)
23
33
 
24
34
  A game's rules can run on your own Cloudflare instead of in a player's browser. This is the first piece of it: the format, the server that runs it, and one example game. Your existing games are not touched.
25
35
 
package/lib/build.mjs CHANGED
@@ -385,7 +385,7 @@ export async function buildGameFiles(esbuild, root, g, out, { maps = false, sour
385
385
  let bundled = null;
386
386
  let chunks = [];
387
387
  const budgets = modelBudgetsOf(g, log);
388
- // RULES PLUS VIEW (rooms on the server). A game with a src/rules.ts has its rules checked, guarded and loaded first:
388
+ // RULES PLUS VIEW (rooms on the server). A game with "room" in game.json and a src/rules.ts has its rules checked, guarded and loaded first:
389
389
  // a rule the wall refuses stops the build here, with the line named. A game without one is hosted by a player's
390
390
  // browser exactly as before, and cannot ask for the server.
391
391
  const ruled = isRulesGame(g);
package/lib/studio.mjs CHANGED
@@ -95,11 +95,12 @@ export function listGames(root) {
95
95
  }
96
96
 
97
97
  /**
98
- * RULES ON THE SERVER (NETPLAY.md section 29). A game written as rules plus view has a src/rules.ts; its settings are
99
- * game.json `"room"` (where its rules run, its tick rate…; rules/rules.ts `roomSettings` checks them at build). Any
100
- * other game is hosted by a player's browser, as before.
98
+ * RULES ON THE SERVER (NETPLAY.md section 29). A game written as rules plus view says so in game.json with a `"room"`
99
+ * object (where its rules run, its tick rate…; rules/rules.ts `roomSettings` checks them at build) and has a
100
+ * src/rules.ts. Any other game is hosted by a player's browser, as before. The file alone decides nothing: games made
101
+ * before this had their own src/rules.ts, with whatever they liked in it, and they build exactly as they did.
101
102
  */
102
- export const isRulesGame = (g) => existsSync(join(g.dir, 'src', 'rules.ts'));
103
+ export const isRulesGame = (g) => g?.room != null && typeof g.room === 'object' && existsSync(join(g.dir, 'src', 'rules.ts'));
103
104
 
104
105
  const RULES_HEADER = '// Written by `homie-studio build` from this studio\'s games. Do not edit: the next build writes it again.\n';
105
106
  /**
@@ -1782,6 +1782,46 @@
1782
1782
  }
1783
1783
  }
1784
1784
  }
1785
+ },
1786
+ "0.33.1": {
1787
+ "files": {
1788
+ "CLAUDE.md": "ddf2b2a0376202f6",
1789
+ "README.md": "684b3cca8001673c",
1790
+ "HANDOFF.md": "29337e2ace95b2e7",
1791
+ "games/README.md": "5ad32fe80c61f117",
1792
+ "music/README.md": "a3dc042dadd39df8",
1793
+ "videos/README.md": "16babc3437d5545b",
1794
+ "posts/README.md": "37841aae476bd540",
1795
+ "site/README.md": "732894273a32dc3f",
1796
+ "site/src/worker.mjs": "fc90f3609cad18ba"
1797
+ },
1798
+ "sections": {
1799
+ "AGENTS.md": {
1800
+ "(intro)": "214aa46eb3a895d5",
1801
+ "## Layout": "8baf49e4291e7e88",
1802
+ "## Commands (all through the pinned CLI in node_modules)": "a7f290579585368c",
1803
+ "## The site": "0cb8dd9a6f8a0096",
1804
+ "## Making games": "2da7fa74c8884834",
1805
+ "## The Game Codex and progress": "0738ef719cef3a4c",
1806
+ "## Art direction and models": "a48fff7bf0a5f2fc",
1807
+ "## Running live games (the back office)": "51ebf2ab756f6e4d",
1808
+ "## Servers and AI seats": "98d08705087a33ec",
1809
+ "## Selling things (the shop)": "56225d9c6292d975",
1810
+ "## Continuing a build from the Claude app": "0d68081e924ca419",
1811
+ "## Rules": "2e6b29afb85dcf7e",
1812
+ "## Telling Homie": "80b46fdd9e578db8",
1813
+ "## Beta": "9d02638207a26e73"
1814
+ }
1815
+ },
1816
+ "named": {
1817
+ "Homie Arcade": {
1818
+ "sections": {
1819
+ "AGENTS.md": {
1820
+ "## Commands (all through the pinned CLI in node_modules)": "7cad8fd10f62fef1"
1821
+ }
1822
+ }
1823
+ }
1824
+ }
1785
1825
  }
1786
1826
  }
1787
1827
  }
@@ -2068,7 +2068,7 @@ such a game fails the build with the reason. So does a ported game.
2068
2068
 
2069
2069
  ### 29.1 Who is the host
2070
2070
 
2071
- - game.json `"room": { "host": "server" }` (the default for a game that has a `src/rules.ts`). The
2071
+ - game.json `"room": { "host": "server" }` (the default for a game with a `"room"` object in game.json and a `src/rules.ts`). The
2072
2072
  build checks the rules, guards them (section 29.5) and puts them into the studio's Worker
2073
2073
  (`site/src/rules/`, imported by `site/src/worker.mjs` and handed over with `hostRules`).
2074
2074
  - When a room of such a game opens, its `Table` starts the host runtime **before the first socket
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homie-rocks/studio",
3
- "version": "0.33.0",
3
+ "version": "0.33.1",
4
4
  "description": "A studio for games, music and video on its own Cloudflare: scaffold, multiplayer starters on the netplay contract, a port toolkit that makes existing single-player web games multiplayer, the site Worker with public rooms (Table/Lobby Durable Objects and D1, all on the free Workers plan, no payment method), a site with the hub's sections (Home, Games, Music, Videos, Rooms, Posts with feeds) in the studio's own look, an epic landing page for every game, big songs and videos in the studio's own R2 once it has storage (uploaded, checked by SHA-256, served at the same addresses), deploy, and the homie.rocks directory.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -1,2 +1,2 @@
1
1
  /** The @homie-rocks/studio version this Worker code is (package.json's; a test keeps them equal). Cache-busts /_homie/site.js. */
2
- export const STUDIO_VERSION_TAG = '0.33.0';
2
+ export const STUDIO_VERSION_TAG = '0.33.1';