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
2 changes: 1 addition & 1 deletion examples/abyss-framework/playtests/replay.playtest.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"world": {
"runtime": {
"agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36",
"core": "0.3.13",
"core": "0.3.14",
"randomState": 90210,
"rapier": null,
"step": 0.016666666666666666
Expand Down
2 changes: 1 addition & 1 deletion packages/animation-mcp/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "threenative-animation-mcp",
"version": "0.1.10",
"version": "0.1.11",
"license": "MIT",
"description": "Author, repair and verify character animation through one MCP: inspect rigs, attach props, edit and verify clips, and open a calibrator view.",
"keywords": [
Expand Down
2 changes: 1 addition & 1 deletion packages/animation-mcp/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ function openView(input: z.output<typeof ViewInputSchema>) {
}

export function createAnimationServer(): McpServer {
const server = new McpServer({ name: "threenative-animation", version: "0.1.10" });
const server = new McpServer({ name: "threenative-animation", version: "0.1.11" });

server.registerTool(
"animation_inspect",
Expand Down
2 changes: 1 addition & 1 deletion packages/assets/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@threenative/assets",
"version": "0.3.14",
"version": "0.3.15",
"license": "MIT",
"description": "Content-addressed asset compile step for ThreeNative games.",
"keywords": ["threenative", "three", "threejs", "assets", "gltf", "asset-pipeline", "webgpu"],
Expand Down
2 changes: 1 addition & 1 deletion packages/blender-bridge/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@threenative/blender-bridge",
"version": "0.2.6",
"version": "0.2.7",
"license": "MIT",
"description": "Runs an installed Blender headlessly so a downloaded .fbx becomes a GLB a ThreeNative game loads. Ships no Blender.",
"keywords": ["threenative", "blender", "fbx", "gltf"],
Expand Down
2 changes: 1 addition & 1 deletion packages/core/mcp/animation-server.mjs

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/core/mcp/engine-server.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -1359,7 +1359,7 @@ async function handleLine(line2, manifestFile) {
capabilities: { tools: { listChanged: false } },
instructions: AUTHORING_INSTRUCTIONS,
protocolVersion: "2025-06-18",
serverInfo: { name: "threenative-engine-mcp", version: "0.2.13" }
serverInfo: { name: "threenative-engine-mcp", version: "0.2.14" }
});
}
if (request.method === "tools/list") {
Expand Down
6 changes: 3 additions & 3 deletions packages/core/mcp/servers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,10 @@ export const MCP_SERVERS = Object.freeze({
* checkout whose bundle has not been built. */
export const MCP_PACKAGES = Object.freeze({
assets: Object.freeze({ name: "threenative-asset-mcp", version: "0.16.0" }),
terrain: Object.freeze({ name: "@threenative/terrain", version: "0.1.9" }),
terrain: Object.freeze({ name: "@threenative/terrain", version: "0.1.10" }),
sculpt: Object.freeze({ name: "threenative-sculpt-mcp", version: "0.2.2" }),
engine: Object.freeze({ name: "threenative-engine-mcp", version: "0.2.13" }),
animation: Object.freeze({ name: "threenative-animation-mcp", version: "0.1.10" }),
engine: Object.freeze({ name: "threenative-engine-mcp", version: "0.2.14" }),
animation: Object.freeze({ name: "threenative-animation-mcp", version: "0.1.11" }),
// `args` fixes the launch for every host. The Chrome flags are `WEBGPU_BROWSER_ARGS` from
// `@threenative/playtest`, so a DevTools trace profiles the same adapter a playtest does and not
// SwiftShader. An isolated profile keeps the user's own Chrome profile out, and the two opt-outs
Expand Down
4 changes: 2 additions & 2 deletions packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@threenative/core",
"version": "0.3.13",
"version": "0.3.14",
"license": "MIT AND GPL-2.0-or-later",
"description": "The small vanilla Three.js game runtime foundation.",
"keywords": [
Expand Down Expand Up @@ -122,7 +122,7 @@
"@typescript/native": "catalog:"
},
"peerDependencies": {
"@threenative/playtest": ">=0.3.13 <0.4.0",
"@threenative/playtest": ">=0.3.14 <0.4.0",
"react": ">=19.2.0 <20",
"react-reconciler": ">=0.33.0 <0.34"
},
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/version.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
// Generated by scripts/generate-version.mjs - do not edit. Source: package.json.
export const CORE_VERSION = "0.3.13";
export const CORE_VERSION = "0.3.14";
2 changes: 1 addition & 1 deletion packages/create-threenative/__tests__/build.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1495,7 +1495,7 @@ cpSync("public", out, { recursive: true });
await published("create-threenative"),
);
expect(manifest.optionalDependencies?.["@threenative/runtime-native"], template).toBe(
await published("runtime-native"),
`>=${await published("runtime-native")}`,
);
expect(manifest.pnpm?.onlyBuiltDependencies, template).toContain(
"@threenative/runtime-native",
Expand Down
6 changes: 1 addition & 5 deletions packages/create-threenative/__tests__/core-pair.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { describe, expect, it } from "vitest";
import { CORE_TEMPLATE_FLOOR, pairsWithCore } from "../src/core-pair.js";
import { pairsWithCore } from "../src/core-pair.js";
import { CORE_PACKAGE_VERSION } from "../src/mcp-servers.js";

const [MAJOR, MINOR, PATCH] = CORE_PACKAGE_VERSION.split(".").map(Number) as [
Expand All @@ -15,10 +15,6 @@ function previousRelease(): string {
}

describe("the core a game may pair with", () => {
it("ships the same floor the templates declare", () => {
expect(CORE_TEMPLATE_FLOOR).toBe(`>=${CORE_PACKAGE_VERSION}`);
});

it("accepts the release this create-threenative was built against", () => {
expect(pairsWithCore(CORE_PACKAGE_VERSION)).toBe(true);
});
Expand Down
13 changes: 9 additions & 4 deletions packages/create-threenative/__tests__/publication.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import path from "node:path";
import { pathToFileURL } from "node:url";
import { promisify } from "node:util";
import { describe, expect, it } from "vitest";
import { templateSpecifier } from "../../../scripts/version-range.js";
import { publicWorkspacePackages } from "../../../scripts/workspace-packages.js";
import { makeTempDir } from "../../../test-support/temp-dir.js";

Expand Down Expand Up @@ -185,9 +186,11 @@ describe("registry publication", () => {
"utf8",
),
) as { dependencies: Record<string, string> };
// And a template must pin whatever that version is, exactly — a scaffold pinning a
// version the workspace no longer publishes cannot install.
expect(templateManifest.dependencies["@threenative/ui"], template).toBe(packageJson.version);
// And a template's floor must be that version — a floor the workspace does not publish
// cannot install.
expect(templateManifest.dependencies["@threenative/ui"], template).toBe(
templateSpecifier("@threenative/ui", packageJson.version),
);
}
});

Expand All @@ -208,7 +211,9 @@ describe("registry publication", () => {
for (const [name, version] of Object.entries(template[field] ?? {})) {
const workspaceVersion = versions.get(name);
if (workspaceVersion === undefined) continue;
expect(version, `${entry.name} ${field}.${name}`).toBe(workspaceVersion);
expect(version, `${entry.name} ${field}.${name}`).toBe(
templateSpecifier(name, workspaceVersion),
);
}
}
}
Expand Down
64 changes: 32 additions & 32 deletions packages/create-threenative/__tests__/scaffold.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,68 +116,68 @@ const PACK_GENERATED_PAGES: readonly string[] = ["capability-reference.md"];
const SCAFFOLD_TREE_HASHES: Readonly<Record<string, IScaffoldTreePin>> = {
// scaffold-pin:begin
"action-rpg": {
shared: "89aa333d822a6627d2ad23f96521abf4ea7ba92bcec1ed55f9c30a8ee83ff250",
kit: "6cc2f1560f2f68724630383b3db8dadfe96636b84143ff1e26f2c64a51272b6a",
shared: "1da79b069ff7d69c2ade4fcdd085d90cdea5feb45e32080f2a4387bfc4da4142",
kit: "eb6d822002840052a347d7f2f89dd7344d77586fc94a8de9282a4a7ef4622683",
},
adventure: {
shared: "ddac540bdf78253f87db7432d1b80a2a4dc7e20809cd1006b3cc261492b7d6fa",
kit: "b7f39b0565b23e13e1d5452cf1ac450d31c5ef0a1e628e62d5b79d5a0a13b03d",
shared: "a62c06e9f4ac0a1cd0b7bc37dc2c7b51f45d6fffba151dc6b526a56073c7e0d9",
kit: "029c6b6abd71ee3f1859a38686083b21519ddaec41d11aac8e69729dc3080c6e",
},
collectathon: {
shared: "3a0df8488b8d94deb01464e10fabde2d6ac4e65647e98f39f5afb235ec71ffae",
kit: "6c1a27670ecb528be120fef09851e7e0d05883e0453bf993161dfbd4b5d0a038",
shared: "ca1fed0952b59d4e4a95ae954c088ab1de3d24feb28f479227de41a63d7d78be",
kit: "02a3a047755a35a43e313d4bc9366e561344c68cf74fd5401e397ac9773adac6",
},
kart: {
shared: "676434e30b0ed4e2dfe698e5d6ab393e47fe7779ef7df617ca8f12f1f24c7748",
kit: "88430371871175bf3ab95086f4450089e8df119ef823911dfa049f5437b4add7",
shared: "0d37501cd26b8b776bdc9a06872d371209fa9d3716781a98881d90bd2b73c0ab",
kit: "616b99f3bb89b01e3286dfea85dd09054a0c6516df2f0bc4ad3084f671c89d1f",
},
minimal: {
shared: "f4b43e245b3a9810947d7a3b5652b409ffb097cafb7834ed215567f83d3379af",
kit: "7b8213f03fcb0282bb1de3de5cfa44bfca55efce6a53f6a9e5800ff10c07f495",
shared: "c3ec6d627ae7179dff4da43ba55224b40be020ef97ec8369db8f6485c518fe4d",
kit: "6a9913e467973cf435d2186c6659d84870f8258942734944a8bcd8bbf5aafb61",
},
platformer: {
shared: "0720f0c8f3374f5d41e7540dd3fe16f4ceeb2b5717fe2b163bafd4d7742983a8",
kit: "3e102d862444eac65584dca4dd550268652a01f349e7eefea994a9a09fc65bb1",
shared: "dc214fb679ee15d67275f6a1e81c286e707c72f69d4edba642fef15bda651c7c",
kit: "76bfa5d4e3c5893ba2b6ada9674d5ad164552bc6939b6519050731445b31a6dd",
},
puzzle: {
shared: "865623ec3097b295dfc67012b3e61eaba0d7a322e2b6ec59620478863fdbdae6",
kit: "e237631bdc0e72156381d699cb3e0d1b89a0ecfe3f00d65b101e1d58b6e602a4",
shared: "7145f06e3428cda0165af08063ea815c642608884a481a85c7649d3c16b02cfe",
kit: "c7a46ea4961d8e285179c3d2701f128d4b5e7666731dc41f70563ae060c12a2a",
},
racing: {
shared: "8463fb44077a88e0c5938db571af259c59f668eedca9d477a0bc4b70239c3c60",
kit: "75fe644366e883be5b9f98f2901208d6b1fbf84b9522a61b00de94b0ca91696e",
shared: "bc31777801c8aec0fdd7fa178f9fcd39cf42cb92759bb705242b1a1c60299403",
kit: "4167e639c4b8361ab7c9dae8caee765aa7487384f8d7de0657fc7ce5092c7137",
},
rain: {
shared: "f3d68ab1eb2759202e15499046cc80d362d3586be314f68610eed0bf2c20367e",
kit: "f36b4ae9fc412a295749096fcd03c2e37b14aeda3dcdf144a2e536001b1380e1",
shared: "761d21aebc00bbe8b75a37c0a8dd67b17dd7fcf78ab3a29a9a82ad7bf71119d3",
kit: "2030c9113d1088e23b35398275f177829a305ff398047a5259529334bd4a3431",
},
rts: {
shared: "9e7c20d1b7eceb245eb9b1db1e30d1294f6533a9b69ef0f3e3bfad1c67d86b38",
kit: "bf48b027dcc68e5be5e5fd18cb67f1b28ddc558b6fb2aaae7d927feab10c1cde",
shared: "40898821275b3b391859efdb96a2b223eadf0c7b5e4091a6184affae49e6697e",
kit: "fc002302f30c5038e01cf7a4f6a58856b0381da4b55318aa55a53a2a011dfbbd",
},
runner: {
shared: "cd43eda17fbdc91bedb7680441daf0a30dee0f3b1e19bacebb124ab4471ff1ba",
kit: "3e7b332420e36bad39c659b1e9bf933f0a489891a9bffa9f6dc41ea623822b5b",
shared: "5d3f7fde13c73426ab0320e96777ba660c1e5c844f38d41e11248d9d6246e861",
kit: "805231f689753c53618fd1d6d87e44d3b99d2f64d8a8da1b5e0461426fd6844b",
},
sailing: {
shared: "6e39c4c67676a2c1d4ae7fdf148a0e7cc4dde3b6207b49da84701a4266e720c0",
kit: "91a786b88aef46b7a943cf16dcf7b3f26bc6a6fefddb2e2827c76fadf97dd8b8",
shared: "9c036afebb6db487a4a69a52c2c08be24555b4c66804b605f0a0a87604739391",
kit: "c699544738f583389987430e35605e7251dad9aa0a212dc13a6a2e56f0a4389c",
},
shooter: {
shared: "dbe1eb0f2872275fc9759deea95c4c624f7fa82fb7adccab3d22a20889cabaac",
kit: "572809c688d58403bdda547c90e8bcd01d9ab39ee5dd452c36647e7d149855cd",
shared: "ede46ec4e52905a0829b87a2b9d1820a9889f8106322635203e47b89602d3a1f",
kit: "5587118a1f7401b5f339f7d4717c89b8c454b590980666e2c0abcf731e8da643",
},
snow: {
shared: "130389a38fb48663bd0cd391751ab3d2eb0c47e0d535e236b09366fd1fc93099",
kit: "aad24bfe38ba18bdb701216ac9734a5330b8fc3c142ff091a3137e2d309630c7",
shared: "29918a5b10ee296d903b10c6741ef8d78663e54be191de4350b5524248446b80",
kit: "4d3e9c38d2696e890bc759af60253094f6ba0d5aeb4eae714e4442ffe92caa85",
},
starter: {
shared: "000bd75177222e5b3ab03beee4118b7c63a8dd59fdc316487d61ff7b3758376d",
kit: "d81a3f22192640f60b7780330e8b121e2b07ca309eeca1ac13fd7eba7d13a6b6",
shared: "20636d0769fdab2f5054781a879f7d2eb24873db6bd9f324828fe342d32e12a4",
kit: "0678edb73f1932af31d477eb7da3a29497e3c30d10a42c2196dc1fef5abfec00",
},
"tower-defense": {
shared: "119e88ddb3fdcf2f3f4c0aade6e62e4b480e2b6a1292d69552040fb6e8083470",
kit: "ebf8cfa6e2a0ed443eebdc81573528eda9bbea5cb5a878b99bdcccf9dce7c90e",
shared: "d804c83f9bce5a20a42bc4e4b4c01646437b34556336d884425e7a890ded5856",
kit: "5e71000a474c978d7e1aa8ee944e9cc196cf4c174e566cfdb8589db9032015c6",
},
// scaffold-pin:end
};
Expand Down
6 changes: 3 additions & 3 deletions packages/create-threenative/animation-mcp-tools.json
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
{
"comment": "The animation MCP surface a generated project actually gets. `tools` is set-equal to the live tools/list response of version 0.1.10, packed from this workspace and installed from that tarball into a clean directory — never read from src/. `recommended` is the ordered loop the shipped agent docs describe. Regenerate with `pnpm tsx scripts/capture-mcp-tools.ts`.",
"version": "0.1.10",
"comment": "The animation MCP surface a generated project actually gets. `tools` is set-equal to the live tools/list response of version 0.1.11, packed from this workspace and installed from that tarball into a clean directory — never read from src/. `recommended` is the ordered loop the shipped agent docs describe. Regenerate with `pnpm tsx scripts/capture-mcp-tools.ts`.",
"version": "0.1.11",
"serverInfo": {
"name": "threenative-animation",
"version": "0.1.10"
"version": "0.1.11"
},
"recommended": ["animation_inspect", "animation_attach", "animation_open_view"],
"tools": [
Expand Down
2 changes: 1 addition & 1 deletion packages/create-threenative/engine-mcp-tools.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"comment": "The engine capability MCP surface shipped through @threenative/core. The golden path also calls a mechanically explicit cross-system request so a packaged consumer proves full-request discovery without repository source.",
"version": "0.2.13",
"version": "0.2.14",
"tools": [
"engine_capability_detail",
"engine_reference_detail",
Expand Down
4 changes: 2 additions & 2 deletions packages/create-threenative/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "create-threenative",
"version": "0.2.18",
"version": "0.2.19",
"license": "MIT",
"description": "Scaffold a readable ThreeNative game project.",
"keywords": [
Expand Down Expand Up @@ -108,6 +108,6 @@
"@types/estree": "1.0.8"
},
"peerDependencies": {
"@threenative/assets": ">=0.3.14 <0.4.0"
"@threenative/assets": ">=0.3.15 <0.4.0"
}
}
6 changes: 0 additions & 6 deletions packages/create-threenative/src/core-pair.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ function parts(value: string): readonly [number, number, number] | undefined {
return parsed.every(Number.isSafeInteger) ? parsed : undefined;
}

/**
* `0.3.13` -> `>=0.3.13`, matching what the templates ship. The scaffolder writes the specifier and
* the gates compare against it, so both spellings live in one place.
*/
export const CORE_TEMPLATE_FLOOR = `>=${CORE_PACKAGE_VERSION}`;

/**
* Whether a game's installed core can carry the authoring layer this create-threenative writes.
*
Expand Down
14 changes: 7 additions & 7 deletions packages/create-threenative/templates/action-rpg/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,23 @@
"format:check": "biome format src"
},
"dependencies": {
"@threenative/core": ">=0.3.13",
"@threenative/physics": ">=0.3.13",
"@threenative/ui": ">=0.3.13",
"@threenative/core": ">=0.3.14",
"@threenative/physics": ">=0.3.14",
"@threenative/ui": ">=0.3.14",
"react": "19.2.0",
"react-dom": "19.2.0",
"three": "0.187.0"
},
"devDependencies": {
"@gltf-transform/cli": "4.4.2",
"@tailwindcss/vite": "4.3.3",
"@threenative/assets": ">=0.3.14",
"@threenative/playtest": ">=0.3.13",
"@threenative/assets": ">=0.3.15",
"@threenative/playtest": ">=0.3.14",
"@types/react": "19.2.0",
"@types/react-dom": "19.2.0",
"@types/three": "0.187.0",
"@vitejs/plugin-react": "6.0.5",
"create-threenative": "0.2.18",
"create-threenative": "0.2.19",
"esbuild": "0.27.0",
"playwright": "1.62.1",
"tailwindcss": "4.3.3",
Expand All @@ -45,7 +45,7 @@
"eslint": "10.13.0"
},
"optionalDependencies": {
"@threenative/runtime-native": ">=0.3.13"
"@threenative/runtime-native": ">=0.3.14"
},
"overrides": {
"sharp": ">=0.35.4",
Expand Down
14 changes: 7 additions & 7 deletions packages/create-threenative/templates/adventure/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
"format:check": "biome format src"
},
"dependencies": {
"@threenative/core": ">=0.3.13",
"@threenative/physics": ">=0.3.13",
"@threenative/ui": ">=0.3.13",
"@threenative/core": ">=0.3.14",
"@threenative/physics": ">=0.3.14",
"@threenative/ui": ">=0.3.14",
"react": "19.2.0",
"react-dom": "19.2.0",
"three": "0.187.0"
Expand All @@ -30,11 +30,11 @@
"@tailwindcss/vite": "4.3.3",
"@vitejs/plugin-react": "6.0.5",
"@types/three": "0.187.0",
"@threenative/assets": ">=0.3.14",
"@threenative/playtest": ">=0.3.13",
"@threenative/assets": ">=0.3.15",
"@threenative/playtest": ">=0.3.14",
"@types/react": "19.2.0",
"@types/react-dom": "19.2.0",
"create-threenative": "0.2.18",
"create-threenative": "0.2.19",
"esbuild": "0.27.0",
"playwright": "1.62.1",
"tailwindcss": "4.3.3",
Expand All @@ -45,7 +45,7 @@
"eslint": "10.13.0"
},
"optionalDependencies": {
"@threenative/runtime-native": ">=0.3.13"
"@threenative/runtime-native": ">=0.3.14"
},
"overrides": {
"sharp": ">=0.35.4",
Expand Down
Loading
Loading