@hypersoniclabs/helix-cli 0.1.25-helix3.496 → 0.1.25-helix3.497
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/README.md +3 -3
- package/dist/index.js +16 -17
- package/dist/index.js.map +1 -1
- package/dist/itemPublishVersion.d.ts +3 -3
- package/dist/itemPublishVersion.js +10 -9
- package/dist/itemPublishVersion.js.map +1 -1
- package/dist/itemSetVersion.d.ts +1 -1
- package/dist/itemSetVersion.js +4 -4
- package/dist/itemSetVersion.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/vehicle/mintAddOn.js +2 -2
- package/dist/vehicle/mintAddOn.js.map +1 -1
- package/dist/vehicle/mintVehicle.js +1 -1
- package/dist/vehicle/mintVehicle.js.map +1 -1
- package/dist/visualQa/command.js +2 -2
- package/dist/visualQa/command.js.map +1 -1
- package/dist/visualQa/moveUx.js +7 -7
- package/dist/visualQa/moveUx.js.map +1 -1
- package/dist/visualQa/verdictText.d.ts +1 -1
- package/dist/visualQa/verdictText.js +5 -5
- package/dist/visualQa/verdictText.js.map +1 -1
- package/docs/visual-qa-candidate-versions.md +4 -3
- package/docs/visual-qa.md +11 -10
- package/package.json +1 -1
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
package/README.md
CHANGED
|
@@ -71,9 +71,9 @@ The token is stored in `~/.helix/credentials.json` (mode `600`). It's sent as
|
|
|
71
71
|
| `helix item list-slots [--json]` | Print the Character-Creator vocabulary a wearable declares: the cosmetic slot tags, and the genders. |
|
|
72
72
|
|
|
73
73
|
| `helix item distribution create\|list\|update\|disable …` | Manage Marketplace/World Claim or Buy routes without republishing the item or paying another publish fee. |
|
|
74
|
-
| `helix item visual-qa <item-id> [--submit] [--local-critic] [--storage-state <file>] [--host <id…>]` | Render the item's current package version headless in the real runtime (test-grounds world for vehicles and whole avatars, the customiser for add-ons and wearables on every declared host/base, the item viewer for props), measure it, and with `--submit` record the backend's verdict (numeric asserts + vision critic) against that exact version. **
|
|
75
|
-
| `helix item visual-qa <item-id> --package-version <v> [--vehicle-package <file>]` | Render a version the item is **not pinned to yet
|
|
76
|
-
| `helix item set-version <item-id> --package-version <v> --reason <text> [--expected-current-version-id <uuid>] [--as-admin] [--json]` | Move an item to a sealed Package Version of its own package (pin resolved from the public Package API; `POST /api/v1/universal-items/<id>/versions`). The flow for a **listed** item: `continuum publish-package` seals vN → `item
|
|
74
|
+
| `helix item visual-qa <item-id> [--submit] [--local-critic] [--storage-state <file>] [--host <id…>]` | Render the item's current package version headless in the real runtime (test-grounds world for vehicles and whole avatars, the customiser for add-ons and wearables on every declared host/base, the item viewer for props), measure it, and with `--submit` record the backend's verdict (numeric asserts + vision critic) against that exact version. **The visual check is advisory: it records notes with fix hints and never gates listing, distributions or version moves. Only a technical failure (an unusable file, with its plain reason) or content safety blocks.** See [docs/visual-qa.md](docs/visual-qa.md). |
|
|
75
|
+
| `helix item visual-qa <item-id> --package-version <v> [--vehicle-package <file>]` | Render a version the item is **not pinned to yet** and record advisory notes for it before (or after) the pointer moves; the move itself never waits on it. Vehicles and avatars go through Try Now (vehicles also need the move's vehicle package), add-ons and wearables through the customiser; the bundle names the candidate, and the vehicle checksum is the one the server minted for that trial. Never falls back to the current version. See [docs/visual-qa-candidate-versions.md](docs/visual-qa-candidate-versions.md). With `--submit`, a PASS prints the next command (`helix item set-version …`) for a version not moved yet; a 403 for a non-creator says so on the first line; `--status` also lists the item's pending (sealed, not current) versions. |
|
|
76
|
+
| `helix item set-version <item-id> --package-version <v> --reason <text> [--expected-current-version-id <uuid>] [--as-admin] [--json]` | Move an item to a sealed Package Version of its own package (pin resolved from the public Package API; `POST /api/v1/universal-items/<id>/versions`). The flow for a **listed** item: `continuum publish-package` seals vN → `item set-version`; the visual check is advisory and never gates the move. A refusal (a technical failure or content safety) prints the server's plain reason first, then the remedy. An unknown version lists the sealed ones. A **vehicle** moves its car with the pin: the version's sealed root (role `vehicle-definition`) is verified against the manifest and sent as `vehiclePackage`, the same rider `vehicle publish --item` sends; a version without one is refused with a pointer to that resume. A version the item **already had** is a rollback: `PUT /api/v1/universal-items/<id>/versions/current { revision, reason }` (the server restores that revision's retained `vehiclePackage`; a pin-only revision has none and is refused). `--as-admin` (platform admins, for an item another account created) posts the same body to `POST /api/v1/admin/universal-items/<id>/versions`: same gates (visual QA included, no override), `--reason` recorded with you as the actor. |
|
|
77
77
|
| `helix item thumbnail refresh <item-id> [--force] [--dry-run] [--json]` | Re-render a published item's canonical thumbnail from its **active Package Version** with the standard server renderer (`POST /api/v1/universal-items/<id>/thumbnail/regenerate`, owner or admin). Prints the status (`generated` / `current` / `dry-run`), old -> new thumbnail URL, renderer version and the source lane + Package Version. `--dry-run` writes nothing; `--force` re-renders even when the stored thumbnail is current. Moving an item to a new Package Version now refreshes the thumbnail automatically unless you uploaded one. An older backend answers 404 and the CLI says it does not support thumbnail refresh yet. Not the world `helix thumbnail set <slug>` command. |
|
|
78
78
|
| `helix item thumbnail set <item-id> <image> [--json]` | Upload your own thumbnail (png/jpg/webp, up to 10 MiB, checked locally) for a published item (`PUT /api/v1/universal-items/<id>/thumbnail`, moderated). A creator upload stays in place across version moves until you run `thumbnail refresh --force`. 403 = you are not the item's owner. |
|
|
79
79
|
| `helix device create <dir> --id <slug> --title <t> --model <mesh.glb> --template standing-desk\|clock\|television` | Scaffold a GLB-backed `helix.device/1` definition, including the interactive TV/media-player template. There is intentionally no website Device editor. |
|
package/dist/index.js
CHANGED
|
@@ -1130,7 +1130,7 @@ vehicleCommand
|
|
|
1130
1130
|
.description('Publish a vehicle package directory: validate (package, GLB, host manifest, audio), upload the model and samples, seal a '
|
|
1131
1131
|
+ 'public Vehicle Package whose root pins them, make the vehicle Item from that exact Version, and read it back (pin, package '
|
|
1132
1132
|
+ 'identity, mesh pin, every audio URL, and the host board: hostKind vehicle, sockets, tunable paths). Resumable from '
|
|
1133
|
-
+ '<dir>/.helix-publish/ledger.json. With --item: seal a STAGED new Version of that car and move it (visual
|
|
1133
|
+
+ '<dir>/.helix-publish/ledger.json. With --item: seal a STAGED new Version of that car and move it (the visual check is advisory and never gates the move). '
|
|
1134
1134
|
+ 'Directory: vehicle-package.json + model.glb (asset.extras.HELIX_vehicle with sockets) + WAVs; optional publish.json '
|
|
1135
1135
|
+ '{ title, description, tags, version, contentRating, provenance, hostGrantExtensions }. '
|
|
1136
1136
|
+ 'Exit 0 = published and verified, 1 = a check or read-back failed, 2 = could not run')
|
|
@@ -1241,7 +1241,7 @@ vehicleAddOnCommand
|
|
|
1241
1241
|
+ 'Package (root: the helix.vehicle-addon-definition/1 JSON; a tune-only part seals no model), make the add-on Item from that exact '
|
|
1242
1242
|
+ 'Version, and read it back: pinned, the backend fit lists every host, every host\'s add-on rail lists it. No offer is opened. '
|
|
1243
1243
|
+ 'A CHANGED part is a new Version of the SAME Item: --package-version <semver> with --item <id> (or in the directory that first published it) '
|
|
1244
|
-
+ 'seals a staged Version and moves the Item to it (visual
|
|
1244
|
+
+ 'seals a staged Version and moves the Item to it (the visual check is advisory and never gates the move; re-run the same command to retry one the server refused); '
|
|
1245
1245
|
+ 'sealing a version name that already holds different bytes is refused. --dry-run also runs the seal-side validation '
|
|
1246
1246
|
+ '(provenance.source <= 256 chars, contentRating, Package shape, version clash). '
|
|
1247
1247
|
+ 'Resumable from <dir>/.helix-publish/ledger.json. Exit 0 = published and verified, 1 = a check or read-back failed, 2 = could not run')
|
|
@@ -2032,9 +2032,8 @@ itemThumbnail
|
|
|
2032
2032
|
}
|
|
2033
2033
|
});
|
|
2034
2034
|
// Ship a corrected mesh onto an already-published GLB add-on/prop/avatar IN PLACE: seal a new Version of the item's
|
|
2035
|
-
// own Continuum Package, then move the item pointer.
|
|
2036
|
-
//
|
|
2037
|
-
// --submit`, then `item set-version`. This is step 1 of `VERSION_MOVE_FLOW_HELP`.
|
|
2035
|
+
// own Continuum Package, then move the item pointer. The visual check is advisory and never gates the move; a refusal
|
|
2036
|
+
// (technical failure or content safety) leaves the sealed Version behind and says why. See `VERSION_MOVE_FLOW_HELP`.
|
|
2038
2037
|
item
|
|
2039
2038
|
.command('publish-version')
|
|
2040
2039
|
.description('Ship a corrected mesh onto an already-published GLB add-on/prop/avatar, IN PLACE — new Package Version, same item id/owner/listings; every existing owner gets it at their next spawn')
|
|
@@ -2069,7 +2068,7 @@ item
|
|
|
2069
2068
|
return;
|
|
2070
2069
|
}
|
|
2071
2070
|
console.log(`✔ Sealed ${result.packageId}@${result.version} — a new Version of ${itemId} (manifest ${result.manifestCid}).`);
|
|
2072
|
-
console.log(` The
|
|
2071
|
+
console.log(` The item was not moved; the seal is left in place and is reused by a retry with the same mesh.`);
|
|
2073
2072
|
if (result.refusal)
|
|
2074
2073
|
console.log((0, itemSetVersion_1.renderSetVersionError)(result.refusal));
|
|
2075
2074
|
process.exitCode = 1;
|
|
@@ -2078,16 +2077,16 @@ item
|
|
|
2078
2077
|
fail(error instanceof lib_1.ApiError ? error.render() : `✖ ${error instanceof Error ? error.message : String(error)}`);
|
|
2079
2078
|
}
|
|
2080
2079
|
});
|
|
2081
|
-
// Move a (listed) item to an already-sealed Package Version of its own package. The visual
|
|
2082
|
-
//
|
|
2080
|
+
// Move a (listed) item to an already-sealed Package Version of its own package. The visual check is advisory and never
|
|
2081
|
+
// gates the move; a refusal (technical failure or content safety) prints the server's plain reason first.
|
|
2083
2082
|
item
|
|
2084
2083
|
.command('set-version')
|
|
2085
|
-
.description('Move an item to a sealed Package Version of its own package (the
|
|
2084
|
+
.description('Move an item to a sealed Package Version of its own package (the visual check is advisory and never gates the move; only a technical failure or content safety refuses it). A vehicle moves its car with the pin: the version\'s sealed vehicle definition is sent as properties.vehiclePackage (refused if the version has none). A version the item already had is a rollback (PUT versions/current), so moving back to an older version works too')
|
|
2086
2085
|
.argument('<item-id>', 'universal item UUID')
|
|
2087
2086
|
.requiredOption('--package-version <version>', 'the sealed version to move to, e.g. 1.0.12')
|
|
2088
2087
|
.requiredOption('--reason <text>', 'required, lands in the audit ledger')
|
|
2089
2088
|
.option('--expected-current-version-id <uuid>', 'refuse if the item has moved off this Package Version since you last read it')
|
|
2090
|
-
.option('--as-admin', 'platform admins only: move an item another account created (POST /api/v1/admin/universal-items/<id>/versions). Same gates as the creator move,
|
|
2089
|
+
.option('--as-admin', 'platform admins only: move an item another account created (POST /api/v1/admin/universal-items/<id>/versions). Same gates as the creator move (technical failure, content safety); --reason is recorded with you as the actor')
|
|
2091
2090
|
.option('--json', 'machine-readable output')
|
|
2092
2091
|
.addHelpText('after', moveUx_1.VERSION_MOVE_FLOW_HELP)
|
|
2093
2092
|
.action(async (itemId, opts) => {
|
|
@@ -2289,16 +2288,16 @@ function initialDistributionInputFromPackFlags(opts) {
|
|
|
2289
2288
|
// Distinct from `item distribution disable` below: a distribution is ONE
|
|
2290
2289
|
// acquisition route (you can have several); delist takes the whole item
|
|
2291
2290
|
// definition off browse/marketplace regardless of how many routes it has.
|
|
2292
|
-
// Visual QA:
|
|
2291
|
+
// Visual QA: an advisory check that looks at an item RENDERED, in the real runtime, not its numbers; it never gates. This command is
|
|
2293
2292
|
// the harness: it renders the item's current package version headless (test-grounds world for vehicles, the
|
|
2294
2293
|
// customiser for add-ons and wearables, the item viewer for props), measures it, and with --submit hands it to the
|
|
2295
|
-
// backend, which
|
|
2294
|
+
// backend, which records the advisory notes against that exact version and serves a contact sheet.
|
|
2296
2295
|
item
|
|
2297
2296
|
.command('visual-qa')
|
|
2298
|
-
.description('Render an item headless in the real HELIX runtime, measure it, and (with --submit) record the visual-QA
|
|
2297
|
+
.description('Render an item headless in the real HELIX runtime, measure it, and (with --submit) record the advisory visual-QA notes (never a gate on publishing, listing or moving; only an unusable file or content safety blocks). --hosted asks the platform to render it on a GPU runner instead')
|
|
2299
2298
|
.argument('[item-id]', 'universal item UUID (its CURRENT package version is rendered, or --package-version); omit with --hosted-worker')
|
|
2300
2299
|
.option('--submit', 'submit frames + measurements to the backend, which judges and records the verdict (needs `helix login`)')
|
|
2301
|
-
.option('--hosted', 'queue a hosted render on the platform GPU runner and wait for the verdict (needs `helix login`; exit 0 pass, 0 warn (
|
|
2300
|
+
.option('--hosted', 'queue a hosted render on the platform GPU runner and wait for the verdict (needs `helix login`; exit 0 pass, 0 warn (advisory notes only: `verdict: "warn"` + `warnings` in --json), 1 fail (notes, never a gate), 2 error)')
|
|
2302
2301
|
.option('--retry', 'with --hosted: REQUEUE this version after a failed, errored or exhausted hosted run (a fresh job, attempts start again; inside the backend cooldown it waits it out, up to --timeout)')
|
|
2303
2302
|
.option('--no-wait', 'with --hosted: queue the render and return without waiting')
|
|
2304
2303
|
.option('--timeout <minutes>', 'with --hosted: how long to wait for the verdict', '30')
|
|
@@ -2404,7 +2403,7 @@ item
|
|
|
2404
2403
|
else if (!req.job)
|
|
2405
2404
|
console.log(`✖ nothing queued${req.skipped ? ` (${req.skipped})` : ''}${req.message ? `: ${req.message}` : ''}`);
|
|
2406
2405
|
else if (req.skipped === 'warned_run')
|
|
2407
|
-
console.log(`! this version already has a WARN run (
|
|
2406
|
+
console.log(`! this version already has a WARN run (advisory notes only, nothing blocks): nothing to re-queue. Read the warnings with: helix item visual-qa ${id} --status`);
|
|
2408
2407
|
else if (req.skipped)
|
|
2409
2408
|
console.log(`✖ not re-queued (${req.skipped})${req.message ? `: ${req.message}` : ''}${req.retryAfter ? ` Retry after ${req.retryAfter}.` : ''} Showing the existing job: ${hosted.describeJob(req.job)}`);
|
|
2410
2409
|
else
|
|
@@ -2479,12 +2478,12 @@ item
|
|
|
2479
2478
|
if (outcome.server?.contactSheetUrl)
|
|
2480
2479
|
console.log(` recorded: ${outcome.server.contactSheetUrl}`);
|
|
2481
2480
|
if (!opts.submit)
|
|
2482
|
-
console.log(' (local run only — add --submit to record the
|
|
2481
|
+
console.log(' (local run only — add --submit to record the advisory notes; nothing waits on them)');
|
|
2483
2482
|
for (const line of (0, moveUx_1.nextStepAfterPass)({ itemId: id, packageVersion: outcome.bundle.item.packageVersion, candidate: !!outcome.candidate, submitted: !!outcome.server, verdict: outcome.verdict, vehiclePackageFile: opts.vehiclePackage }))
|
|
2484
2483
|
console.log(line);
|
|
2485
2484
|
console.log(` ${(outcome.timings.totalMs / 1000).toFixed(1)} s (render ${(outcome.timings.renderMs / 1000).toFixed(1)} s)`);
|
|
2486
2485
|
}
|
|
2487
|
-
// pass 0 · warn 0 (
|
|
2486
|
+
// pass 0 · warn 0 (advisory notes only, nothing blocks) · fail 1 · error 2
|
|
2488
2487
|
process.exitCode = (await Promise.resolve().then(() => __importStar(require('./visualQa/verdictText')))).exitCodeForVerdict(outcome.verdict);
|
|
2489
2488
|
}
|
|
2490
2489
|
catch (error) {
|