@homie-rocks/studio 0.58.12 → 0.58.13

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,6 +17,20 @@ 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.58.13] - 2026-10-20
21
+
22
+ **Plugin 0.58.7**
23
+
24
+ A hosted workspace offers only the tools that work there, and a build put on the private preview no longer ends the check it is part of.
25
+
26
+ ### Changed
27
+
28
+ - In a hosted workspace (`HOMIE_PREVIEW_URL` named by the host), the local MCP server does not offer the tools that set up or sign in this computer, change the studio's own Cloudflare account or build for another platform (setup, scaffold and open, the GitHub, Cloudflare and Stripe sign-ins, the Stripe webhook, domains, the read-only switch, event webhooks, the Game Lab and standalone builds): the studio is already made and online with its host, whose sign-ins, domains and payments those are. Its instructions say so in place of the paragraphs about them.
29
+
30
+ ### Fixed
31
+
32
+ - `deploy --preview` inside a check or playtest no longer ends that run's progress feed as passed before the check and the pictures have run; its stage says the build is on the private preview, not live.
33
+
20
34
  ## [0.58.12] - 2026-10-20
21
35
 
22
36
  **Plugin 0.58.6**
@@ -1273,11 +1273,12 @@ async function tracked(root, stage, run, command) {
1273
1273
  }
1274
1274
  if (!result?.ok) { feed.stage(stage, 'failed', result?.why ?? 'failed'); return result; }
1275
1275
  const note = stage === 'build' ? `Built ${(result.games ?? []).map((g) => `${g.id} (${Math.round(g.bytes / 1024)} KB)`).join(', ') || 'the site'}`
1276
- : stage === 'deploy' ? `Live: ${result.url ?? 'deployed'}`
1276
+ : stage === 'deploy' ? `${flags.has('preview') ? 'On the private preview' : 'Live'}: ${result.url ?? 'deployed'}`
1277
1277
  : result.command === 'port check' ? `${result.passed.length} passed${result.skipped.length ? `, ${result.skipped.length} skipped` : ''} in ${Math.round(result.totalMs / 1000)} s`
1278
1278
  : result.kind === 'app' ? `App ${result.game ?? ''}: wall and two phones, shared action and reconnect passed` : `Room ${result.room}: round ${result.round?.n} finished with ${result.round?.humans} people in ${Math.round(result.totalMs / 1000)} s`;
1279
1279
  feed.stage(stage, 'done', note);
1280
- if (stage === 'deploy') {
1280
+ // A build put on the private preview is not live: the run it is part of (a check, a playtest) carries on.
1281
+ if (stage === 'deploy' && !flags.has('preview')) {
1281
1282
  const doc = feed.doc;
1282
1283
  const game = (result.games ?? []).find((g) => g.id === doc.id) ?? (result.games ?? [])[0];
1283
1284
  if (game?.play) feed.preview({ url: game.play });
package/lib/mcp-tools.mjs CHANGED
@@ -478,6 +478,14 @@ export function hostedPreview(root, env = process.env) {
478
478
  return url.href.replace(/\/+$/, '');
479
479
  }
480
480
 
481
+ /**
482
+ * A hosted workspace (HOMIE_PREVIEW_URL named by the host): the studio is already made and online with the host,
483
+ * and its sign-ins, domains, payments and webhooks are the host's, so the tools that set up or sign in this
484
+ * computer, change the studio's own Cloudflare account, or build for another platform are not offered there.
485
+ */
486
+ export const HOSTED_OFF = Object.freeze(['setup_prepare', 'setup_status', 'studio_scaffold', 'studio_fold', 'studio_open', 'github_login', 'cloudflare_login', 'stripe_login', 'stripe_webhook', 'studio_domain', 'studio_read_only', 'studio_events_webhook', 'game_lab', 'game_standalone']);
487
+ export const hostedHere = (env = process.env) => Boolean(String(env.HOMIE_PREVIEW_URL ?? '').trim());
488
+
481
489
  /** The step that puts the studio's current build on its hosted preview (a deploy --preview builds first). */
482
490
  const PREVIEW_STEP = { label: 'the build on the private preview', args: ['deploy', '--preview'] };
483
491
 
@@ -1593,7 +1601,7 @@ export function toolDefs(ctx, avail = {}) {
1593
1601
  // Every tool says whose it is: a Claude app may also have the Homie house app's own MCP server (its room and TV
1594
1602
  // tools), a different server with different tools.
1595
1603
  for (const t of tools) if (!t.description.startsWith('Homie Studio')) t.description = `Homie Studio: ${t.description}`;
1596
- return tools;
1604
+ return hostedHere() ? tools.filter((t) => !HOSTED_OFF.includes(t.name)) : tools;
1597
1605
  }
1598
1606
 
1599
1607
  /** Local processing availability only; provider connections belong to the AI host. */
package/lib/mcp.mjs CHANGED
@@ -23,7 +23,7 @@
23
23
  import { existsSync, readFileSync } from 'node:fs';
24
24
  import { join } from 'node:path';
25
25
  import { PACKAGE_ROOT } from './studio.mjs';
26
- import { DESKTOP_APPROVALS, StudioContext, UI, availability, inDesktopApp, toolDefs } from './mcp-tools.mjs';
26
+ import { DESKTOP_APPROVALS, StudioContext, UI, availability, hostedHere, inDesktopApp, toolDefs } from './mcp-tools.mjs';
27
27
  import { stopAllJobs, toolPath } from './jobs.mjs';
28
28
  import { shrinkPictureData } from './pictures.mjs';
29
29
  import { STUDIO_VERSION } from './version.mjs';
@@ -56,8 +56,20 @@ Telling Homie (homie_feedback): when the person is stuck, confused or frustrated
56
56
 
57
57
  Long work (npm install, check, playtest, deploy, renders) runs in the background: the tool answers at once with a card that follows it, and build_progress or studio_job reads where it is. studio_guide has Homie's full guide for each job (game, plan, port, playtest, publish, music, sound, art, video). Never put a key or password in a file or the chat. If Homie's homie.rocks connector is connected too, its tools of the same names say what to run; these run it.`;
58
58
 
59
+ /**
60
+ * In a hosted workspace (mcp-tools.mjs hostedHere), the paragraphs about this computer's setup, sign-ins, the
61
+ * person's own domain, payments setup, the Game Lab and standalone builds give way to one about the host.
62
+ */
63
+ export const HOSTED_INSTRUCTIONS = 'This toolkit runs in a workspace the studio\'s host made for it, away from the person\'s screen: the studio is already made and online with the host, and its sign-ins, domains, payments and webhooks are the host\'s, so the tools for those are not offered here. Build the requested thing and check it. preview_run puts the build on the studio\'s private preview and gives its link; check and playtest run there with a browser in the cloud. Only when going live was requested, studio_deploy puts it live (the host decides who may).';
64
+ const HOSTED_DROPS = [/^Run setup_status /, /^Show progress briefly/, /^For a shop, /, /^For a custom domain /, /^If studio_scaffold finds /, /^A studio made elsewhere /, /^To make one mechanic /, /^A game as an app of its own /];
65
+ export function hostedInstructions(text = INSTRUCTIONS) {
66
+ const paragraphs = text.split('\n');
67
+ const at = paragraphs.findIndex((p) => HOSTED_DROPS[0].test(p));
68
+ const kept = paragraphs.map((p, i) => (i === at ? HOSTED_INSTRUCTIONS : HOSTED_DROPS.some((d) => d.test(p)) ? null : p)).filter((p) => p !== null);
69
+ return kept.join('\n').replace(/\n{3,}/g, '\n\n');
70
+ }
59
71
  /** What the server tells the model as it connects: the checklist, and in the Claude desktop app what it asks the person. */
60
- export const instructionsFor = ({ desktop = false } = {}) => (desktop ? `${INSTRUCTIONS}\n\n${DESKTOP_APPROVALS}` : INSTRUCTIONS);
72
+ export const instructionsFor = ({ desktop = false, hosted = false } = {}) => { const base = hosted ? hostedInstructions() : INSTRUCTIONS; return desktop ? `${base}\n\n${DESKTOP_APPROVALS}` : base; };
61
73
 
62
74
  const CARD_FILES = { [UI.setup]: 'setup.js', [UI.build]: 'build.js', [UI.studio]: 'studio.js', [UI.codex]: 'codex.js', [UI.lab]: 'lab.js', [UI.style]: 'style.js', [UI.decision]: 'decision.js', [UI.cast]: 'cast.js', [UI.lineup]: 'lineup.js', [UI.rights]: 'rights.js', [UI.animation]: 'animation.js', [UI.feedback]: 'feedback.js' };
63
75
  const CARD_TITLES = { [UI.setup]: 'Studio setup', [UI.build]: 'Build progress', [UI.studio]: 'Studio', [UI.codex]: 'Game Codex', [UI.lab]: 'Game Lab', [UI.style]: 'Style board', [UI.decision]: 'Look decision', [UI.cast]: 'Cast', [UI.lineup]: 'Lineup', [UI.rights]: 'Rights', [UI.animation]: 'Clips', [UI.feedback]: 'Tell Homie' };
@@ -173,7 +185,7 @@ export async function serveMcp({ studios = null, skills = null, cwd = process.cw
173
185
  protocolVersion: PROTOCOLS.includes(asked) ? asked : PROTOCOLS[0],
174
186
  capabilities: { tools: { listChanged: true }, resources: { listChanged: false }, prompts: { listChanged: false } },
175
187
  serverInfo: { name: 'homie-studio', title: 'Homie Studio', version: STUDIO_VERSION },
176
- instructions: instructionsFor({ desktop: ctx.desktop }),
188
+ instructions: instructionsFor({ desktop: ctx.desktop, hosted: hostedHere() }),
177
189
  });
178
190
  }
179
191
  case 'ping': return reply({});
@@ -4555,7 +4555,7 @@
4555
4555
  }
4556
4556
  }
4557
4557
  },
4558
- "0.58.12": {
4558
+ "0.58.13": {
4559
4559
  "files": {
4560
4560
  "CLAUDE.md": "ddf2b2a0376202f6",
4561
4561
  "README.md": "684b3cca8001673c",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homie-rocks/studio",
3
- "version": "0.58.12",
3
+ "version": "0.58.13",
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
  // Generated by lib/build-identity.mjs; identifies the bundled runtime sources.
2
- export const STUDIO_BUILD = Object.freeze({"version":"0.58.12","sha256":"c4b8a5e3b41289d47fc410729449c3ba63c921bae04042e8c2c09c15053c11e9"});
2
+ export const STUDIO_BUILD = Object.freeze({"version":"0.58.13","sha256":"9967c5676e36a715a20363398c63d98a28510e203e0b25523effa77a7cb8081f"});
@@ -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.58.12';
2
+ export const STUDIO_VERSION_TAG = '0.58.13';