@neocompose/cli 0.10.4 → 0.10.6

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/CHANGELOG.md CHANGED
@@ -1,5 +1,38 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.6] - 2026-07-26
4
+
5
+ ### Changed
6
+
7
+ - Derive the member id that carries one type argument of a constructed
8
+ generic, instead of reading it off the pulled record. `List<NeoAnimationChildOverride<NeoObjectBase>>`
9
+ binds its entry's parameter to a hidden member with no source syntax of its
10
+ own, so a workspace pushing without `neo/obj/` re-minted it under a
11
+ `__pending__:generic-argument:` id and created a second record. The id is now
12
+ a function of the slot that owns it -- the declaring member or class, plus
13
+ the parameter being bound -- which is the same fix `0.10.0` applied to entry
14
+ members. Argument members that already exist move onto the derivation
15
+ through P39's reconciler.
16
+
17
+ ## [0.10.5] - 2026-07-26
18
+
19
+ ### Changed
20
+
21
+ - Stop writing a second `@id` above every static and project-root initializer.
22
+ A member owns exactly one value row, so that row's identity is a function of
23
+ the declaration the annotation sat under and never needed to be authored.
24
+ `neo pull` now emits the binding without it, and lowering resolves the row
25
+ itself. An `@id` left in a file is accepted while it agrees with the row the
26
+ member already owns, so existing workspaces keep working until their next
27
+ pull; one that disagrees is rejected rather than pushing a create for a
28
+ second row.
29
+ - Derive the row id for a binding that does not have one yet, instead of
30
+ minting it. A member declared for the first time has no durable id to derive
31
+ from, so it carries a `__pending__:member-value:` token that resolves to the
32
+ derivation once the push assigns the member; the server re-derives it rather
33
+ than accepting the client's answer. Rows that already exist keep the ids
34
+ they were minted with -- P39 moves those onto the derivation.
35
+
3
36
  ## [0.10.4] - 2026-07-26
4
37
 
5
38
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -28860,6 +28860,22 @@ var init_entry_member_id = __esm({
28860
28860
  }
28861
28861
  });
28862
28862
 
28863
+ // ../src/models/members/generic-argument-member-id.ts
28864
+ function derivedGenericArgumentMemberId(parentRecordId, genericParamId) {
28865
+ return v5_default(
28866
+ `${encodeURIComponent(parentRecordId)}:${encodeURIComponent(genericParamId)}`,
28867
+ NEO_GENERIC_ARGUMENT_MEMBER_NAMESPACE
28868
+ );
28869
+ }
28870
+ var NEO_GENERIC_ARGUMENT_MEMBER_NAMESPACE;
28871
+ var init_generic_argument_member_id = __esm({
28872
+ "../src/models/members/generic-argument-member-id.ts"() {
28873
+ "use strict";
28874
+ init_dist_node();
28875
+ NEO_GENERIC_ARGUMENT_MEMBER_NAMESPACE = "6a4e1d38-9b52-5c0f-8d71-3e2a7f4b6c19";
28876
+ }
28877
+ });
28878
+
28863
28879
  // src/project-source/lower-members.ts
28864
28880
  function lowerClass(context, declaration) {
28865
28881
  const id2 = materializedId(declaration, "class", declaration.name);
@@ -29355,13 +29371,7 @@ function lowerFieldMember(context, ownerClass, declaration, id2, commonInput, ba
29355
29371
  classId,
29356
29372
  ...partial ? { partial: true } : {},
29357
29373
  schemaKeyOrder: base?.kind === "class" ? base.schemaKeyOrder : null,
29358
- classArguments: lowerClassArguments(
29359
- context,
29360
- ownerClass,
29361
- id2,
29362
- fieldType,
29363
- base
29364
- )
29374
+ classArguments: lowerClassArguments(context, ownerClass, id2, fieldType)
29365
29375
  };
29366
29376
  }
29367
29377
  throw new Error(
@@ -29921,7 +29931,7 @@ function genericParameterName(context, genericParamId) {
29921
29931
  }
29922
29932
  return "object";
29923
29933
  }
29924
- function lowerClassArguments(context, ownerClass, ownerMemberId, type, base) {
29934
+ function lowerClassArguments(context, ownerClass, ownerMemberId, type) {
29925
29935
  const classId = context.classIdsByName.get(type.name);
29926
29936
  if (!classId) return {};
29927
29937
  const parameters = [
@@ -29937,12 +29947,7 @@ function lowerClassArguments(context, ownerClass, ownerMemberId, type, base) {
29937
29947
  result[parameterId] = { kind: "generic", genericParamId: ownerParameter };
29938
29948
  continue;
29939
29949
  }
29940
- const pulledBinding = base?.kind === "class" ? base.classArguments[parameterId] : void 0;
29941
- const pulledMember = pulledBinding?.kind === "member" ? context.baseMembers.get(pulledBinding.memberId) : void 0;
29942
- const memberId = pulledBinding?.kind === "member" && pulledMember !== void 0 && JSON.stringify(manifestTypeForMember(context, pulledMember)) === JSON.stringify(argumentType) ? pulledBinding.memberId : pendingDerivedId(
29943
- "generic-argument",
29944
- `${ownerMemberId}:${parameterId}`
29945
- );
29950
+ const memberId = derivedGenericArgumentMemberId(ownerMemberId, parameterId);
29946
29951
  result[parameterId] = { kind: "member", memberId };
29947
29952
  lowerGenericArgument(
29948
29953
  context,
@@ -29962,7 +29967,6 @@ function lowerExtendsBindings(context, declaration, baseClassId, argumentsValue)
29962
29967
  ];
29963
29968
  const result = {};
29964
29969
  const declarationId = materializedId(declaration, "class", declaration.name);
29965
- const pulledClass = context.baseClasses.get(declarationId);
29966
29970
  for (const [[parameterName, parameterId], argumentType] of zip(
29967
29971
  parameters,
29968
29972
  argumentsValue
@@ -29972,11 +29976,7 @@ function lowerExtendsBindings(context, declaration, baseClassId, argumentsValue)
29972
29976
  result[parameterId] = { kind: "generic", genericParamId: local };
29973
29977
  continue;
29974
29978
  }
29975
- const pulledBinding = pulledClass?.extendsGenericBindings[parameterId];
29976
- const memberId = pulledBinding?.kind === "member" ? pulledBinding.memberId : pendingDerivedId(
29977
- "generic-argument",
29978
- `${declarationId}:${parameterId}`
29979
- );
29979
+ const memberId = derivedGenericArgumentMemberId(declarationId, parameterId);
29980
29980
  result[parameterId] = { kind: "member", memberId };
29981
29981
  lowerGenericArgument(
29982
29982
  context,
@@ -30100,9 +30100,6 @@ function resolveQualifiedMemberId(context, expression) {
30100
30100
  );
30101
30101
  return member === void 0 ? null : materializedId(member, "member", `${sourceClass.name}.${member.name}`);
30102
30102
  }
30103
- function pendingDerivedId(kind, ownerId) {
30104
- return `__pending__:${kind}:${encodeURIComponent(ownerId)}`;
30105
- }
30106
30103
  function hasAnnotation(annotations, name) {
30107
30104
  return annotation(annotations, name) !== void 0;
30108
30105
  }
@@ -30306,6 +30303,7 @@ var init_lower_members = __esm({
30306
30303
  init_lower_support();
30307
30304
  init_ui_action_source();
30308
30305
  init_entry_member_id();
30306
+ init_generic_argument_member_id();
30309
30307
  UNSET_LIST_COLUMN_WIDTH = -1;
30310
30308
  primitiveMemberKinds = /* @__PURE__ */ new Set([
30311
30309
  "null",
@@ -35770,7 +35768,7 @@ function worldAnimationChildOverrideBindingMemberId(classId) {
35770
35768
  WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE
35771
35769
  );
35772
35770
  }
35773
- var WORLD_SORTING_LAYERS_MEMBER_ID, WORLD_SORTING_LAYER_ENTRY_MEMBER_ID, WORLD_SORTING_LAYER_NAME_MEMBER_ID, WORLD_LAYER_NAME_MEMBER_ID, WORLD_LAYER_SORTING_LAYER_MEMBER_ID, WORLD_LAYER_SORTING_ORDER_MEMBER_ID, WORLD_SORTING_ORDER_MIN, WORLD_SORTING_ORDER_MAX, WORLD_GRID_CHILDREN_MEMBER_ID, WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID, WORLD_ASSET_NAME_MEMBER_ID, WORLD_TILE_SPRITE_MEMBER_ID, WORLD_OBJECT_BASE_NAME_MEMBER_ID, WORLD_OBJECT_BASE_POSITION_MEMBER_ID, WORLD_OBJECT_BASE_SIZE_MEMBER_ID, WORLD_SPRITE_OBJECT_NAME_MEMBER_ID, WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID, WORLD_OBJECT_CHILDREN_MEMBER_ID, WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_COLLIDER_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID, WORLD_TILE_INSTANCE_CELL_MEMBER_ID, WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID, WORLD_TILE_SMART_TILE_SCHEMA_KEY, WORLD_TILE_SMART_TILE_MEMBER_ID, WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULES_SCHEMA_KEY, WORLD_SMART_TILE_RULES_MEMBER_ID, WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY, WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY, WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID, WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULE_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY, WORLD_SMART_TILE_RULE_TRANSFORM_MEMBER_ID, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CELL_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CONDITION_MEMBER_ID, WORLD_SMART_TILE_CONDITION_ENUM_ID, WORLD_SMART_TILE_OUTPUT_ENUM_ID, WORLD_SMART_TILE_COLLIDER_ENUM_ID, WORLD_SMART_TILE_TRANSFORM_ENUM_ID, WORLD_SMART_TILE_CONDITION_THIS_OPTION_ID, WORLD_SMART_TILE_OUTPUT_SINGLE_OPTION_ID, WORLD_SMART_TILE_COLLIDER_SPRITE_OPTION_ID, WORLD_SMART_TILE_TRANSFORM_FIXED_OPTION_ID, WORLD_ANIMATION_CLIP_TARGET_PARAM_ID, WORLD_ANIMATION_FRAME_TARGET_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE, WORLD_ANIMATION_CLIP_FPS_MEMBER_ID, WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID, WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_START_FRAME_MEMBER_ID, WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID, WORLD_SYSTEM_CLASS_DEFINITIONS, ANIMATION_WORLD_KINDS;
35771
+ var WORLD_SORTING_LAYERS_MEMBER_ID, WORLD_SORTING_LAYER_ENTRY_MEMBER_ID, WORLD_SORTING_LAYER_NAME_MEMBER_ID, WORLD_LAYER_NAME_MEMBER_ID, WORLD_LAYER_SORTING_LAYER_MEMBER_ID, WORLD_LAYER_SORTING_ORDER_MEMBER_ID, WORLD_SORTING_ORDER_MIN, WORLD_SORTING_ORDER_MAX, WORLD_GRID_CHILDREN_MEMBER_ID, WORLD_GRID_CHILDREN_ENTRY_MEMBER_ID, WORLD_ASSET_NAME_MEMBER_ID, WORLD_TILE_SPRITE_MEMBER_ID, WORLD_OBJECT_BASE_NAME_MEMBER_ID, WORLD_OBJECT_BASE_POSITION_MEMBER_ID, WORLD_OBJECT_BASE_SIZE_MEMBER_ID, WORLD_SPRITE_OBJECT_NAME_MEMBER_ID, WORLD_SPRITE_OBJECT_SPRITE_MEMBER_ID, WORLD_OBJECT_CHILDREN_MEMBER_ID, WORLD_OBJECT_CHILDREN_ENTRY_MEMBER_ID, WORLD_OBJECT_COLLIDER_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILES_ENTRY_MEMBER_ID, WORLD_OBJECT_PLACEMENT_TILE_CELL_MEMBER_ID, WORLD_TILE_INSTANCE_CELL_MEMBER_ID, WORLD_TILE_LAYER_LINK_LAYER_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILES_MEMBER_ID, WORLD_TILE_LAYER_LINK_TILE_ENTRY_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_LAYER_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECTS_MEMBER_ID, WORLD_OBJECT_LAYER_LINK_OBJECT_ENTRY_MEMBER_ID, WORLD_TILE_SMART_TILE_SCHEMA_KEY, WORLD_TILE_SMART_TILE_MEMBER_ID, WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_DEFAULT_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULES_SCHEMA_KEY, WORLD_SMART_TILE_RULES_MEMBER_ID, WORLD_SMART_TILE_RULES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY, WORLD_SMART_TILE_RULE_NEIGHBORS_MEMBER_ID, WORLD_SMART_TILE_RULE_NEIGHBORS_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY, WORLD_SMART_TILE_RULE_SPRITES_MEMBER_ID, WORLD_SMART_TILE_RULE_SPRITES_ENTRY_MEMBER_ID, WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY, WORLD_SMART_TILE_RULE_OUTPUT_MEMBER_ID, WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY, WORLD_SMART_TILE_RULE_COLLIDER_MEMBER_ID, WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY, WORLD_SMART_TILE_RULE_TRANSFORM_MEMBER_ID, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY, WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CELL_MEMBER_ID, WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY, WORLD_SMART_TILE_NEIGHBOR_CONDITION_MEMBER_ID, WORLD_SMART_TILE_CONDITION_ENUM_ID, WORLD_SMART_TILE_OUTPUT_ENUM_ID, WORLD_SMART_TILE_COLLIDER_ENUM_ID, WORLD_SMART_TILE_TRANSFORM_ENUM_ID, WORLD_SMART_TILE_CONDITION_THIS_OPTION_ID, WORLD_SMART_TILE_OUTPUT_SINGLE_OPTION_ID, WORLD_SMART_TILE_COLLIDER_SPRITE_OPTION_ID, WORLD_SMART_TILE_TRANSFORM_FIXED_OPTION_ID, WORLD_ANIMATION_CLIP_TARGET_PARAM_ID, WORLD_ANIMATION_FRAME_TARGET_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAME, WORLD_ANIMATION_CHILD_OVERRIDE_BINDING_MEMBER_NAMESPACE, WORLD_ANIMATION_CLIP_FPS_MEMBER_ID, WORLD_ANIMATION_CLIP_DURATION_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_MEMBER_ID, WORLD_ANIMATION_CLIP_FRAMES_ENTRY_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_MEMBER_ID, WORLD_ANIMATION_CLIP_TRACKS_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_INDEX_MEMBER_ID, WORLD_ANIMATION_FRAME_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_MEMBER_ID, WORLD_ANIMATION_FRAME_ACTIONS_ENTRY_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_OVERRIDE_OVERRIDES_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID, WORLD_ANIMATION_CHILD_TRACK_START_FRAME_MEMBER_ID, WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID, WORLD_SYSTEM_CLASS_DEFINITIONS, WORLD_SYSTEM_ANIMATION_KINDS, WORLD_SYSTEM_ALL_KINDS, WORLD_SYSTEM_SCHEMA_FIELD_SITES_BY_MEMBER_ID;
35774
35772
  var init_world_system_classes = __esm({
35775
35773
  "../src/models/classes/world-system-classes.ts"() {
35776
35774
  "use strict";
@@ -35779,6 +35777,7 @@ var init_world_system_classes = __esm({
35779
35777
  init_core();
35780
35778
  init_dist_node();
35781
35779
  init_entry_member_id();
35780
+ init_generic_argument_member_id();
35782
35781
  WORLD_SORTING_LAYERS_MEMBER_ID = "7ec79ef8-a216-407f-8886-9f770bc9895b";
35783
35782
  WORLD_SORTING_LAYER_ENTRY_MEMBER_ID = derivedEntryMemberId(
35784
35783
  WORLD_SORTING_LAYERS_MEMBER_ID
@@ -35880,7 +35879,10 @@ var init_world_system_classes = __esm({
35880
35879
  WORLD_ANIMATION_CHILD_TRACK_CHILD_MEMBER_ID = "29abc85e-2d38-4cef-a200-88915d176d06";
35881
35880
  WORLD_ANIMATION_CHILD_TRACK_CLIP_KEY_MEMBER_ID = "2c816624-0281-46d3-9ed5-d20bd43519f4";
35882
35881
  WORLD_ANIMATION_CHILD_TRACK_START_FRAME_MEMBER_ID = "5af60692-74a0-45ea-a9ba-747854989b2a";
35883
- WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID = "45d30ad2-e066-4017-8982-ec9c92655b19";
35882
+ WORLD_ANIMATION_OBJECT_BASE_BINDING_MEMBER_ID = derivedGenericArgumentMemberId(
35883
+ WORLD_ANIMATION_FRAME_CHILD_OVERRIDES_ENTRY_MEMBER_ID,
35884
+ WORLD_ANIMATION_CHILD_OVERRIDE_ENTRY_PARAM_ID
35885
+ );
35884
35886
  WORLD_SYSTEM_CLASS_DEFINITIONS = [
35885
35887
  {
35886
35888
  name: "NeoTileGrid",
@@ -36090,10 +36092,8 @@ var init_world_system_classes = __esm({
36090
36092
  {
36091
36093
  memberId: "ec5b5d5e-7053-4378-87d1-9cceec30ff1a",
36092
36094
  memberKind: "vector2",
36093
- // Offsets share Unity's BoxCollider2D model: cells from the
36094
- // object's origin-cell corner, so (0.5, 0.5) centers a 1×1
36095
- // collider on the origin cell.
36096
36095
  defaultValue: { x: 0.5, y: 0.5 },
36096
+ docsText: "Offset from the object's origin-cell corner, measured in cells, matching Unity's BoxCollider2D model. (0.5, 0.5) centers a 1x1 collider on the origin cell.",
36097
36097
  name: "Offset",
36098
36098
  required: false,
36099
36099
  schemaKey: "offset"
@@ -36667,12 +36667,25 @@ var init_world_system_classes = __esm({
36667
36667
  worldKind: NeoWorldSystemClassKind.AnimationChildTrack
36668
36668
  }
36669
36669
  ];
36670
- ANIMATION_WORLD_KINDS = /* @__PURE__ */ new Set([
36670
+ WORLD_SYSTEM_ANIMATION_KINDS = /* @__PURE__ */ new Set([
36671
36671
  NeoWorldSystemClassKind.AnimationClip,
36672
36672
  NeoWorldSystemClassKind.AnimationFrame,
36673
36673
  NeoWorldSystemClassKind.AnimationChildOverride,
36674
36674
  NeoWorldSystemClassKind.AnimationChildTrack
36675
36675
  ]);
36676
+ WORLD_SYSTEM_ALL_KINDS = new Set(
36677
+ WORLD_SYSTEM_CLASS_DEFINITIONS.map((definition2) => definition2.worldKind)
36678
+ );
36679
+ WORLD_SYSTEM_SCHEMA_FIELD_SITES_BY_MEMBER_ID = new Map(
36680
+ WORLD_SYSTEM_CLASS_DEFINITIONS.flatMap(
36681
+ (definition2) => (definition2.schemaFields ?? []).map(
36682
+ (field) => [
36683
+ field.memberId,
36684
+ { worldKind: definition2.worldKind, schemaKey: field.schemaKey }
36685
+ ]
36686
+ )
36687
+ )
36688
+ );
36676
36689
  }
36677
36690
  });
36678
36691
 
@@ -42179,6 +42192,27 @@ var init_dialogue_sources = __esm({
42179
42192
  }
42180
42193
  });
42181
42194
 
42195
+ // ../src/models/members/member-value-id.ts
42196
+ function derivedMemberValueId(memberId) {
42197
+ return v5_default(memberId, NEO_MEMBER_VALUE_NAMESPACE);
42198
+ }
42199
+ function pendingMemberValueId(pendingMemberId) {
42200
+ return `${PENDING_MEMBER_VALUE_PREFIX}${encodeURIComponent(pendingMemberId)}`;
42201
+ }
42202
+ function pendingMemberValueMemberId(token) {
42203
+ if (!token.startsWith(PENDING_MEMBER_VALUE_PREFIX)) return null;
42204
+ return decodeURIComponent(token.slice(PENDING_MEMBER_VALUE_PREFIX.length));
42205
+ }
42206
+ var NEO_MEMBER_VALUE_NAMESPACE, PENDING_MEMBER_VALUE_PREFIX;
42207
+ var init_member_value_id = __esm({
42208
+ "../src/models/members/member-value-id.ts"() {
42209
+ "use strict";
42210
+ init_dist_node();
42211
+ NEO_MEMBER_VALUE_NAMESPACE = "7f2b9c14-58d6-5a07-b3e1-4c9d0a6f8b25";
42212
+ PENDING_MEMBER_VALUE_PREFIX = "__pending__:member-value:";
42213
+ }
42214
+ });
42215
+
42182
42216
  // src/project-source/value-sources.ts
42183
42217
  function inferredGenericClassBinding(classId) {
42184
42218
  return `${INFERRED_GENERIC_CLASS_PREFIX}${classId}`;
@@ -42240,7 +42274,10 @@ function emitStoredValueBindingSourcesV4(records2, memberIds, options) {
42240
42274
  initializers.set(
42241
42275
  memberId,
42242
42276
  emitValue(context, member, member.valueId, {
42243
- exposeIdentity: true,
42277
+ definitionSite: true,
42278
+ // The row is `derivedMemberValueId(memberId)` and the declaration
42279
+ // above it already carries `@id(memberId)`.
42280
+ writeIdentity: false,
42244
42281
  targetTyped: options.targetTypedRoot === true,
42245
42282
  visited
42246
42283
  })
@@ -42689,8 +42726,8 @@ function lowerStoredBinding(context, binding, memberValueIds, seeds) {
42689
42726
  preserveReboundValue(context, currentValueId, referenced, binding);
42690
42727
  return;
42691
42728
  }
42692
- const annotatedId = annotatedValue(expression).id;
42693
- const valueId = annotatedId ?? currentValueId ?? pendingValueId(binding, binding.label);
42729
+ const valueId = currentValueId ?? memberValueId(binding.memberId);
42730
+ assertAuthoredBindingIdMatches(expression, binding, valueId);
42694
42731
  memberValueIds.set(binding.memberId, valueId);
42695
42732
  if (currentValueId === valueId) {
42696
42733
  const existingReconstructedKeys = new Set(context.reconstructed.keys());
@@ -42738,6 +42775,16 @@ function lowerStoredBinding(context, binding, memberValueIds, seeds) {
42738
42775
  const seed = lowerStaticSeed(context, member, expression, binding, valueId);
42739
42776
  seeds.set(binding.memberId, { ...seed, valueId });
42740
42777
  }
42778
+ function assertAuthoredBindingIdMatches(expression, binding, valueId) {
42779
+ const authoredId = annotatedValue(expression).id;
42780
+ if (authoredId === null || authoredId === valueId) return;
42781
+ throw new Error(
42782
+ `Binding ${binding.label} is annotated with value id ${authoredId}, but the member owns value ${valueId}. Remove the @id \u2014 \`neo pull\` rewrites this file without it.`
42783
+ );
42784
+ }
42785
+ function memberValueId(memberId) {
42786
+ return isPendingId(memberId) ? pendingMemberValueId(memberId) : derivedMemberValueId(memberId);
42787
+ }
42741
42788
  function reconstructedOrStateValue(context, valueId) {
42742
42789
  return context.reconstructed.get(`value:${valueId}`)?.fileFields ?? valueBase(context, valueId);
42743
42790
  }
@@ -44429,7 +44476,7 @@ function projectMainLocaleFromState(state) {
44429
44476
  }
44430
44477
  function emitValue(context, member, valueId, options) {
44431
44478
  const externalSymbol = context.symbolsByValueId.get(valueId);
44432
- if (!options.exposeIdentity && externalSymbol !== void 0) {
44479
+ if (!options.definitionSite && externalSymbol !== void 0) {
44433
44480
  return externalSymbol;
44434
44481
  }
44435
44482
  if (options.visited.has(valueId)) {
@@ -44453,7 +44500,7 @@ function emitValue(context, member, valueId, options) {
44453
44500
  options.targetTyped ?? false,
44454
44501
  options.environment
44455
44502
  );
44456
- const prefix = options.exposeIdentity ? `@id(${quote4(valueId)})
44503
+ const prefix = options.writeIdentity ? `@id(${quote4(valueId)})
44457
44504
  ` : "";
44458
44505
  return `${prefix}${expression}`;
44459
44506
  }
@@ -44537,7 +44584,8 @@ function classValue(context, member, value, visited, targetTyped, outerEnvironme
44537
44584
  fields.push(
44538
44585
  `${key} = ${emitValue(context, emittedChildMember, childId, {
44539
44586
  environment,
44540
- exposeIdentity: !context.symbolsByValueId.has(childId) && context.referencedValueIds.has(childId),
44587
+ definitionSite: !context.symbolsByValueId.has(childId),
44588
+ writeIdentity: !context.symbolsByValueId.has(childId) && context.referencedValueIds.has(childId),
44541
44589
  visited
44542
44590
  })}`
44543
44591
  );
@@ -44845,7 +44893,8 @@ ${ids.map(
44845
44893
  (id2) => indentNeoSourceNonEmptyLines(
44846
44894
  emitValue(context, entryMember, id2, {
44847
44895
  environment,
44848
- exposeIdentity: context.symbolsByValueId.get(id2) === void 0,
44896
+ definitionSite: context.symbolsByValueId.get(id2) === void 0,
44897
+ writeIdentity: context.symbolsByValueId.get(id2) === void 0,
44849
44898
  visited
44850
44899
  }),
44851
44900
  2
@@ -44871,7 +44920,8 @@ ${entries.flatMap(
44871
44920
  indentNeoSourceNonEmptyLines(
44872
44921
  `${quote4(key)}: ${emitValue(context, entryMember, id2, {
44873
44922
  environment,
44874
- exposeIdentity: !context.symbolsByValueId.has(id2) && context.referencedValueIds.has(id2),
44923
+ definitionSite: !context.symbolsByValueId.has(id2),
44924
+ writeIdentity: !context.symbolsByValueId.has(id2) && context.referencedValueIds.has(id2),
44875
44925
  visited
44876
44926
  })}`,
44877
44927
  2
@@ -45088,6 +45138,7 @@ var init_value_sources = __esm({
45088
45138
  init_lower_members();
45089
45139
  init_source_format();
45090
45140
  init_world_system_classes();
45141
+ init_member_value_id();
45091
45142
  INFERRED_GENERIC_CLASS_PREFIX = "__inferred_class__:";
45092
45143
  MEMBER_KIND_DICTIONARY = 5;
45093
45144
  MEMBER_KIND_LIST = 6;
@@ -45217,7 +45268,8 @@ function validateProjectRootEnvelopeV4(state, analysis) {
45217
45268
  const expression = parseExpression(slot.initializer);
45218
45269
  const annotation2 = expression.kind === "annotated" ? expression.annotations.find((entry) => entry.name === "id") : void 0;
45219
45270
  const authoredValueId = annotation2?.args[0];
45220
- if (authoredValueId?.kind !== "litString" || authoredValueId.value !== memberData.valueId) {
45271
+ if (authoredValueId === void 0) return;
45272
+ if (authoredValueId.kind !== "litString" || authoredValueId.value !== memberData.valueId) {
45221
45273
  throw new Error(
45222
45274
  `Root value root.${expected.name} must retain stable value id ${memberData.valueId}.`
45223
45275
  );
@@ -66552,6 +66604,13 @@ function assignPendingIds(changes, staticValueSeeds, reconstructed3) {
66552
66604
  const assign = (pendingId2) => {
66553
66605
  const existing = assigned.get(pendingId2);
66554
66606
  if (existing !== void 0) return existing;
66607
+ const memberLocator = pendingMemberValueMemberId(pendingId2);
66608
+ if (memberLocator !== null) {
66609
+ const memberId = isPendingId(memberLocator) ? assign(memberLocator) : memberLocator;
66610
+ const derived = derivedMemberValueId(memberId);
66611
+ assigned.set(pendingId2, derived);
66612
+ return derived;
66613
+ }
66555
66614
  const fresh = randomUUID5();
66556
66615
  assigned.set(pendingId2, fresh);
66557
66616
  return fresh;
@@ -68569,6 +68628,7 @@ var init_push = __esm({
68569
68628
  init_project_documents();
68570
68629
  init_workspace_status();
68571
68630
  init_lower_support();
68631
+ init_member_value_id();
68572
68632
  init_source_diagnostics();
68573
68633
  init_projection();
68574
68634
  init_project_file_push();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.10.4",
3
+ "version": "0.10.6",
4
4
  "description": "Neo Compose native project-source CLI with bidirectional sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",