@homie-rocks/studio 0.58.12 → 0.58.14
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 +24 -0
- package/bin/homie-studio.mjs +3 -2
- package/lib/mcp-tools.mjs +11 -1
- package/lib/mcp.mjs +19 -3
- package/lib/template-history.json +1 -1
- package/package.json +1 -1
- package/worker/build-id.mjs +1 -1
- package/worker/version.mjs +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -17,6 +17,30 @@ 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.14] - 2026-10-20
|
|
21
|
+
|
|
22
|
+
**Plugin 0.58.8**
|
|
23
|
+
|
|
24
|
+
A hosted workspace no longer offers the tools that need the person's own fal or Stripe account.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- In a hosted workspace, the local MCP server does not offer `asset_make`, `character_make`, `stripe_shop_plan` or `stripe_bookings_sync`, which generate on the person's own fal account or set up the shop on their own Stripe account, and its instructions no longer promise them or ask the person to sign in to providers there.
|
|
29
|
+
|
|
30
|
+
## [0.58.13] - 2026-10-20
|
|
31
|
+
|
|
32
|
+
**Plugin 0.58.7**
|
|
33
|
+
|
|
34
|
+
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.
|
|
35
|
+
|
|
36
|
+
### Changed
|
|
37
|
+
|
|
38
|
+
- 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.
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- `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.
|
|
43
|
+
|
|
20
44
|
## [0.58.12] - 2026-10-20
|
|
21
45
|
|
|
22
46
|
**Plugin 0.58.6**
|
package/bin/homie-studio.mjs
CHANGED
|
@@ -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' ?
|
|
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
|
-
|
|
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,16 @@ 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
|
+
// Generation on the person's own fal account and the shop on their own Stripe account: a hosted workspace has neither.
|
|
488
|
+
'asset_make', 'character_make', 'stripe_shop_plan', 'stripe_bookings_sync']);
|
|
489
|
+
export const hostedHere = (env = process.env) => Boolean(String(env.HOMIE_PREVIEW_URL ?? '').trim());
|
|
490
|
+
|
|
481
491
|
/** The step that puts the studio's current build on its hosted preview (a deploy --preview builds first). */
|
|
482
492
|
const PREVIEW_STEP = { label: 'the build on the private preview', args: ['deploy', '--preview'] };
|
|
483
493
|
|
|
@@ -1593,7 +1603,7 @@ export function toolDefs(ctx, avail = {}) {
|
|
|
1593
1603
|
// 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
1604
|
// tools), a different server with different tools.
|
|
1595
1605
|
for (const t of tools) if (!t.description.startsWith('Homie Studio')) t.description = `Homie Studio: ${t.description}`;
|
|
1596
|
-
return tools;
|
|
1606
|
+
return hostedHere() ? tools.filter((t) => !HOSTED_OFF.includes(t.name)) : tools;
|
|
1597
1607
|
}
|
|
1598
1608
|
|
|
1599
1609
|
/** 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,24 @@ 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
|
+
// The host holds the studio's accounts, and the person's own provider accounts are not here.
|
|
70
|
+
return kept.join('\n')
|
|
71
|
+
.replace(/ Open provider authorization flows when needed; the person signs in and approves, while you handle configuration\./, '')
|
|
72
|
+
.replace(/ asset_make makes a prop on the person's own fal account only after they agreed to its price;/, '')
|
|
73
|
+
.replace(/\n{3,}/g, '\n\n');
|
|
74
|
+
}
|
|
59
75
|
/** 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 ? `${
|
|
76
|
+
export const instructionsFor = ({ desktop = false, hosted = false } = {}) => { const base = hosted ? hostedInstructions() : INSTRUCTIONS; return desktop ? `${base}\n\n${DESKTOP_APPROVALS}` : base; };
|
|
61
77
|
|
|
62
78
|
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
79
|
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 +189,7 @@ export async function serveMcp({ studios = null, skills = null, cwd = process.cw
|
|
|
173
189
|
protocolVersion: PROTOCOLS.includes(asked) ? asked : PROTOCOLS[0],
|
|
174
190
|
capabilities: { tools: { listChanged: true }, resources: { listChanged: false }, prompts: { listChanged: false } },
|
|
175
191
|
serverInfo: { name: 'homie-studio', title: 'Homie Studio', version: STUDIO_VERSION },
|
|
176
|
-
instructions: instructionsFor({ desktop: ctx.desktop }),
|
|
192
|
+
instructions: instructionsFor({ desktop: ctx.desktop, hosted: hostedHere() }),
|
|
177
193
|
});
|
|
178
194
|
}
|
|
179
195
|
case 'ping': return reply({});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@homie-rocks/studio",
|
|
3
|
-
"version": "0.58.
|
|
3
|
+
"version": "0.58.14",
|
|
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",
|
package/worker/build-id.mjs
CHANGED
|
@@ -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.
|
|
2
|
+
export const STUDIO_BUILD = Object.freeze({"version":"0.58.14","sha256":"c7e10f373715c539c6429b931fa469f4d4c246e4e3e7fa1fda71f370724612c5"});
|
package/worker/version.mjs
CHANGED
|
@@ -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.
|
|
2
|
+
export const STUDIO_VERSION_TAG = '0.58.14';
|