@helix3/helix-cli 0.1.23-helix3.431 → 0.1.23-helix3.433

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 (33) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +3 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/tsconfig.build.tsbuildinfo +1 -1
  5. package/dist/vehicle/audioImport.d.ts +32 -0
  6. package/dist/vehicle/audioImport.js +47 -2
  7. package/dist/vehicle/audioImport.js.map +1 -1
  8. package/dist/vehicle/audioProvenance.js +16 -0
  9. package/dist/vehicle/audioProvenance.js.map +1 -1
  10. package/dist/vehicle/testutil/sourcedAudio.js +5 -0
  11. package/dist/vehicle/testutil/sourcedAudio.js.map +1 -1
  12. package/dist/verifySubPath.d.ts +3 -0
  13. package/dist/verifySubPath.js +25 -17
  14. package/dist/verifySubPath.js.map +1 -1
  15. package/docs/vehicle-audio-import.md +8 -1
  16. package/package.json +2 -2
  17. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  18. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  19. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  20. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  21. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  22. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  23. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  24. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  25. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  26. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  27. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  28. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  29. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  30. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  31. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +17 -0
  33. package/plugins/beamng-vehicle/bin/test_sim_audio.py +11 -1
package/README.md CHANGED
@@ -53,8 +53,8 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
53
53
  | `helix continuum publish-glb <mesh.glb> --title <t> [--package-type asset\|character] [--offer marketplace\|world --price-lix <n> --content-rating <rating>]` | Seal a Package first; optional offer makes it ownable. See [Package-first GLB publication](#package-first-glb-publication). |
54
54
  | `helix continuum make-item --package-id <id> --package-version <v> --manifest-cid <cid> --content-rating <rating> [--offer marketplace\|world --price-lix <n>]` | Project one exact sealed Package Version into an Item, with an optional first offer. |
55
55
  | `helix continuum publish-owned-item <item-id> --package-id <id> --package-version <v> --manifest-cid <cid> --content-rating <rating> --accept-rating-attestation` | Publish an existing personal Item from its unchanged public sealed Package pin. Offers are separate. |
56
- | `helix vehicle audio-import <mod dir\|mod .zip\|AC car dir\|.bank> --out <dir> [--sim beamng\|ac\|auto] [--vehicle <id>] [--config <file.pc>] [--map <slot-map.json>] [--beamng-root <dir>] [--cylinders N] [--json]` | Takes a car's sounds from the sim mod that carries them, never synthesised: a BeamNG mod's own ladders and every sound its parts name (stock FMOD events resolved in the install's banks with `--beamng-root`, which also supplies what the game itself plays for unnamed slots), or an Assetto Corsa car's FMOD bank. Writes `audio/*.wav` (16-bit PCM, malformed headers repaired) and `audio.json` (the package `audio` block, all 31 slots, `provenance` on every slot, bank sample and blend). `--map` merges slots from several sources. Exit `1` when a slot stays empty. See [docs/vehicle-audio-import.md](docs/vehicle-audio-import.md). |
57
- | `helix vehicle audio-check <dir\|package.json\|audio.json\|item-id> [--reference <clip>]... [--json]` | Proves every sound the runtime will select resolves, is PCM WAV and is audible (pre-publish on local files, or read-back on a published item), and that no two roles share one recording (shift up = shift down, an exhaust rung = an engine rung) and the rev limiter is a short crack the runtime can retrigger. Prints each slot's provenance and FAILS synthesised or generated audio (`AUDIO_SYNTHESISED`), a car without a recorded engine ladder (`AUDIO_ENGINE_UNSOURCED`), a missing or empty slot (`AUDIO_SLOT_UNSOURCED`, except `absent: "not-fitted"` / `"combined-with-engine"`), recordings without provenance (`AUDIO_PROVENANCE_MISSING`) and a not-fitted claim the physics contradicts (`AUDIO_SLOT_FITMENT_MISMATCH`); `vehicle publish` refuses the same. `--reference <clip>` (repeatable; `slot=clip` for a slot) compares the idle voice's centroid and firing roughness with a real-car recording. |
56
+ | `helix vehicle audio-import <mod dir\|mod .zip\|AC car dir\|.bank> --out <dir> [--sim beamng\|ac\|auto] [--vehicle <id>] [--config <file.pc>] [--map <slot-map.json>] [--beamng-root <dir>] [--cylinders N] [--base-package <vehicle-package.json>] [--json]` | Takes a car's sounds from the sim mod that carries them, never synthesised: a BeamNG mod's own ladders and every sound its parts name (stock FMOD events resolved in the install's banks with `--beamng-root`, which also supplies what the game itself plays for unnamed slots), or an Assetto Corsa car's FMOD bank. Writes `audio/*.wav` (16-bit PCM, malformed headers repaired) and `audio.json` (the package `audio` block, all 31 slots, `provenance` on every slot, bank sample and blend). `--map` merges slots from several sources. The block always carries the runtime's mix fields (gains, load mix, muffling): from `--base-package` to keep a car's current mix, else the mod's soundConfig, else the engine's defaults. Exit `1` when a slot stays empty. See [docs/vehicle-audio-import.md](docs/vehicle-audio-import.md). |
57
+ | `helix vehicle audio-check <dir\|package.json\|audio.json\|item-id> [--reference <clip>]... [--json]` | Proves every sound the runtime will select resolves, is PCM WAV and is audible (pre-publish on local files, or read-back on a published item), and that no two roles share one recording (shift up = shift down, an exhaust rung = an engine rung) and the rev limiter is a short crack the runtime can retrigger. Prints each slot's provenance and FAILS synthesised or generated audio (`AUDIO_SYNTHESISED`), a car without a recorded engine ladder (`AUDIO_ENGINE_UNSOURCED`), a missing or empty slot (`AUDIO_SLOT_UNSOURCED`, except `absent: "not-fitted"` / `"combined-with-engine"`), recordings without provenance (`AUDIO_PROVENANCE_MISSING`) and a not-fitted claim the physics contradicts (`AUDIO_SLOT_FITMENT_MISMATCH`) and an audio block without finite mix fields (`AUDIO_MIX_FIELDS_MISSING`: a NaN gain freezes the car in Try Now); `vehicle publish` refuses the same. `--reference <clip>` (repeatable; `slot=clip` for a slot) compares the idle voice's centroid and firing roughness with a real-car recording. |
58
58
  | `helix vehicle addon check <dir> [--json]` | Add-on fit gate for local source and host compatibility, including the web customizer's meshless guard (`ADDON_CUSTOMIZER_REFUSES`: a part with no `model.glb` must be a verified tune-only/sound-only definition). |
59
59
  | `helix vehicle addon check --item <addOnId>... / --host <vehicleId>... [--json]` | Published mode (public reads, no sign-in): reads each add-on Item's exact Package pin and runs exactly what the web customizer runs; `--host` checks every add-on on the car's rail. Exit `1` = the customizer would refuse a part, with its message. |
60
60
  | `helix item list-slots [--json]` | Print the Character-Creator vocabulary a wearable declares: the cosmetic slot tags, and the genders. |
package/dist/index.js CHANGED
@@ -983,12 +983,13 @@ vehicleCommand
983
983
  .option('--sim <sim>', 'beamng | ac | auto', 'auto')
984
984
  .option('--vehicle <id>', 'the BeamNG vehicle folder (vehicles/<id>) when the mod has several')
985
985
  .option('--config <file.pc>', 'the BeamNG configuration whose selected parts name the sounds (default: the vehicle\'s default .pc)')
986
- .option('--map <slot-map.json>', 'merge sources per slot: { sources: { id: { path, sim: beamng|ac|beamng-base|recording, vehicle?, config?, modUrl? } }, slots: { <slot>: { source?, sample?|field?|event?|file?, blend? (ladders), trim?: { startS, endS }, concat?: [pick, ...], notFitted?|absent: "not-fitted" + reason } }, ladder: { source, blend?, exhaustBlend?, rpm: { sample: rpm }, prefer, nativeRungs }, cylinders, strokes, crankLayout, bankId, modUrl } (docs/vehicle-audio-import.md)')
986
+ .option('--map <slot-map.json>', 'merge sources per slot: { sources: { id: { path, sim: beamng|ac|beamng-base|recording, vehicle?, config?, modUrl? } }, slots: { <slot>: { source?, sample?|field?|event?|file?, blend? (ladders), trim?: { startS, endS }, concat?: [pick, ...], notFitted?|absent: "not-fitted" + reason } }, ladder: { source, blend?, exhaustBlend?, rpm: { sample: rpm }, prefer, nativeRungs }, cylinders, strokes, crankLayout, bankId, modUrl, engineGainDb, exhaustGainDb, minLoadMix, maxLoadMix, muffling } (docs/vehicle-audio-import.md)')
987
987
  .option('--beamng-root <dir>', 'the BeamNG.drive install (its content/art_sound.zip FMOD banks and content/vehicles/common.zip); default $HELIX_BEAMNG_ROOT')
988
988
  .option('--cylinders <n>', 'the RECORDED engine\'s cylinder count (the ladder pitch model); required for an Assetto Corsa car', (v) => Number(v))
989
989
  .option('--prefer <side>', 'exterior | interior engine recordings (Assetto Corsa engine_ext / engine_int)', 'exterior')
990
990
  .option('--ac-native-rungs', 'keep only FMOD engine samples the bank places at their recorded pitch (no auto-pitch re-rate)')
991
991
  .option('--mod-url <url>', 'where the mod was downloaded from (recorded in provenance.modUrl)')
992
+ .option('--base-package <vehicle-package.json>', 'an existing package (file, its directory, or an audio.json) whose audio mix to keep: engineGainDb, exhaustGainDb, minLoadMix, maxLoadMix, muffling (else the mod\'s soundConfig, else the engine\'s defaults; --map values win)')
992
993
  .option('--json', 'print the machine-readable result')
993
994
  .action(async (source, opts) => {
994
995
  try {
@@ -1000,7 +1001,7 @@ vehicleCommand
1000
1001
  const result = importVehicleAudio({
1001
1002
  source, out: opts.out, sim: (opts.sim ?? 'auto'), vehicle: opts.vehicle, config: opts.config, map: opts.map,
1002
1003
  beamngRoot: opts.beamngRoot ?? process.env.HELIX_BEAMNG_ROOT, cylinders: opts.cylinders, prefer: opts.prefer === 'interior' ? 'interior' : 'exterior',
1003
- acNativeRungs: opts.acNativeRungs, modUrl: opts.modUrl, vgmstream: process.env.HELIX_VGMSTREAM,
1004
+ acNativeRungs: opts.acNativeRungs, modUrl: opts.modUrl, basePackage: opts.basePackage, vgmstream: process.env.HELIX_VGMSTREAM,
1004
1005
  });
1005
1006
  printVehicleJsonOr(opts.json, result, () => console.log(formatAudioImport(result)));
1006
1007
  if (!result.ok)