@helix3/helix-cli 0.1.21-helix3.406 → 0.1.21-helix3.408

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.
Files changed (44) hide show
  1. package/README.md +1 -1
  2. package/dist/index.js +9 -4
  3. package/dist/index.js.map +1 -1
  4. package/dist/tsconfig.build.tsbuildinfo +1 -1
  5. package/dist/vehicle/keyboardLaunch.d.ts +187 -0
  6. package/dist/vehicle/keyboardLaunch.js +336 -0
  7. package/dist/vehicle/keyboardLaunch.js.map +1 -0
  8. package/dist/vehicle/lampCoverage.d.ts +49 -0
  9. package/dist/vehicle/lampCoverage.js +252 -0
  10. package/dist/vehicle/lampCoverage.js.map +1 -0
  11. package/dist/vehicle/paintHue.d.ts +76 -11
  12. package/dist/vehicle/paintHue.js +196 -46
  13. package/dist/vehicle/paintHue.js.map +1 -1
  14. package/dist/vehicle/panelCoverage.d.ts +37 -0
  15. package/dist/vehicle/panelCoverage.js +93 -0
  16. package/dist/vehicle/panelCoverage.js.map +1 -0
  17. package/dist/vehicle/preview.d.ts +2 -2
  18. package/dist/vehicle/preview.js +18 -31
  19. package/dist/vehicle/preview.js.map +1 -1
  20. package/dist/vehicle/simulate.d.ts +8 -0
  21. package/dist/vehicle/simulate.js +15 -3
  22. package/dist/vehicle/simulate.js.map +1 -1
  23. package/dist/vehicle/validate.d.ts +51 -0
  24. package/dist/vehicle/validate.js +27 -0
  25. package/dist/vehicle/validate.js.map +1 -1
  26. package/dist/visualQa/harness.d.ts +2 -0
  27. package/dist/visualQa/vehicle.js +86 -1
  28. package/dist/visualQa/vehicle.js.map +1 -1
  29. package/dist/visualQa/vehicleLamps.d.ts +118 -0
  30. package/dist/visualQa/vehicleLamps.js +374 -0
  31. package/dist/visualQa/vehicleLamps.js.map +1 -0
  32. package/dist/visualQa/vehicleProbe.d.ts +1 -1
  33. package/dist/visualQa/vehicleProbe.js +44 -0
  34. package/dist/visualQa/vehicleProbe.js.map +1 -1
  35. package/docs/vehicle-simulate.md +19 -1
  36. package/docs/visual-qa.md +1 -0
  37. package/package.json +1 -1
  38. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  39. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  40. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  41. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  42. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  43. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  44. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
package/README.md CHANGED
@@ -595,7 +595,7 @@ Every finding prints as `CODE path — message` plus a `fix:` line; `--json` re
595
595
  | Cross-field | `GROUND_TO_BODY_ORIGIN_MISMATCH` (> 5 mm; fix the ride height, the field is locked after first publish), `COMPONENT_BUILD_DIGEST_MISMATCH` (prints the computed digest), `COMPONENT_ACTIONS_MISMATCH` (prints the compiled protocol), `COMPONENT_BUILD_INVALID`, `PANEL_SIGNAL_NO_ACTION` (warn), `SEAT_SOCKET_UNKNOWN` (warn) |
596
596
  | Drive (package `targets`) | `SIMULATED_PERFORMANCE_OUT_OF_TOLERANCE` (figure, simulated, target, error, tolerance, engine version), `SIMULATED_REST_POSE_INVALID`, `SIMULATION_UNAVAILABLE` (warn: no runtime reachable or cached) |
597
597
  | `--glb` host manifest | `HOST_MANIFEST_MISSING`, `HOST_MANIFEST_MISPLACED` (found in scene/document/node extras; the backend reads only `asset.extras.HELIX_vehicle`), `HOST_MANIFEST_EMPTY`, `HOST_MANIFEST_DIVERGENT`, `HOST_MANIFEST_SOCKET_INVALID`, `HOST_MANIFEST_SOCKET_NAME_INVALID`, `HOST_MANIFEST_SOCKET_NODE_MISSING`. `helix continuum publish-package` refuses a `vehicle` Package descriptor whose model GLB has any of these errors before sealing. See [docs/vehicle-simulate.md](docs/vehicle-simulate.md#host-manifest) |
598
- | `--glb` | `WHEEL_NODES_MISSING`, `WHEEL_PIVOT_NOT_AT_HUB` (origin > 2 cm from the centre of its geometry — the wheel add-on anchor lands there), `WHEEL_ORIGINS_NOT_DISTINCT`, `WHEEL_FRAME_MIRRORED_X`, `WHEEL_FRAME_FRONT_NOT_PLUS_Z`, `WHEEL_NODE_EMPTY` (warn), `LENGTH_NOT_ALONG_Z` (warn), `PANEL_NODE_MISSING`, `VEHICLE_BUDGET_TRIANGLES` / `_MATERIALS` / `_TEXTURE_EDGE` / `_DRAW_CALLS` / `_FILE_SIZE` |
598
+ | `--glb` | `WHEEL_NODES_MISSING`, `WHEEL_PIVOT_NOT_AT_HUB` (origin > 2 cm from the centre of its geometry — the wheel add-on anchor lands there), `WHEEL_ORIGINS_NOT_DISTINCT`, `WHEEL_FRAME_MIRRORED_X`, `WHEEL_FRAME_FRONT_NOT_PLUS_Z`, `WHEEL_NODE_EMPTY` (warn), `LENGTH_NOT_ALONG_Z` (warn), `PANEL_NODE_MISSING`, `PANEL_ROLE_MISSING_DOOR` / `PANEL_ROLE_NO_NODE_BONNET` / `PANEL_ROLE_NO_NODE_BOOT` / `PANEL_ROLE_UNDECLARED_BONNET` / `PANEL_ROLE_UNDECLARED_BOOT` (warn: a four-wheeled car should articulate its doors, bonnet and boot / engine cover), the lamp-coverage gate on the lit geometry (`LAMP_INDICATOR_REAR_MISSING` / `LAMP_INDICATOR_FRONT_MISSING` / `LAMP_INDICATOR_SIDE_UNLIT` / `LAMP_INDICATOR_NO_ROWS` / `LAMP_NODE_UNLIT` / `LAMP_REPEATER_UNLIT` / `LAMP_FUNCTION_NO_ROW` errors, `LAMP_ROW_NO_TARGET` / `LAMP_NO_LIGHTING_ROWS` / `LAMP_INDICATOR_REAR_OPTED_OUT` warns; the documented opt-out for a car that really has no rear indicators is `lights.noRearIndicators: "<why, with source>"`), `VEHICLE_BUDGET_TRIANGLES` / `_MATERIALS` / `_TEXTURE_EDGE` / `_DRAW_CALLS` / `_FILE_SIZE` |
599
599
 
600
600
  The model frame is glTF: +X is the vehicle's left, +Y up, +Z forward, metres. Wheel nodes are found by name with
601
601
  the engine's own resolver (`wheel_lf` / `wheel_rf` / `wheel_lr` / `wheel_rr` and the usual aliases); all four must
package/dist/index.js CHANGED
@@ -653,8 +653,8 @@ vehicleCommand
653
653
  .option('--out <dir>', 'frames, contact-sheet.jpg, bundle.json and preview.json go here (default: <dir>/.helix-preview)')
654
654
  .option('--proxy-item <id>', 'a published vehicle the QA account can Try Now; the runtime loads it and the candidate replaces its car (and its slot board is what --addon fits to)')
655
655
  .option('--occupants', 'also seat an avatar in every seat, judge the cabin, and report where the runtime\'s cabin fit put each seat vs where it was authored (slow)')
656
- .option('--reference-paint <#rrggbb>', 'the reference body paint colour, sampled from the reference photo: sample the rendered body from the side pose and fail if its hue is off (default tolerance 15°)')
657
- .option('--paint-tolerance <deg>', 'maximum circular hue distance (degrees) the rendered body may sit from --reference-paint (default 15)', (v) => Number(v))
656
+ .option('--reference-paint <#rrggbb>', 'the reference body paint colour, the median of the body-paint pixels in the reference photos: renders the body paint alone from six cameras in the Try Now daylight (the world\'s own sun, exposure, tone mapping and lights) and fails on hue, saturation, lightness or highlight wash. White/silver/grey/black are judged on tint and lightness instead of hue')
657
+ .option('--paint-tolerance <deg>', 'maximum circular hue distance (degrees) the rendered body may sit from a chromatic --reference-paint (default 12)', (v) => Number(v))
658
658
  .option('--storage-state <file>', 'Playwright storageState of a signed-in QA account (default: sign in with `helix login`, or $HELIX_VQA_STORAGE_STATE)')
659
659
  .option('--chrome <path>', 'Chromium executable (default: Playwright Chromium / Chrome for Testing, headless; the macOS system Chrome is refused)')
660
660
  .option('--api-url <url>', 'platform API base URL')
@@ -728,7 +728,11 @@ vehicleCommand
728
728
  + 'PASS iff |error| <= tolerance. The runtime is fetched once per version and cached by sha under ~/.helix/cache/engine-runtime; offline, the last '
729
729
  + 'cached runtime is used and labelled. TURBO LAG: with boostTorqueCoef 0 the solver adds no boost torque, so a turbo car whose curve is the full-boost '
730
730
  + 'dyno curve pulls with no lag; author lag by derating the torque curve below spool, then check `turbo lag` here (docs/vehicle-simulate.md). '
731
- + 'Exit 0 = every compared figure passes, 1 = a figure is out of tolerance or the rest pose is wrong, 2 = could not simulate')
731
+ + 'KEYBOARD LAUNCH: it also launches the car the way a keyboard player does (W 0->1 in one tick, A/D taps with 100 ms reactions holding a lane; '
732
+ + 'the platform has no traction control and does not ramp a digital throttle) and nudges the yaw hands-off at 20/40/60/100 km/h and as each upshift '
733
+ + 're-engages: keyboard 0-100 vs the instrument, wheelspin per gear, post-shift yaw/heading/sideslip, lane offset. A nudge that grows into a spin '
734
+ + 'FAILS "not drivable on a keyboard". '
735
+ + 'Exit 0 = every compared figure passes and the keyboard launch does not FAIL, 1 = a figure is out of tolerance, the rest pose is wrong or the car is not drivable on a keyboard, 2 = could not simulate')
732
736
  .argument('[dir-or-package.json]', 'a vehicle package directory (vehicle-package.json), the package JSON, or a saved item read')
733
737
  .option('--item <id>', 'simulate a PUBLISHED vehicle item\'s stored package (public read) instead of a local file')
734
738
  .option('--spec <file>', 'extra targets: a package / {targets}, or a reference spec (perf.0_100_kmh_s, perf.braking_100_0_m, perf.braking_70mph_0_m, perf.skidpad_g, perf.turbo_lag_s … as {value, tol_pct})')
@@ -736,6 +740,7 @@ vehicleCommand
736
740
  .option('--runtime <file-or-url>', 'drive with this runtime bundle instead of the served one (a candidate engine build)')
737
741
  .option('--range <range>', 'engine range to resolve (default ^0.3)')
738
742
  .option('--api-url <url>', 'API to resolve the runtime (and --item) from (default: this CLI\'s environment)')
743
+ .option('--no-keyboard-launch', 'skip the keyboard launch and its hands-off yaw probe')
739
744
  .option('--json', 'print the machine-readable report')
740
745
  .action(async (input, opts) => {
741
746
  const { readVehiclePackageArg, simulateVehicle, targetsFromSpec, formatSimulationReport } = await Promise.resolve().then(() => __importStar(require('./vehicle/simulate')));
@@ -778,7 +783,7 @@ vehicleCommand
778
783
  }
779
784
  try {
780
785
  const runtime = await loadEngineRuntime({ apiUrl, offline: opts.offline, runtime: opts.runtime, range: opts.range });
781
- const report = await simulateVehicle(pkg, runtime, { specTargets });
786
+ const report = await simulateVehicle(pkg, runtime, { specTargets, skipKeyboardLaunch: opts.keyboardLaunch === false });
782
787
  if (opts.json)
783
788
  console.log(JSON.stringify({ source, spec: opts.spec ? (0, node_path_1.resolve)(opts.spec) : null, ...report }, null, 2));
784
789
  else