@helix3/helix-cli 0.1.19-helix3.373 → 0.1.20-helix3.378

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 (54) hide show
  1. package/README.md +17 -1
  2. package/dist/index.js +55 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/item.d.ts +11 -1
  5. package/dist/item.js +32 -2
  6. package/dist/item.js.map +1 -1
  7. package/dist/lib.d.ts +2 -2
  8. package/dist/lib.js +3 -1
  9. package/dist/lib.js.map +1 -1
  10. package/dist/publications.d.ts +11 -0
  11. package/dist/publications.js +33 -0
  12. package/dist/publications.js.map +1 -1
  13. package/dist/tsconfig.build.tsbuildinfo +1 -1
  14. package/dist/vehicle/addon.d.ts +19 -1
  15. package/dist/vehicle/addon.js +76 -7
  16. package/dist/vehicle/addon.js.map +1 -1
  17. package/dist/vehicle/drive.d.ts +66 -0
  18. package/dist/vehicle/drive.js +226 -0
  19. package/dist/vehicle/drive.js.map +1 -0
  20. package/dist/vehicle/previewAddon.d.ts +6 -1
  21. package/dist/vehicle/previewAddon.js +136 -19
  22. package/dist/vehicle/previewAddon.js.map +1 -1
  23. package/dist/visualQa/avatar.js +17 -0
  24. package/dist/visualQa/avatar.js.map +1 -1
  25. package/dist/visualQa/checklists.d.ts +15 -1
  26. package/dist/visualQa/checklists.js +30 -4
  27. package/dist/visualQa/checklists.js.map +1 -1
  28. package/dist/visualQa/command.d.ts +2 -0
  29. package/dist/visualQa/command.js +3 -0
  30. package/dist/visualQa/command.js.map +1 -1
  31. package/dist/visualQa/harness.d.ts +2 -0
  32. package/dist/visualQa/vehiclePenetration.d.ts +3 -2
  33. package/dist/visualQa/vehiclePenetration.js +7 -3
  34. package/dist/visualQa/vehiclePenetration.js.map +1 -1
  35. package/dist/visualQa/viewer.js +29 -0
  36. package/dist/visualQa/viewer.js.map +1 -1
  37. package/dist/visualQa/worldWalk.d.ts +59 -0
  38. package/dist/visualQa/worldWalk.js +518 -0
  39. package/dist/visualQa/worldWalk.js.map +1 -0
  40. package/dist/visualQa/worldWalkMath.d.ts +262 -0
  41. package/dist/visualQa/worldWalkMath.js +860 -0
  42. package/dist/visualQa/worldWalkMath.js.map +1 -0
  43. package/dist/visualQa/worldWalkProbe.d.ts +1 -0
  44. package/dist/visualQa/worldWalkProbe.js +206 -0
  45. package/dist/visualQa/worldWalkProbe.js.map +1 -0
  46. package/docs/visual-qa.md +66 -2
  47. package/package.json +3 -1
  48. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  49. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  50. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  51. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  52. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  53. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  54. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
package/README.md CHANGED
@@ -49,6 +49,7 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
49
49
  | `helix vehicle preview [<dir-or-package.json>] [--glb <model.glb>] [--addon <dir>]… [--item <id>] [--tolerance-cm <cm>] [--out <dir>] [--proxy-item <id>] [--json]` | Render a vehicle that is **not published yet** headless in the real runtime (hosted test grounds, Try Now through a published proxy vehicle whose car is swapped for your package + GLB, served from disk; nothing uploaded or recorded) and measure it: body-origin height against the declared `groundToBodyOrigin` (the number that locks at first mint), wheels on their hubs, arch clearance, rolling radius vs `wheelRadius`, steering, doors, seats. Prints a numeric summary with PASS/FAIL per check and writes frames, a contact sheet, `bundle.json` and `preview.json`. Boards with the candidate's own seat ids. With `--addon <dir>` (repeatable) it previews unpublished vehicle **add-ons** instead: fits each to the candidate car or a published car and measures the drawn geometry in world space against its anchor (wheels within 1 cm of each hub, socket/host-framed parts at their mount, not at the car's origin; tune-only ops read back from the live tuning). Exit `0` pass, `1` fail, `2` could not measure. See [docs/vehicle-preview.md](docs/vehicle-preview.md). |
50
50
  | `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). |
51
51
  | `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. |
52
+ | `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. |
52
53
  | `helix vehicle audio-check <dir\|package.json\|item-id> [--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). |
53
54
  | `helix vehicle addon check <dir> [--json]` | Add-on fit gate for local source and host compatibility. |
54
55
  | `helix item list-slots [--json]` | Print the Character-Creator vocabulary a wearable declares: the cosmetic slot tags, and the genders. |
@@ -84,7 +85,7 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
84
85
  | `helix world performance-report [bundle] [--scene <scene-v2.json>] [--package <package-version.json>] [--snapshot <inspect.json>] [--perf <receipt.json>]` | Analyze exact declared scene resources and existing reference-profile budgets, while keeping authored geometry/material/delivery estimates separate from supplied runtime claims. Prints actionable instancing, Palette, lighting, transfer, and visual-QA guidance; it never predicts FPS from static counts. |
85
86
  | `helix world scene-source inventory\|compile <helsinki\|bistro> <archive>` | Verify and safely inventory a known CC BY source archive, then compile deterministic local proxy/detail GLBs and an existing-schema Scene v2 package. |
86
87
  | `helix world scene-source publish <world-id> <package-dir> [--publish]` | Validate the Scene v2 package and print its multipart build receipt. Execution remains dry-run-only until backend private-pin entitlement lands; `--publish` currently fails closed, and access control never changes CC BY rights. |
87
- | `helix continuum publish-source-map\|publish-scratch\|publish-package\|publish-glb\|make-item` | Resume exact-CID object adoption/ingestion, Package lease/seal, optional explicitly authorized Listing, and WorldRelease publication through one creator-owned pipeline. |
88
+ | `helix continuum publish-source-map\|publish-scratch\|publish-package\|publish-glb\|make-item\|publish-owned-item` | Resume exact-CID object adoption/ingestion, Package lease/seal, optional explicitly authorized Listing, and WorldRelease publication through one creator-owned pipeline. |
88
89
  | `helix continuum receipt <job-id>` | Read the sanitized durable receipt for a completed Continuum publication. |
89
90
  | `helix unreal init\|validate\|doctor\|package [project]` | Create and gate a shared-runtime or native-game publish manifest, check optional editor MCP, and assemble a local upload-shaped package. |
90
91
  | `helix unreal publish <candidate> --world <slug>` | Upload a **cooked** Unreal world to HELIX: verify the candidate, presign, upload every artifact, finalize, and promote it as the world's active build. |
@@ -632,6 +633,21 @@ Creating an Item without an active offer grants no creator copy. The same intent
632
633
  interrupted call. The backend derives specialized Item metadata from the sealed Package root;
633
634
  client supplied host, fit, operation and rider metadata is never trusted.
634
635
 
636
+ An Item created with `make-item --personal` keeps its identity when published later. First make
637
+ its Package public and confirm the current sealed pin, then attest its rating and publish that
638
+ existing Item. Publishing opens no acquisition route or creator copy; create a Marketplace or
639
+ World Distribution afterward when it should become available:
640
+
641
+ ```bash
642
+ helix continuum publish-owned-item <item-uuid> --package-id <uuid> \
643
+ --package-version 1.0.0 --manifest-cid cid:sha256:<64-hex> \
644
+ --content-rating everyone --accept-rating-attestation --json
645
+ ```
646
+
647
+ Use `--intent-id <uuidv4>` to retry an interrupted promotion safely. The server requires the
648
+ Package to be public, sealed, current, owned by the creator, and pinned to that Item. A private
649
+ Package cannot be promoted through this Item command.
650
+
635
651
  Existing Item reads, distributions, visual QA and Package Version moves remain available. The
636
652
  former Item-first authoring commands are retired from CLI discovery.
637
653
  Vehicle, add-on, locomotion and interactive definition authors must seal the appropriate Package
package/dist/index.js CHANGED
@@ -696,6 +696,11 @@ function vehicleContinuumDeps() {
696
696
  };
697
697
  });
698
698
  }
699
+ /** The drive-effect instrument for `vehicle addon check`: the live runtime's physics, loaded lazily on first use. */
700
+ async function vehicleDriveMeasure(apiUrl) {
701
+ const drive = await Promise.resolve().then(() => __importStar(require('./vehicle/drive')));
702
+ return async (vehiclePackage, ops, slotType) => drive.judgeDriveEffect(await drive.loadDriveEngine(apiUrl), vehiclePackage, ops, slotType);
703
+ }
699
704
  function printVehicleJsonOr(json, value, human) {
700
705
  if (json)
701
706
  console.log(JSON.stringify(value, (_k, v) => (v === Number.NEGATIVE_INFINITY ? '-Infinity' : v), 2));
@@ -749,10 +754,14 @@ vehicleAddOnCommand
749
754
  .command('check')
750
755
  .description('Prove an add-on will fit and land where it should BEFORE paying for it: the local fits/ops contract, the model\'s helixMeshFrame anchoring '
751
756
  + '(a socket-frame part centred on its mount), per host — a vehicle, wheel origins at the hubs, hide targets present, hide grants on the board — '
752
- + 'and the backend\'s own fit dry run (POST /universal-items/validate-fit: how many hosts it actually fits). '
753
- + 'Directory: addon.json { title, fits, ops, ... } + model.glb. Exit 0 = fits every named host')
757
+ + 'tunable paths the part requires exposed on the host surface, the backend\'s own fit dry run (POST /universal-items/validate-fit: how many '
758
+ + 'hosts it actually fits), and — for tune ops — the DRIVE EFFECT on each host, measured with the live runtime\'s own physics and add-on fold '
759
+ + '(0-100, top speed, quarter mile, skidpad g and roll, full- and part-pedal stops, handbrake), each op judged on a figure it can move; an op '
760
+ + 'that changes nothing or cancels another is reported. Directory: addon.json { title, fits, ops, ... } + model.glb (none for a tune-only part: '
761
+ + 'ECU, gearbox, brakes, sway bars, coilovers, tyre compound — every op a tune). Exit 0 = fits every named host and does something')
754
762
  .argument('<dir>', 'the add-on directory')
755
763
  .option('--glb <file>', 'the add-on model, when the directory holds more than one .glb')
764
+ .option('--no-measure', 'skip the drive-effect measurement (it downloads the live runtime and runs its physics, ~1-5 s per host)')
756
765
  .option('--json', 'print the machine-readable report')
757
766
  .action(async (dir, opts) => {
758
767
  try {
@@ -762,6 +771,7 @@ vehicleAddOnCommand
762
771
  api: lib_1.HelixApi.forCredentials(creds),
763
772
  onProgress: (m) => { if (!opts.json)
764
773
  console.log(`· ${m}`); },
774
+ measureDrive: opts.measure === false ? undefined : await vehicleDriveMeasure(creds.apiUrl),
765
775
  });
766
776
  printVehicleJsonOr(opts.json, report, () => console.log(addon.formatAddOnReport(report)));
767
777
  if (!report.ok)
@@ -1758,6 +1768,7 @@ item
1758
1768
  .option('--package-version <version>', 'render this version of the item\'s pinned package instead of the pin: a version move judged before the pointer moves (vehicles, avatars, add-ons, wearables)')
1759
1769
  .option('--vehicle-package <file>', 'with --package-version on a vehicle: the version move\'s vehicle package JSON, served by Try Now after server-side preparation')
1760
1770
  .option('--chrome <path>', 'Chromium executable (default: Playwright Chromium / Chrome for Testing, headless; the macOS system Chrome is refused)')
1771
+ .option('--no-world-walk', 'skip the world walk (wearables, character add-ons, avatars: worn and walked in the test grounds, measured for holes and poke-through); also HELIX_VQA_WORLD_WALK=0')
1761
1772
  .option('--api-url <url>', 'platform API base URL')
1762
1773
  .option('--web-url <url>', 'website base URL (default: the site that serves --api-url)')
1763
1774
  .option('--json', 'print the outcome as JSON')
@@ -1881,6 +1892,7 @@ item
1881
1892
  packageVersion: opts.packageVersion?.trim() || null,
1882
1893
  vehiclePackage,
1883
1894
  chrome: opts.chrome,
1895
+ worldWalk: opts.worldWalk,
1884
1896
  submit: opts.submit,
1885
1897
  localCritic: opts.localCritic,
1886
1898
  cliVersion: (0, lib_1.cliVersion)(),
@@ -4648,6 +4660,47 @@ continuum
4648
4660
  fail(error instanceof lib_1.ApiError ? error.render() : `✖ ${error instanceof Error ? error.message : String(error)}`);
4649
4661
  }
4650
4662
  });
4663
+ continuum
4664
+ .command('publish-owned-item')
4665
+ .description('Publish an existing personal Item from its exact sealed public Package pin; open offers separately')
4666
+ .argument('<item-id>', 'existing Item UUID; identity is preserved')
4667
+ .requiredOption('--package-id <uuid>', 'owned sealed Package UUID')
4668
+ .requiredOption('--package-version <semver>', 'exact current sealed Package Version')
4669
+ .requiredOption('--manifest-cid <cid>', 'exact immutable manifest CID')
4670
+ .requiredOption('--content-rating <rating>', 'creator-attested rating: everyone, teen, mature or adult')
4671
+ .option('--accept-rating-attestation', 'attest that the stated content rating is accurate')
4672
+ .option('--intent-id <uuidv4>', 'stable UUIDv4 for safe retry after an interrupted request')
4673
+ .option('--json', 'emit the unchanged Item and publication receipt')
4674
+ .action(async (itemId, opts) => {
4675
+ try {
4676
+ if (opts.acceptRatingAttestation !== true)
4677
+ throw new Error('--accept-rating-attestation is required to publish an Item');
4678
+ if (!['everyone', 'teen', 'mature', 'adult'].includes(opts.contentRating))
4679
+ throw new Error('--content-rating must be everyone, teen, mature or adult');
4680
+ const creds = requireAuth();
4681
+ const mismatch = (0, config_1.credsEnvMismatchWarning)(creds.apiUrl);
4682
+ if (mismatch)
4683
+ throw new Error(`Refusing to publish an Item:\n${mismatch}`);
4684
+ const { publishOwnedItemFromPackage } = await Promise.resolve().then(() => __importStar(require('./publications')));
4685
+ const receipt = await publishOwnedItemFromPackage({
4686
+ itemId,
4687
+ intentId: opts.intentId,
4688
+ packagePin: { packageId: opts.packageId, version: opts.packageVersion, manifestCid: opts.manifestCid },
4689
+ contentRating: opts.contentRating,
4690
+ acceptRatingAttestation: true,
4691
+ }, creds);
4692
+ if (opts.json)
4693
+ console.log(JSON.stringify(receipt, null, 2));
4694
+ else {
4695
+ console.log(`✔ Published existing Package-backed Item ${receipt.item.id}`);
4696
+ console.log(` package: ${receipt.item.packagePin.packageId}@${receipt.item.packagePin.version}`);
4697
+ console.log(' offers: none opened; use helix item distribution create when ready');
4698
+ }
4699
+ }
4700
+ catch (error) {
4701
+ fail(error instanceof lib_1.ApiError ? error.render() : `✖ ${error instanceof Error ? error.message : String(error)}`);
4702
+ }
4703
+ });
4651
4704
  continuum
4652
4705
  .command('publish-glb')
4653
4706
  .description('Seal a GLB as a Continuum Prop or Character Package; optionally open a Marketplace or World offer')