@helix3/helix-cli 0.1.18-helix3.265 → 0.1.18-helix3.266

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/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +10 -1
  2. package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +17 -0
  3. package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
  4. package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
  5. package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
  6. package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
  7. package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
  8. package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
  9. package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
  10. package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
  11. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
  12. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
  13. package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
  14. package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
  15. package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
  16. package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
  17. package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
  18. package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
  19. package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
  20. package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
  21. package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
  22. package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
  23. package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
  24. package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
  25. package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
  26. package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
  27. package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
  28. package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
  29. package/package.json +1 -1
  30. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  31. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  32. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  33. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
@@ -22,6 +22,15 @@ const PROFILE_SET_SCHEMA = 'helix.bridge.unreal-asset-set/1';
22
22
  const CAPABILITY = 'unreal.project.extract';
23
23
  const MAX_PROFILE_BYTES = 64 * 1024;
24
24
  const MAX_PROJECT_ENTRIES = 100_000;
25
+ // Mirrors src/bridge/detect.ts's DIRECTORY_EXCLUDES (kept in sync by hand: this plugin script
26
+ // runs standalone via `spawn`, not through the built CLI, so it cannot import that module).
27
+ // Binaries/Intermediate/Saved/DerivedDataCache are large, regenerable Unreal build/cache
28
+ // directories that never contain a .uproject and were the reason a real project (hundreds of
29
+ // GB of Perforce-synced Engine + build caches) blew straight through the entry-count limit
30
+ // below without ever reaching the actual project file.
31
+ const PROJECT_WALK_EXCLUDES = new Set([
32
+ '.git', 'node_modules', 'Intermediate', 'Saved', 'DerivedDataCache', 'Library', '.godot', 'Binaries',
33
+ ]);
25
34
  const LOG_TAIL_BYTES = 16 * 1024;
26
35
  const FBX_HEADER_BYTES = 1024;
27
36
  const FBX_BINARY_HEADER = Buffer.from('Kaydara FBX Binary \0\x1a\0', 'binary');
@@ -230,7 +239,7 @@ function findProject(sourcePath) {
230
239
  const path = join(directory, entry.name);
231
240
  if (entry.isSymbolicLink()) fail(`Unreal project snapshot contains a symlink: ${path}`);
232
241
  if (entry.isDirectory()) {
233
- pending.push(path);
242
+ if (!PROJECT_WALK_EXCLUDES.has(entry.name)) pending.push(path);
234
243
  } else if (entry.isFile() && extname(entry.name).toLowerCase() === '.uproject') {
235
244
  projects.push(path);
236
245
  }
@@ -255,3 +255,20 @@ test('requires exactly one uproject in the immutable source snapshot', () => {
255
255
  assert.equal(result.status, 1);
256
256
  assert.match(result.stderr, /exactly one \.uproject file; found 2/);
257
257
  });
258
+
259
+ test('does not walk into Binaries/Intermediate/Saved/DerivedDataCache when finding the .uproject', () => {
260
+ const entry = fixture();
261
+ // A real Perforce-synced Unreal project's build/cache directories can hold hundreds of
262
+ // thousands of files; simulate that here with just enough entries (and a decoy .uproject
263
+ // inside one of them) to prove the walk skips them entirely rather than merely tolerating them.
264
+ for (const excluded of ['Binaries', 'Intermediate', 'Saved', 'DerivedDataCache']) {
265
+ const dir = join(entry.project, excluded, 'Nested');
266
+ mkdirSync(dir, { recursive: true });
267
+ for (let i = 0; i < 10; i += 1) writeFileSync(join(dir, `junk-${i}.bin`), '');
268
+ }
269
+ writeFileSync(join(entry.project, 'Intermediate', 'Decoy.uproject'), '{}');
270
+ const result = run(entry);
271
+ assert.equal(result.status, 0, result.stderr);
272
+ const response = JSON.parse(result.stdout);
273
+ assert.equal(response.artifacts[0].kind, 'format.fbx');
274
+ });
@@ -0,0 +1,57 @@
1
+ # HELIX Character Creator Female
2
+
3
+ Female mirror of `helix-character-creator-male/`: curated Unreal asset profiles for the
4
+ canonical HELIX Base Female and one representative wearable for every supported customizer
5
+ slot, scaffolded 2026-09-26 by the wearables-import research pass
6
+ (`/Users/jack/Developer/helix-workspace/run/open-alpha-qa/wearables-import/inventory.md`).
7
+
8
+ The profiles expect the `/HelixCharacterCreator` plugin mount, same as the male directory. Run
9
+ these through the packaged `helix.bridge.unreal` adapter: `--type character` for the base body/
10
+ face, `--type addon --input host=... --input addon=...` for wearables.
11
+
12
+ **Published compatibility host: Universal Item `bcafa7e1-9487-422d-8c08-e152b81f1f45`** ("Base
13
+ Female", creator `testcreator`, package v1.2.0, Face V1, published but not on the public
14
+ marketplace list — no marketplaceDistributions, same orphan-publish pattern as HELIX Starter and
15
+ Male Cargo Bottom, so it will not surface from a normal marketplace search).
16
+
17
+ Every `*.addon.json` profile is bound to that host twice, mirroring the male pattern exactly:
18
+ `hostItemId` selects `bcafa7e1-9487-422d-8c08-e152b81f1f45`, while `hostSha256` must equal the
19
+ bytes of the host GLB. **That GLB's sha256 was independently downloaded and re-hashed for this
20
+ scaffold** (not taken on trust from the reporting agent):
21
+
22
+ ```
23
+ curl -sL -o female-base.glb "https://eu.uni-items-web.dev.helix-cdn.com/universal-items/bcafa7e1-9487-422d-8c08-e152b81f1f45/bce4c302-7d1e-4360-99c1-d5c2972dfc6e/web/female-base.web.glb"
24
+ shasum -a 256 female-base.glb
25
+ # 8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760 (1,789,588 bytes, valid glTF-binary v2)
26
+ ```
27
+
28
+ **Known metadata bug, not fixed here:** the Universal Item API's own `sizeBytes` field for this
29
+ asset reports `753656`, which does not match the actual downloaded byte count (1,789,588) or a
30
+ real GLB parse. Use the sha256 above, measured from the actual bytes, not anything derived from
31
+ that stale field. Worth a bug report against whatever wrote that metadata.
32
+
33
+ Each `<slot>.json` here names one confirmed (`find`-verified, not guessed) representative female
34
+ asset per slot, picked from the full 220-item wearable survey in `inventory.md`:
35
+
36
+ | Slot | Representative | Unreal source |
37
+ | --- | --- | --- |
38
+ | top | Female Basic Tee | `Characters/Clothes/Woman/W_Basic_T_Shirt/W_Basic_T_Shirt` |
39
+ | bottom | Female Cargo Bottom | `Characters/Clothes/Woman/W_Cargo_Pants/W_Cargo_Pants` |
40
+ | footwear | Female Chunky Knit Sneakers | `Characters/Clothes/Woman/Chunky_Knit_Sneakers/SKM_W_Chunky_Knit_Sneakers` |
41
+ | gloves | Female NEO Arcane Heir Gloves | `Characters/Clothes/Woman/NEO_Arcane_Heir_Gloves/SKM_W_NEO_Arcane_Heir_Gloves` |
42
+ | mask | Female Cyberpunk ONI Mask | `Characters/Clothes/Woman/Cyberpunk_ONI_Mask/SKM_W_Cyberpunk_ONI_Mask` |
43
+ | headwear | Female Cap | `Characters/Clothes/Woman/W_Cap/W_Cap` |
44
+ | eyewear | Female Sport Sunglasses | `Characters/Clothes/Woman/Sport_Sunglasses/SKM_W_Sport_Sunglasses` |
45
+ | neck | Female Chain | `Characters/Clothes/Woman/W_Chain/SK_W_Chain` |
46
+ | back | Female Black Bag | `Characters/Clothes/Woman/W_BlackBag/W_BlackBag_skinning` |
47
+ | hair | Female Hair A1 | `Characters/Hairs/Female/Hair_A1/SK_Hair_A1_F` |
48
+ | outfit | Female Firefight Outfit | `Characters/Clothes/Woman/SK_W_Firefight_Outfit/SK_W_Firefight_Outfit_skinning` |
49
+
50
+ `female-cap.addon.json` carries the same `technical-fabric-ripstop` palette family forced on
51
+ `male-cap.addon.json`, for visual-review parity with the Palette Pilot batch — change it if the
52
+ pilot phase wants a different reviewed family for the female cap.
53
+
54
+ None of these files have been run through `bridge import` yet — they are unexecuted scaffolding
55
+ only, mirroring the shape of the male recipes exactly. The pilot phase should smoke-test
56
+ `all.json` first (13-asset batch, same shape as the male `all.json`), then work through the
57
+ remaining ~219 female/male to-do items in `inventory.md` following this same pattern.
@@ -0,0 +1,18 @@
1
+ {
2
+ "schemaVersion": "helix.bridge.unreal-asset-set/1",
3
+ "assets": [
4
+ { "slug": "base-female", "assetPath": "/HelixCharacterCreator/MetaHumans/Characters/F_Default/MC_Test/Body/SKM_MC_Female_Default_BodyMesh", "exportMorphTargets": true },
5
+ { "slug": "base-female-face", "assetPath": "/HelixCharacterCreator/MetaHumans/Characters/F_Default/MC_Test/Face/SKM_MC_Female_Default_FaceMesh", "exportMorphTargets": true },
6
+ { "slug": "female-basic-tee", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/W_Basic_T_Shirt/W_Basic_T_Shirt", "exportMorphTargets": true },
7
+ { "slug": "female-cargo-bottom", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/W_Cargo_Pants/W_Cargo_Pants", "exportMorphTargets": true },
8
+ { "slug": "female-chunky-knit-sneakers", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/Chunky_Knit_Sneakers/SKM_W_Chunky_Knit_Sneakers", "exportMorphTargets": true },
9
+ { "slug": "female-neo-arcane-heir-gloves", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/NEO_Arcane_Heir_Gloves/SKM_W_NEO_Arcane_Heir_Gloves", "exportMorphTargets": true },
10
+ { "slug": "female-cyberpunk-oni-mask", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/Cyberpunk_ONI_Mask/SKM_W_Cyberpunk_ONI_Mask", "exportMorphTargets": true },
11
+ { "slug": "female-cap", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/W_Cap/W_Cap", "exportMorphTargets": true },
12
+ { "slug": "female-sport-sunglasses", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/Sport_Sunglasses/SKM_W_Sport_Sunglasses", "exportMorphTargets": true },
13
+ { "slug": "female-chain", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/W_Chain/SK_W_Chain", "exportMorphTargets": true },
14
+ { "slug": "female-black-bag", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/W_BlackBag/W_BlackBag_skinning", "exportMorphTargets": true },
15
+ { "slug": "female-hair-a1", "assetPath": "/HelixCharacterCreator/Characters/Hairs/Female/Hair_A1/SK_Hair_A1_F", "exportMorphTargets": true },
16
+ { "slug": "female-firefight-outfit", "assetPath": "/HelixCharacterCreator/Characters/Clothes/Woman/SK_W_Firefight_Outfit/SK_W_Firefight_Outfit_skinning", "exportMorphTargets": true }
17
+ ]
18
+ }
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Black Bag","slug":"female-black-bag","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.back@1","socket":"back","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-black-bag","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/W_BlackBag/W_BlackBag_skinning","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"base-female-face","assetPath":"/HelixCharacterCreator/MetaHumans/Characters/F_Default/MC_Test/Face/SKM_MC_Female_Default_FaceMesh","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"base-female","assetPath":"/HelixCharacterCreator/MetaHumans/Characters/F_Default/MC_Test/Body/SKM_MC_Female_Default_BodyMesh","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Cargo Bottom","slug":"female-cargo-bottom","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.bottom@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-cargo-bottom","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/W_Cargo_Pants/W_Cargo_Pants","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Sport Sunglasses","slug":"female-sport-sunglasses","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.eyewear@1","socket":"head","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-sport-sunglasses","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/Sport_Sunglasses/SKM_W_Sport_Sunglasses","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Chunky Knit Sneakers","slug":"female-chunky-knit-sneakers","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.footwear@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-chunky-knit-sneakers","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/Chunky_Knit_Sneakers/SKM_W_Chunky_Knit_Sneakers","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female NEO Arcane Heir Gloves","slug":"female-neo-arcane-heir-gloves","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.gloves@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-neo-arcane-heir-gloves","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/NEO_Arcane_Heir_Gloves/SKM_W_NEO_Arcane_Heir_Gloves","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Hair A1","slug":"female-hair-a1","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.hair@1","socket":"head","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-hair-a1","assetPath":"/HelixCharacterCreator/Characters/Hairs/Female/Hair_A1/SK_Hair_A1_F","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Cap","slug":"female-cap","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.headwear@1","socket":"head","nodes":[],"palette":{"action":"forceFamilyId","familyId":"technical-fabric-ripstop","familyVersion":"1.0.0","presetId":"clean","overrides":{}},"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-cap","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/W_Cap/W_Cap","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Cyberpunk ONI Mask","slug":"female-cyberpunk-oni-mask","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.mask@1","socket":"head","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-cyberpunk-oni-mask","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/Cyberpunk_ONI_Mask/SKM_W_Cyberpunk_ONI_Mask","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Chain","slug":"female-chain","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.neck@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-chain","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/W_Chain/SK_W_Chain","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Firefight Outfit","slug":"female-firefight-outfit","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.outfit@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-firefight-outfit","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/SK_W_Firefight_Outfit/SK_W_Firefight_Outfit_skinning","exportMorphTargets":true}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge-character-addon-profile/1","title":"Female Basic Tee","slug":"female-basic-tee","hostItemId":"bcafa7e1-9487-422d-8c08-e152b81f1f45","hostSha256":"8e75dfafb8c1bed53fa49fca633195385f5890bed1adae4fb2d28d3dea5b8760","slotType":"character.top@1","socket":"chest","nodes":[],"ops":[]}
@@ -0,0 +1 @@
1
+ {"schemaVersion":"helix.bridge.unreal-asset/1","slug":"female-basic-tee","assetPath":"/HelixCharacterCreator/Characters/Clothes/Woman/W_Basic_T_Shirt/W_Basic_T_Shirt","exportMorphTargets":true}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@helix3/helix-cli",
3
- "version": "0.1.18-helix3.265",
3
+ "version": "0.1.18-helix3.266",
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",