Skip to content
Merged
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 AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ pnpm native:verify:desktop # 300 native frames + a non-blank scr
**CI.** The pre-push hook runs `pnpm ci:fast` drift checks only; it proves no runtime behaviour. `pnpm ci:local --full` runs the full board; `pnpm ci:local --affected --base origin/develop --target develop` runs what CI would select (dirty or unknown inputs fall back to full). A change touching only Markdown that no fixture consumes (not `AGENTS.md`/`CLAUDE.md`) runs no product CI job. Ordinary PRs into develop use the complete candidate diff: CI-only changes run CI contracts, exact template changes run scaffolder contracts and affected templates, and shared executable inputs keep the full safety board with starter as the default template smoke plus explicitly changed runtime/scenario kits. Template instruction and Markdown changes retain their contract lanes without adding runtime kits. Merge groups, explicit full runs, unknown inputs, main qualification and scheduled audits use fresh exhaustive qualification: all shipped templates, both golden journeys and the full supported native matrix. `ci-required` independently rejects a review plan for these events; Integration is a required reusable join on the same candidate, with each selected canonical job proven by a current-run/attempt receipt and independently checked completed-success API job; missing, skipped, cancelled, stale or unmapped receipts fail closed. Native per-leg authoritative completion and cold-path queue feasibility remain follow-ups before deferring any Android PR coverage. Template scenarios run once per selected kit; develop changes run one representative golden journey and full qualification retains both starter and platformer journeys. `ci-required` rejects missing or failed selected checks; retained contexts include `supply-chain`, `template-nonvisual`, `golden-path`, and native `desktop-parity` when applicable. Native host/platform tests run for native or shared runtime consumers, main qualification and unresolved scopes. Unsafe matrix/reusable verdict reuse stays disabled until authoritative complete coverage and per-leg routing exist. A new candidate runs fresh tests; only exact-run immutable build artifacts are shared. Details: `docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md` and `docs/PRDs/done/PRD-373-selective-ci-and-develop-promotion.md`.
Registry commands read auth from `~/.npmrc`; pass a checkout-local untracked `.npmrc` with `npm --userconfig .npmrc <command>`. Never print either file.

TypeScript 5.9 `strict`, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `<package>/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed.
TypeScript 7 `strict` (the native `tsc`); `typescript` imports use the official TypeScript 6 compatibility API for AST scripts and tsup declarations, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `<package>/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed.

**Existing harnesses — use them, don't rebuild them.** Capability lookup: `capabilities.json`, `packages/engine-mcp`. Behaviour on browser/Android/desktop/iOS: `packages/playtest --target <platform>`. User-like install and agent-friction arms: `pnpm sandbox`, `pnpm sweep:capture|judge|pair`, `scripts/score-blind.ts`. Visual baselines and LOC vs plain Three.js: `pnpm visuals`, `visuals:ab`, `visuals:baseline`, `pnpm tsx scripts/count-loc.ts`. Web-vs-native, profiling, frame meters: `pnpm parity` (`packages/runtime-native/conformance/registry.json`), `profile:native-cpu`, `bench:engines`, playtest `perf --file|--executable|--logcat`. What to verify next: `pnpm round:next`, `round:deletions`, `alpha:bar`.

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pnpm native:verify:desktop # 300 native frames + a non-blank scr
**CI.** The pre-push hook runs `pnpm ci:fast` drift checks only; it proves no runtime behaviour. `pnpm ci:local --full` runs the full board; `pnpm ci:local --affected --base origin/develop --target develop` runs what CI would select (dirty or unknown inputs fall back to full). A change touching only Markdown that no fixture consumes (not `AGENTS.md`/`CLAUDE.md`) runs no product CI job. Ordinary PRs into develop use the complete candidate diff: CI-only changes run CI contracts, exact template changes run scaffolder contracts and affected templates, and shared executable inputs keep the full safety board with starter as the default template smoke plus explicitly changed runtime/scenario kits. Template instruction and Markdown changes retain their contract lanes without adding runtime kits. Merge groups, explicit full runs, unknown inputs, main qualification and scheduled audits use fresh exhaustive qualification: all shipped templates, both golden journeys and the full supported native matrix. `ci-required` independently rejects a review plan for these events; Integration is a required reusable join on the same candidate, with each selected canonical job proven by a current-run/attempt receipt and independently checked completed-success API job; missing, skipped, cancelled, stale or unmapped receipts fail closed. Native per-leg authoritative completion and cold-path queue feasibility remain follow-ups before deferring any Android PR coverage. Template scenarios run once per selected kit; develop changes run one representative golden journey and full qualification retains both starter and platformer journeys. `ci-required` rejects missing or failed selected checks; retained contexts include `supply-chain`, `template-nonvisual`, `golden-path`, and native `desktop-parity` when applicable. Native host/platform tests run for native or shared runtime consumers, main qualification and unresolved scopes. Unsafe matrix/reusable verdict reuse stays disabled until authoritative complete coverage and per-leg routing exist. A new candidate runs fresh tests; only exact-run immutable build artifacts are shared. Details: `docs/PRDs/CI/PRD-483-impact-driven-ci-without-repeated-template-setup.md` and `docs/PRDs/done/PRD-373-selective-ci-and-develop-promotion.md`.
Registry commands read auth from `~/.npmrc`; pass a checkout-local untracked `.npmrc` with `npm --userconfig .npmrc <command>`. Never print either file.

TypeScript 5.9 `strict`, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `<package>/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed.
TypeScript 7 `strict` (the native `tsc`); `typescript` imports use the official TypeScript 6 compatibility API for AST scripts and tsup declarations, **ESM only**; relative imports end in `.js`. Versions come from the `catalog:` in `pnpm-workspace.yaml`, templates excepted. Biome formats — never hand-format. Interfaces are `I`-prefixed; classes and type aliases are not. Unit tests: `<package>/__tests__/*.spec.ts`, vitest, node environment, DOM and GPU stubbed.

**Existing harnesses — use them, don't rebuild them.** Capability lookup: `capabilities.json`, `packages/engine-mcp`. Behaviour on browser/Android/desktop/iOS: `packages/playtest --target <platform>`. User-like install and agent-friction arms: `pnpm sandbox`, `pnpm sweep:capture|judge|pair`, `scripts/score-blind.ts`. Visual baselines and LOC vs plain Three.js: `pnpm visuals`, `visuals:ab`, `visuals:baseline`, `pnpm tsx scripts/count-loc.ts`. Web-vs-native, profiling, frame meters: `pnpm parity` (`packages/runtime-native/conformance/registry.json`), `profile:native-cpu`, `bench:engines`, playtest `perf --file|--executable|--logcat`. What to verify next: `pnpm round:next`, `round:deletions`, `alpha:bar`.

Expand Down
3 changes: 2 additions & 1 deletion examples/abyss-framework/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
"create-threenative": "workspace:*",
"tailwindcss": "catalog:",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
},
"optionalDependencies": {
"@threenative/runtime-native": "workspace:*"
Expand Down
3 changes: 2 additions & 1 deletion examples/auto-lod/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"@threenative/runtime-native": "workspace:*",
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
7 changes: 5 additions & 2 deletions examples/constrained-ik/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
"version": "0.1.0",
"private": true,
"type": "module",
"threenative": { "nativeEntry": "src/game.ts" },
"threenative": {
"nativeEntry": "src/game.ts"
},
"scripts": {
"setup": "npm --prefix ../integrations/ik install --ignore-scripts --no-audit --no-fund",
"dev": "vite --host 127.0.0.1",
Expand All @@ -18,6 +20,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/csg-doorway/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
"@threenative/runtime-native": "workspace:*",
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/fps-friction/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/native-smoke/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"react": "catalog:",
"react-dom": "catalog:",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd140-picking/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd162-replay/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"@types/three": "0.185.3",
"create-threenative": "0.2.2",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
},
"optionalDependencies": {
"@threenative/runtime-native": "0.2.0"
Expand Down
3 changes: 2 additions & 1 deletion examples/prd242-compute-lifetime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd243-cloth/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd249-fluid-field/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd268-probe-volume/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd307-environment-cost/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd314-clip-audit/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/prd476-fluid-particles/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
2 changes: 1 addition & 1 deletion examples/prd476-fluid-particles/src/collision-proof.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ async function start({ gateClosed = true, validationControl = false } = {}) {
// Deliberately invalid actual WebGPU usage verifies that the scope producer rejects errors.
if (validationControl) device.createBuffer({ size: 4, usage: 0 });
const adapterInfo = Object.fromEntries(
["architecture", "description", "device", "vendor"].map((field) => [
(["architecture", "description", "device", "vendor"] as const).map((field) => [
field,
adapter.info[field] ?? "",
]),
Expand Down
3 changes: 2 additions & 1 deletion examples/quarry/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"pngjs": "7.0.0",
"tsx": "4.23.5",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
7 changes: 5 additions & 2 deletions examples/skinned-crowd/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
"version": "0.1.0",
"private": true,
"type": "module",
"threenative": { "nativeEntry": "src/game.ts" },
"threenative": {
"nativeEntry": "src/game.ts"
},
"scripts": {
"build": "vite build",
"build:desktop": "node ../../packages/runtime-native/scripts/bundle.mjs --project . --entry src/game.ts --target desktop --output dist/skinned-crowd-native.js",
Expand All @@ -17,6 +19,7 @@
"devDependencies": {
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion examples/vfx-gallery/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
"@threenative/playtest": "workspace:*",
"@types/three": "0.185.3",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:"
},
"optionalDependencies": {
"@threenative/runtime-native": "workspace:*"
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@
"pngjs": "7.0.0",
"tsx": "4.23.5",
"typescript": "catalog:",
"vitest": "4.1.10"
"vitest": "4.1.10",
"@typescript/native": "catalog:"
},
"description": "ThreeNative is an application framework for games whose same vanilla Three.js source runs in the browser on WebGPU and on an owned C++ runtime for desktop and Android. It uses Godot-shaped node names, React and Tailwind for UI, and vanilla `three` underneath on every surface.",
"pnpm": {
Expand Down
3 changes: 2 additions & 1 deletion packages/assets/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@
"publint": "0.3.22",
"threenative-blender-mcp": "workspace:*",
"tsup": "8.5.1",
"typescript": "catalog:"
"typescript": "catalog:",
"@typescript/native": "catalog:"
},
"dependencies": {
"@gltf-transform/core": "catalog:",
Expand Down
3 changes: 2 additions & 1 deletion packages/blender-mcp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
"@gltf-transform/core": "catalog:",
"publint": "0.3.22",
"tsup": "8.5.1",
"typescript": "catalog:"
"typescript": "catalog:",
"@typescript/native": "catalog:"
}
}
3 changes: 2 additions & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@
"threenative-blender-mcp": "workspace:*",
"threenative-engine-mcp": "workspace:*",
"tsup": "8.5.1",
"typescript": "catalog:"
"typescript": "catalog:",
"@typescript/native": "catalog:"
},
"peerDependencies": {
"@threenative/playtest": ">=0.3.4 <0.4.0",
Expand Down
3 changes: 2 additions & 1 deletion packages/create-threenative/__tests__/config.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,8 @@ export const rejected: IAudioConfig = { ${rejectedKey}: 2 };
`,
);
const outcome = (await execFileAsync(process.execPath, [
path.resolve("packages/core/node_modules/typescript/bin/tsc"),
path.resolve("packages/core/node_modules/@typescript/native/bin/tsc"),
"--ignoreConfig",
"--noEmit",
"--strict",
"--target",
Expand Down
41 changes: 15 additions & 26 deletions packages/create-threenative/__tests__/scaffold.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,33 +172,22 @@ const BUG_REPORT_SKILL_PATHS = [
// docs/verification/prd339-exposure-proof/completion-consumer-8bf16f4.json.
// Current develop c18a42b integration: all13 actual generated trees were byte-compared
// against reviewed 8bf trees; only the copied Three compute-only Storage3DTexture patch changed.
// Recomputed 2026-10-04 for PRD-495's junk sweep: ten templates lost zero-reader declarations
// (several helpers in racing and shooter, one dead file in minimal), so their generated trees
// moved. platformer, snow and starter were untouched and keep their values. Every restamped value
// is the measured no-install tree, taken from the failing assertion this constant exists to raise
// and then re-run green.
// Re-measured on current develop plus TS7: restoring only each compiler manifest and
// rain's shader API import recovers all 13 develop fingerprints.
const PRD_201_PARENT_SCAFFOLD_HASHES: Readonly<Record<string, string>> = {
// Recomputed 2026-10-05 on the merge of develop (PRD-345 backlight/dark defaults, #416) into
// the PRD-495 junk-cleanup branch: the merged tree carries both sides' template bytes — ten
// templates lost zero-reader declarations and all thirteen gained the bounded
// lighting/environment sources — so all thirteen generated trees were re-measured through
// createProject on that merged tree. Values below are the merged-tree measurement, not either
// side's.
// rain re-measured after Opus review restored templates/rain/tools/verify-noise-volume.mjs,
// the owner's manual storm-volume proof that the sweep had removed as junk.
"action-rpg": "4958ce9c3fc2a809262f05294481020a958fac17b70d454f648b59f09351f95a",
minimal: "572bf9ffd8b18a8b1e04186c4dfdec17216b77d31bf6d9ddc1a26ceaac3333fe",
platformer: "6de157b3c2cfa0034d48f8326b9f1a90fe90ebce3bf265ac91bae379482d017b",
puzzle: "1a83b3b4ec8de36970c589cdb50783620af09a8569f7690fb1beb2f4a7a2c2a6",
racing: "7f1ca6cd0655349331216dc9b8b08bc04406209bfc075b01af4029fedf9c6caa",
rain: "637afd242e4d7bc6ded1b102b1bd80bfbf289ed32878cdb1b20902e303292255",
rts: "c9b22f3b32846caf493699c365ffed4bcd139d418b7e4ce99dd9b67c42a325d8",
runner: "550b626387489ebf70a6a33aad2c437c52d7bdefef04b3a97c1a81413fa678f4",
sailing: "4cae0186fa08e10f6e732d79711ef42347ebd83e2b83448f656b1e6c63a8cdba",
shooter: "127fcdc64a2b48f7259c811391e07524c4e27b189f994c8a157268bd27f0d200",
snow: "791580f3b7314d4983a2cbf57b87b83be2e4740fa63e204327826120f1a0cf12",
starter: "5ab4d1828be78d82e7b83fbb2e07afa998372314ffb46accbaffd3dc4ad8cfdd",
"tower-defense": "f441c30e062185be72b7d97f63ff63c6eaf66b72a8689acdfea91e5b9907f8a2",
"action-rpg": "1e9e05b2ddd8a7b576f9b5e229a175e93db5cd5d8024b8e61b40d4f90894d631",
minimal: "a7f1a7481c6ed7667b1cdcc85990dbbccf2cbec59ce2b65799c232bf08c41918",
platformer: "8033728a0b8a14d2d42143d6665e0f3ee5822dfa320ee3f9fbae340e0082f7b9",
puzzle: "7dc75d6999576ff64d33a2ce52323334602a76f54fe29126a7a3ddfcececfac6",
racing: "8cded24d0f31cb9b76b5ab199ee0a4f1845c4466e96cc6ac49c2b3d8b8c277ac",
rain: "21dbd2a9100f3e1dfc9ea0a474fd5f3b429a55ae4e968a3741dccaf57e05bfc8",
rts: "d009ce4bf88df41780b6e98f9923c85266824e2f9e7e00075a48f779f2bfc578",
runner: "5c2c6c40fbee5d3c55c7cccbc05c6860ad62aadf9c65ae947095a9a2bbdbe79c",
sailing: "afe80626d46070fcd2ab3f520c603eaef09a07fb03acd49b1659b06a898a39be",
shooter: "c0f9f3110db4c8fa90d29ebaf37c3aa995654ee7ff3264dbd7033ac91b8e6f65",
snow: "5873bb82bab520d5f29c127161e1447c0657034b8f40e366617ad44686f4fa06",
starter: "4cd799d72f936554c2d61cfe70879f15dde39d3fc77a9183e48d891fc8f62473",
"tower-defense": "cf63b89d4f3939a05d65179291368b865e9b1491231a749339a81e1df4c40906",
};

const GENERATED_SCAFFOLD_METADATA =
Expand Down
15 changes: 13 additions & 2 deletions packages/create-threenative/__tests__/template.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,12 +140,23 @@ async function linkScaffoldDependencies(target: string): Promise<void> {
path.resolve("packages/physics/node_modules/@dimforge/rapier3d-compat"),
);
await linkDependency(target, "zustand", path.resolve("packages/core/node_modules/zustand"));
await linkDependency(target, "typescript", path.resolve("packages/core/node_modules/typescript"));
await linkDependency(
target,
"typescript",
path.resolve("packages/core/node_modules/@typescript/native"),
);
if (packageJson.devDependencies?.["@typescript/typescript6"] !== undefined) {
await linkDependency(
target,
"@typescript/typescript6",
path.resolve("packages/core/node_modules/typescript"),
);
}
await linkDependency(target, "vite", await findPnpmPackage("vite"));
await linkDependency(target, "@types/node", await findPnpmPackage("@types/node"));
await mkdir(path.join(target, "node_modules/.bin"), { recursive: true });
await symlink(
path.resolve("packages/core/node_modules/typescript/bin/tsc"),
path.resolve("packages/core/node_modules/@typescript/native/bin/tsc"),
path.join(target, "node_modules/.bin/tsc"),
);
}
Expand Down
4 changes: 3 additions & 1 deletion packages/create-threenative/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@
"threenative-blender-mcp": "workspace:*",
"tsup": "8.5.1",
"typescript": "catalog:",
"vite": "catalog:"
"vite": "catalog:",
"@typescript/native": "catalog:",
"@typescript/typescript6": "catalog:"
},
"peerDependencies": {
"@threenative/assets": ">=0.3.5 <0.4.0"
Expand Down
Loading
Loading