@hypersoniclabs/helix-cli 0.1.25-helix3.532 → 0.1.25-helix3.533

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hypersoniclabs/helix-cli",
3
- "version": "0.1.25-helix3.532",
3
+ "version": "0.1.25-helix3.533",
4
4
  "description": "helix — the HELIX creator CLI: scaffold, validate, and publish Instant Worlds",
5
5
  "main": "dist/lib.js",
6
6
  "types": "dist/lib.d.ts",
@@ -1,10 +1,10 @@
1
1
  // Generated dependency-free bundle of the HELIX engine Vehicle Package validator.
2
2
  // Bridge JSON/schema preflight is deliberately separate below.
3
- // Source commit: 62898e83f8794ac3193bbd110d4d1bea52a4bcf0
3
+ // Source commit: 54b283a7a1af9f5d6aefdcffc7e07922545f5223
4
4
  // Regenerate with scripts/vendor-vehicle-package-v2.mjs; do not edit by hand.
5
5
 
6
6
  export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
7
- "commit": "62898e83f8794ac3193bbd110d4d1bea52a4bcf0",
7
+ "commit": "54b283a7a1af9f5d6aefdcffc7e07922545f5223",
8
8
  "path": "systems/humanoid-character/src/core/vehicle/package/format.ts",
9
9
  "entries": [
10
10
  "systems/humanoid-character/src/core/vehicle/package/format.ts",
@@ -14,7 +14,7 @@ export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
14
14
  "systems/humanoid-character/src/core/vehicle/seats.ts",
15
15
  "systems/humanoid-character/src/core/components/protocol.ts"
16
16
  ],
17
- "closureSha256": "4c6e3d7f156a5f87a721268fd46fb4eedc594aa3066dd8b7787b2dc0a1eefb1f",
17
+ "closureSha256": "8864a0ba523b1a4710345d48cc6ddd989032967b487aad218bdc495ca0dc4fc8",
18
18
  "files": {
19
19
  "systems/humanoid-character/src/core/components/chain.ts": "b3e8c8783428321b41b17ac10785b0eb3028e4da754dc917456c2b8cc23b5212",
20
20
  "systems/humanoid-character/src/core/components/protocol.ts": "8fd2fd613a813e6e6febe5518a7b8ef409aab4f4a1bc415d75546cd7547d64a7",
@@ -28,7 +28,7 @@ export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
28
28
  "systems/humanoid-character/src/core/vehicle/defaultControls.ts": "a9629da5f7dd35f534bb8a21af700f14d8dfa9b5d90ea39e3d5bb94e6c04afd3",
29
29
  "systems/humanoid-character/src/core/vehicle/descriptor.ts": "f54988628f984ac73b8a7fa594d03e1f8f2c808904991267a48124d7a015f279",
30
30
  "systems/humanoid-character/src/core/vehicle/lights.ts": "66e8d9ae34d014920c753e8bba6fe779856e128154561c470a7ff354f79e54ca",
31
- "systems/humanoid-character/src/core/vehicle/package/format.ts": "a667fef791f7be76644febbab1dc7028b567470d2b04fff6d001dac780736e38",
31
+ "systems/humanoid-character/src/core/vehicle/package/format.ts": "724aa7a5c331e0f92bdd61ae9be644a1c9d14466ae38886ccbf2bb47f0b11077",
32
32
  "systems/humanoid-character/src/core/vehicle/package/seatDeclaration.ts": "51bd1a87314bb1504a75091389e47552e2460813a1d2f68a75c578dc04118621",
33
33
  "systems/humanoid-character/src/core/vehicle/package/sourceValidation.ts": "65ec857e3509af062937a58bb2f9a11d0ed20721148efc6840ab818e6a835a9a",
34
34
  "systems/humanoid-character/src/core/vehicle/package/suspensionSource.ts": "ab3a48b3555782b5f44379d5c3822c66c4b40b5cb662f0d25c96e1d042aa05db",
@@ -2322,6 +2322,7 @@ const __defs = {
2322
2322
  "use strict";
2323
2323
  Object.defineProperty(exports, "__esModule", { value: true });
2324
2324
  exports.TWO_WHEELER_REQUIRED_SOCKETS = exports.PACKAGE_LEAN_KEYS = exports.VEHICLE_QUALITY_TIERS = exports.VEHICLE_ARTICULATION_FORMAT = exports.VEHICLE_VISUAL_FORMAT = exports.VEHICLE_SIMULATION_FORMAT = exports.VEHICLE_PACKAGE_COMPATIBLE_VERSIONS = exports.VEHICLE_PACKAGE_VERSION = void 0;
2325
+ exports.twoWheelerGroundToBodyOrigin = twoWheelerGroundToBodyOrigin;
2325
2326
  exports.validateVehiclePackage = validateVehiclePackage;
2326
2327
  exports.assertPackagePublishable = assertPackagePublishable;
2327
2328
  exports.citedIds = citedIds;
@@ -2344,6 +2345,10 @@ const __defs = {
2344
2345
  ];
2345
2346
  exports.TWO_WHEELER_REQUIRED_SOCKETS = ['wheel_f', 'wheel_r'];
2346
2347
  const CAR_WHEEL_SOCKETS = ['wheel_lf', 'wheel_rf', 'wheel_lr', 'wheel_rr'];
2348
+ const TWO_WHEELER_REST_K = { motorcycle: 0.8133, bicycle: 0.7724 };
2349
+ function twoWheelerGroundToBodyOrigin(cls, wheelRadius) {
2350
+ return Math.round((TWO_WHEELER_REST_K[cls] - wheelRadius) * 1000) / 1000;
2351
+ }
2347
2352
  function validateTwoWheelerPackage(pkg, err, issues) {
2348
2353
  const classId = pkg.mesh?.classId;
2349
2354
  if (classId !== 'motorcycle' && classId !== 'bicycle') {
@@ -2364,6 +2369,17 @@ const __defs = {
2364
2369
  err(`mesh.sockets.${id}`, `a ${classId} must state its \`${id}\` socket (the wheel centre, model frame)`);
2365
2370
  }
2366
2371
  }
2372
+ const rest = pkg.physics?.chassis?.groundToBodyOrigin?.value;
2373
+ const wheelRadius = pkg.physics?.chassis?.wheelRadius?.value;
2374
+ if (typeof wheelRadius === 'number' && wheelRadius > 0) {
2375
+ const expected = twoWheelerGroundToBodyOrigin(classId, wheelRadius);
2376
+ if (typeof rest !== 'number') {
2377
+ err('physics.chassis.groundToBodyOrigin', `a ${classId} must state where its body origin stands on its springs (metres above the road; \`${expected}\` for a ${wheelRadius} m wheel): the room spawns the vehicle at placement + this value, and without it the ${classId} is spawned buried in the road`);
2378
+ }
2379
+ else if (Math.abs(rest - expected) > 0.05) {
2380
+ issues.push({ level: 'warn', path: 'physics.chassis.groundToBodyOrigin', message: `${rest} m is ${Math.abs(rest - expected).toFixed(3)} m from the ${expected} m a ${classId} with a ${wheelRadius} m wheel settles at; the spawn will drop or rise by the difference` });
2381
+ }
2382
+ }
2367
2383
  if (pkg.simulation?.land !== undefined) {
2368
2384
  err('simulation.land', `the land solver v2 has no lean or camber model yet: a ${classId} runs the v1 solver, so it cannot declare \`simulation.land\``);
2369
2385
  }
@@ -2442,7 +2458,7 @@ const __defs = {
2442
2458
  if (pkg.packageVersion !== exports.VEHICLE_PACKAGE_VERSION) {
2443
2459
  err('physics.chassis.groundToBodyOrigin', `requires packageVersion ${exports.VEHICLE_PACKAGE_VERSION}`);
2444
2460
  }
2445
- if (pkg.simulation?.land === undefined) {
2461
+ if (pkg.simulation?.land === undefined && pkg.mesh?.classId !== 'motorcycle' && pkg.mesh?.classId !== 'bicycle') {
2446
2462
  err('physics.chassis.groundToBodyOrigin', 'requires a land simulation contract');
2447
2463
  }
2448
2464
  if (groundToBodyOrigin.unit !== 'm') {
@@ -1,10 +1,10 @@
1
1
  // Generated dependency-free bundle of the HELIX engine Vehicle Package validator.
2
2
  // Bridge JSON/schema preflight is deliberately separate below.
3
- // Source commit: 62898e83f8794ac3193bbd110d4d1bea52a4bcf0
3
+ // Source commit: 54b283a7a1af9f5d6aefdcffc7e07922545f5223
4
4
  // Regenerate with scripts/vendor-vehicle-package-v2.mjs; do not edit by hand.
5
5
 
6
6
  export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
7
- "commit": "62898e83f8794ac3193bbd110d4d1bea52a4bcf0",
7
+ "commit": "54b283a7a1af9f5d6aefdcffc7e07922545f5223",
8
8
  "path": "systems/humanoid-character/src/core/vehicle/package/format.ts",
9
9
  "entries": [
10
10
  "systems/humanoid-character/src/core/vehicle/package/format.ts",
@@ -14,7 +14,7 @@ export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
14
14
  "systems/humanoid-character/src/core/vehicle/seats.ts",
15
15
  "systems/humanoid-character/src/core/components/protocol.ts"
16
16
  ],
17
- "closureSha256": "4c6e3d7f156a5f87a721268fd46fb4eedc594aa3066dd8b7787b2dc0a1eefb1f",
17
+ "closureSha256": "8864a0ba523b1a4710345d48cc6ddd989032967b487aad218bdc495ca0dc4fc8",
18
18
  "files": {
19
19
  "systems/humanoid-character/src/core/components/chain.ts": "b3e8c8783428321b41b17ac10785b0eb3028e4da754dc917456c2b8cc23b5212",
20
20
  "systems/humanoid-character/src/core/components/protocol.ts": "8fd2fd613a813e6e6febe5518a7b8ef409aab4f4a1bc415d75546cd7547d64a7",
@@ -28,7 +28,7 @@ export const VEHICLE_PACKAGE_V2_SOURCE = Object.freeze({
28
28
  "systems/humanoid-character/src/core/vehicle/defaultControls.ts": "a9629da5f7dd35f534bb8a21af700f14d8dfa9b5d90ea39e3d5bb94e6c04afd3",
29
29
  "systems/humanoid-character/src/core/vehicle/descriptor.ts": "f54988628f984ac73b8a7fa594d03e1f8f2c808904991267a48124d7a015f279",
30
30
  "systems/humanoid-character/src/core/vehicle/lights.ts": "66e8d9ae34d014920c753e8bba6fe779856e128154561c470a7ff354f79e54ca",
31
- "systems/humanoid-character/src/core/vehicle/package/format.ts": "a667fef791f7be76644febbab1dc7028b567470d2b04fff6d001dac780736e38",
31
+ "systems/humanoid-character/src/core/vehicle/package/format.ts": "724aa7a5c331e0f92bdd61ae9be644a1c9d14466ae38886ccbf2bb47f0b11077",
32
32
  "systems/humanoid-character/src/core/vehicle/package/seatDeclaration.ts": "51bd1a87314bb1504a75091389e47552e2460813a1d2f68a75c578dc04118621",
33
33
  "systems/humanoid-character/src/core/vehicle/package/sourceValidation.ts": "65ec857e3509af062937a58bb2f9a11d0ed20721148efc6840ab818e6a835a9a",
34
34
  "systems/humanoid-character/src/core/vehicle/package/suspensionSource.ts": "ab3a48b3555782b5f44379d5c3822c66c4b40b5cb662f0d25c96e1d042aa05db",
@@ -2322,6 +2322,7 @@ const __defs = {
2322
2322
  "use strict";
2323
2323
  Object.defineProperty(exports, "__esModule", { value: true });
2324
2324
  exports.TWO_WHEELER_REQUIRED_SOCKETS = exports.PACKAGE_LEAN_KEYS = exports.VEHICLE_QUALITY_TIERS = exports.VEHICLE_ARTICULATION_FORMAT = exports.VEHICLE_VISUAL_FORMAT = exports.VEHICLE_SIMULATION_FORMAT = exports.VEHICLE_PACKAGE_COMPATIBLE_VERSIONS = exports.VEHICLE_PACKAGE_VERSION = void 0;
2325
+ exports.twoWheelerGroundToBodyOrigin = twoWheelerGroundToBodyOrigin;
2325
2326
  exports.validateVehiclePackage = validateVehiclePackage;
2326
2327
  exports.assertPackagePublishable = assertPackagePublishable;
2327
2328
  exports.citedIds = citedIds;
@@ -2344,6 +2345,10 @@ const __defs = {
2344
2345
  ];
2345
2346
  exports.TWO_WHEELER_REQUIRED_SOCKETS = ['wheel_f', 'wheel_r'];
2346
2347
  const CAR_WHEEL_SOCKETS = ['wheel_lf', 'wheel_rf', 'wheel_lr', 'wheel_rr'];
2348
+ const TWO_WHEELER_REST_K = { motorcycle: 0.8133, bicycle: 0.7724 };
2349
+ function twoWheelerGroundToBodyOrigin(cls, wheelRadius) {
2350
+ return Math.round((TWO_WHEELER_REST_K[cls] - wheelRadius) * 1000) / 1000;
2351
+ }
2347
2352
  function validateTwoWheelerPackage(pkg, err, issues) {
2348
2353
  const classId = pkg.mesh?.classId;
2349
2354
  if (classId !== 'motorcycle' && classId !== 'bicycle') {
@@ -2364,6 +2369,17 @@ const __defs = {
2364
2369
  err(`mesh.sockets.${id}`, `a ${classId} must state its \`${id}\` socket (the wheel centre, model frame)`);
2365
2370
  }
2366
2371
  }
2372
+ const rest = pkg.physics?.chassis?.groundToBodyOrigin?.value;
2373
+ const wheelRadius = pkg.physics?.chassis?.wheelRadius?.value;
2374
+ if (typeof wheelRadius === 'number' && wheelRadius > 0) {
2375
+ const expected = twoWheelerGroundToBodyOrigin(classId, wheelRadius);
2376
+ if (typeof rest !== 'number') {
2377
+ err('physics.chassis.groundToBodyOrigin', `a ${classId} must state where its body origin stands on its springs (metres above the road; \`${expected}\` for a ${wheelRadius} m wheel): the room spawns the vehicle at placement + this value, and without it the ${classId} is spawned buried in the road`);
2378
+ }
2379
+ else if (Math.abs(rest - expected) > 0.05) {
2380
+ issues.push({ level: 'warn', path: 'physics.chassis.groundToBodyOrigin', message: `${rest} m is ${Math.abs(rest - expected).toFixed(3)} m from the ${expected} m a ${classId} with a ${wheelRadius} m wheel settles at; the spawn will drop or rise by the difference` });
2381
+ }
2382
+ }
2367
2383
  if (pkg.simulation?.land !== undefined) {
2368
2384
  err('simulation.land', `the land solver v2 has no lean or camber model yet: a ${classId} runs the v1 solver, so it cannot declare \`simulation.land\``);
2369
2385
  }
@@ -2442,7 +2458,7 @@ const __defs = {
2442
2458
  if (pkg.packageVersion !== exports.VEHICLE_PACKAGE_VERSION) {
2443
2459
  err('physics.chassis.groundToBodyOrigin', `requires packageVersion ${exports.VEHICLE_PACKAGE_VERSION}`);
2444
2460
  }
2445
- if (pkg.simulation?.land === undefined) {
2461
+ if (pkg.simulation?.land === undefined && pkg.mesh?.classId !== 'motorcycle' && pkg.mesh?.classId !== 'bicycle') {
2446
2462
  err('physics.chassis.groundToBodyOrigin', 'requires a land simulation contract');
2447
2463
  }
2448
2464
  if (groundToBodyOrigin.unit !== 'm') {