@neocompose/cli 0.53.7 → 0.54.1

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,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.54.1] - 2026-09-22
4
+
5
+ - Variants with the same name in different folders, such as `Oak/Day1` and `Ash/Day1`, keep their own nested rows on push. Adding overrides to one of them no longer fails with "claims identity …, which another value created by this push already owns."
6
+
7
+ ## [0.54.0] - 2026-09-22
8
+
9
+ - `NeoSortingGroup` has a `SortPoint`: where the group sorts along the transparency sort axis, as a cell offset from the object's origin-cell corner. It defaults to `(0.5, 0)`, the bottom center of the origin cell. Generated Unity classes implement `INeoSortingGroup.SortPoint`, which requires Neo Compose SDK 0.40.0.
10
+
3
11
  ## [0.53.7] - 2026-09-22
4
12
 
5
13
  - Adding a value under a row that stores packed children, such as a new list on an item whose sprite is packed, keeps those children readable in `neo test`, `neo status`, and `neo push --dry-run`. A constructed instance replayed from that row used to receive the child's id instead of its value and fail with "NSFunction argument 1 does not match its declared runtime type."
package/dist/neo.mjs CHANGED
@@ -9164,15 +9164,15 @@ var init_strict_resolver = __esm({
9164
9164
  symbol
9165
9165
  };
9166
9166
  }
9167
- const variantPath = this.resolveVariantPath(receiverAst, name, scope, pos);
9168
- if (variantPath !== null) {
9167
+ const variantPath2 = this.resolveVariantPath(receiverAst, name, scope, pos);
9168
+ if (variantPath2 !== null) {
9169
9169
  if (optional2) {
9170
9170
  throw new CompileError(
9171
9171
  "Optional chaining is not valid on a variant path.",
9172
9172
  pos
9173
9173
  );
9174
9174
  }
9175
- return variantPath;
9175
+ return variantPath2;
9176
9176
  }
9177
9177
  if (receiverAst.kind === "ident" && !scope.lookup(receiverAst.name)) {
9178
9178
  if (receiverAst.name === "SpriteInfo" && name === "Empty") {
@@ -29523,13 +29523,13 @@ function activeNamedArgument(text, position) {
29523
29523
  return /([A-Za-z_][A-Za-z0-9_]*)\s*:\s*\.[A-Za-z0-9_]*$/.exec(prefix)?.[1] ?? null;
29524
29524
  }
29525
29525
  function projectHover(analysis, document, position) {
29526
- const variantPath = projectVariantPathSymbolAt(analysis, document, position);
29527
- if (variantPath) {
29526
+ const variantPath2 = projectVariantPathSymbolAt(analysis, document, position);
29527
+ if (variantPath2) {
29528
29528
  return {
29529
- range: variantPath.token.range,
29529
+ range: variantPath2.token.range,
29530
29530
  markdown: projectVariantHoverMarkdown(
29531
- variantPath.entry,
29532
- variantPath.entry.declaration.type.name === NEO_VARIANT_FOLDER_TYPE_NAME
29531
+ variantPath2.entry,
29532
+ variantPath2.entry.declaration.type.name === NEO_VARIANT_FOLDER_TYPE_NAME
29533
29533
  )
29534
29534
  };
29535
29535
  }
@@ -29629,12 +29629,12 @@ Construct with \`new(${parameters})\` \u2014 this class declares a required cons
29629
29629
  ${lines.join("\n\n")}`;
29630
29630
  }
29631
29631
  function projectDefinition(analysis, document, position) {
29632
- const variantPath = projectVariantPathSymbolAt(analysis, document, position);
29633
- if (variantPath) {
29632
+ const variantPath2 = projectVariantPathSymbolAt(analysis, document, position);
29633
+ if (variantPath2) {
29634
29634
  return [
29635
29635
  {
29636
- uri: variantPath.entry.uri,
29637
- range: variantPath.entry.declaration.nameRange
29636
+ uri: variantPath2.entry.uri,
29637
+ range: variantPath2.entry.declaration.nameRange
29638
29638
  }
29639
29639
  ];
29640
29640
  }
@@ -50032,6 +50032,14 @@ var init_world_system_classes_generated = __esm({
50032
50032
  docsText: "Sort this group against the scene root, ignoring any enclosing sorting group. Maps to SortingGroup.sortAtRoot.",
50033
50033
  requirement: 1 /* Required */,
50034
50034
  schemaKey: "SortAtRoot"
50035
+ },
50036
+ {
50037
+ memberId: "system_c5d39776-03d6-4673-84bb-16ba81ae9e0a",
50038
+ memberKind: "vector2",
50039
+ defaultValue: { x: 0.5, y: 0 },
50040
+ docsText: "Where this group sorts along the camera's transparency sort axis, as an offset from the object's origin-cell corner in cells, like NeoCollider.Offset. It is the group's pivot: put it where the art meets the ground. Moving it never moves the art.",
50041
+ requirement: 1 /* Required */,
50042
+ schemaKey: "SortPoint"
50035
50043
  }
50036
50044
  ],
50037
50045
  worldKind: "sortingGroup"
@@ -50093,7 +50101,7 @@ var init_world_system_classes_generated = __esm({
50093
50101
  memberId: "system_6f32f1f2-83ea-42fc-8647-34ed0946b7f1",
50094
50102
  memberKind: "int",
50095
50103
  defaultValue: null,
50096
- docsText: "Nudges this sprite's draw order within its object. Added to the order derived from the object's layer group \u2014 it does not replace it. Leave unset for the default order.",
50104
+ docsText: "Added to the object layer's sorting order; it does not replace it. The result competes with every renderer in the sorting layer, or in the enclosing sorting group, and among equal orders the renderer lower on screen draws in front. Leave unset to use the layer's order.",
50097
50105
  minValue: -32768,
50098
50106
  maxValue: 32767,
50099
50107
  schemaKey: "SortingOrder"
@@ -111848,6 +111856,9 @@ function variantValueBindingsV4(manifest, analysis) {
111848
111856
  const classNames = new Map(
111849
111857
  manifest.classes.map((entry) => [entry.id, entry.name])
111850
111858
  );
111859
+ const folderPaths = new Map(
111860
+ manifest.variantFolders.map((folder) => [folder.id, folder.path])
111861
+ );
111851
111862
  return variantGlobals(analysis).flatMap((global) => {
111852
111863
  const variant2 = variantsById.get(
111853
111864
  variantRecordId(global, NEO_VARIANT_TYPE_NAME)
@@ -111869,11 +111880,31 @@ function variantValueBindingsV4(manifest, analysis) {
111869
111880
  valueId: variant2.valueId,
111870
111881
  initializer: global.initializer,
111871
111882
  source: global.source,
111872
- label: `${requiredClassName2(classNames, variant2.classId)}.${NEO_VARIANT_SCOPE_NAME}.${variant2.name}`
111883
+ label: variantLabel(
111884
+ requiredClassName2(classNames, variant2.classId),
111885
+ variant2,
111886
+ folderPaths
111887
+ )
111873
111888
  }
111874
111889
  ];
111875
111890
  });
111876
111891
  }
111892
+ function variantLabel(className, variant2, folderPaths) {
111893
+ if (variant2.folderId === null) {
111894
+ return variantPath(className, null, variant2.name);
111895
+ }
111896
+ const folderPath3 = folderPaths.get(variant2.folderId);
111897
+ if (folderPath3 === void 0) {
111898
+ throw new Error(
111899
+ `Variant ${variant2.name} sits in folder ${JSON.stringify(variant2.folderId)}, which this push does not declare.`
111900
+ );
111901
+ }
111902
+ return variantPath(className, folderPath3, variant2.name);
111903
+ }
111904
+ function variantPath(className, folderPath3, name) {
111905
+ const scope = folderPath3 === null || folderPath3 === "" ? `${className}.${NEO_VARIANT_SCOPE_NAME}` : `${className}.${NEO_VARIANT_SCOPE_NAME}.${folderPath3.split(NEO_VARIANT_FOLDER_PATH_SEPARATOR).join(".")}`;
111906
+ return `${scope}.${name}`;
111907
+ }
111877
111908
  function requiredClassName2(classNames, classId) {
111878
111909
  const name = classNames.get(classId);
111879
111910
  if (name === void 0) {
@@ -112005,8 +112036,7 @@ function buildVariantPathIndexV4(classIdsByName, analysis) {
112005
112036
  annotationsForFolderLookup(global.annotations)
112006
112037
  );
112007
112038
  const path = symbol === null ? null : foldersBySymbol.get(folderSymbolKey(className, symbol)) ?? null;
112008
- const scope = path === null || path === "" ? `${className}.${NEO_VARIANT_SCOPE_NAME}` : `${className}.${NEO_VARIANT_SCOPE_NAME}.${path.split(NEO_VARIANT_FOLDER_PATH_SEPARATOR).join(".")}`;
112009
- index.set(`${scope}.${global.name}`, {
112039
+ index.set(variantPath(className, path, global.name), {
112010
112040
  classId,
112011
112041
  variantId: variantRecordId(global, global.type.name),
112012
112042
  valueClassId: global.type.name === NEO_LOOKUP_VARIANT_TYPE_NAME ? classIdsByName.get(valueClassName(global)) ?? null : null
@@ -138836,7 +138866,7 @@ var init_registry2 = __esm({
138836
138866
  "schema-contract/registry.mjs"() {
138837
138867
  "use strict";
138838
138868
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
138839
- cliVersion: "0.53.7",
138869
+ cliVersion: "0.54.1",
138840
138870
  projectFileUploadBatchSize: 32,
138841
138871
  documentRecords: {
138842
138872
  member: {
@@ -146657,7 +146687,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
146657
146687
  async function main() {
146658
146688
  const args = parseArgs(process.argv.slice(2));
146659
146689
  if (args.command === "--version") {
146660
- console.log("0.53.7");
146690
+ console.log("0.54.1");
146661
146691
  return;
146662
146692
  }
146663
146693
  if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.53.7",
3
+ "version": "0.54.1",
4
4
  "description": "Neo Compose native project-source CLI with bidirectional sync.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -9,7 +9,7 @@ description: >-
9
9
  `@neocompose/cli` or `node cli/bin/neo.mjs` in the neo-compose repository.
10
10
  ---
11
11
 
12
- <!-- reviewed-through-cli: 0.53.7 -->
12
+ <!-- reviewed-through-cli: 0.54.1 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -209,11 +209,16 @@ class Tree : NeoObject {
209
209
  ```
210
210
 
211
211
  Presence of a non-null group makes the object and descendants sort as one unit.
212
- `SortAtRoot` hoists a nested group against the scene root.
213
-
214
- `NeoSpriteObject` exposes `FlipX`, `FlipY`, `MaskInteraction`, and optional
215
- `SortingOrder`. Treat `SortingOrder` as an offset added to the order derived
216
- from layer, placement, and composition; it is not an absolute replacement.
212
+ `SortAtRoot` hoists a nested group against the scene root. `SortPoint` is the
213
+ point the group Y-sorts at, in cells from the object's origin-cell corner
214
+ (default `(0.5, 0)`, the origin cell's bottom center). Moving it never moves
215
+ art. Set it per class, variant, or animation frame, like any other value.
216
+
217
+ Objects sort by sorting layer, then order in layer, then sort-point Y (lower
218
+ draws in front), then document order. `NeoSpriteObject` exposes `FlipX`,
219
+ `FlipY`, `MaskInteraction`, and optional `SortingOrder`. Treat `SortingOrder`
220
+ as an offset added to the layer's sorting order; it is not an absolute
221
+ replacement.
217
222
 
218
223
  Use `NeoObjectBase.Enabled` to hide an object and its entire subtree without
219
224
  removing its authored `Children` row. A disabled object is not rendered or
@@ -97,7 +97,7 @@ wrappers.
97
97
  The marker near the top of `SKILL.md` must exactly match the package version:
98
98
 
99
99
  ```html
100
- <!-- reviewed-through-cli: 0.53.7 -->
100
+ <!-- reviewed-through-cli: 0.54.1 -->
101
101
  ```
102
102
 
103
103
  The quoted version above is checked too, so this instruction cannot go stale