@neocompose/cli 0.70.3 → 0.70.4

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,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.70.4] - 2026-10-06
4
+
5
+ - `neo test <file>` runs in a workspace reached through a symlink, such as one under `/tmp` or `/var` on macOS or a symlinked dev folder. Before, every explicit selector failed with "resolves outside the workspace through a symlink", because the selector's real path was compared with the unresolved workspace root. A selector that really does leave the workspace through a symlink still fails.
6
+ - `neo doctor` accepts a VS Code analysis cache written before 0.70.3. 0.70.3 required the new initializer location on every configuration global, so doctor reported an older cache as incompatible until `neo status` or `neo pull` rewrote it.
7
+
3
8
  ## [0.70.3] - 2026-10-06
4
9
 
5
10
  - `neo export` reads each project file from the path its declaration names. Moving a file to another folder without renaming it changes no record, so nothing is pushed. Before, the export kept reading the old path and failed with "missing". A new file dropped at the old path is now discovered as a new file, and `neo resolve` writes a conflicted file to its moved path.
package/dist/neo.mjs CHANGED
@@ -31614,16 +31614,12 @@ function assertEnum(value, path) {
31614
31614
  }
31615
31615
  function assertGlobal(value, path) {
31616
31616
  const global = record(value, path);
31617
- exactKeys(global, path, [
31618
- "id",
31619
- "state",
31620
- "source",
31621
- "name",
31622
- "type",
31623
- "annotations",
31624
- "initializer",
31625
- "initializerSource"
31626
- ]);
31617
+ exactKeysWithOptional(
31618
+ global,
31619
+ path,
31620
+ ["id", "state", "source", "name", "type", "annotations", "initializer"],
31621
+ ["initializerSource"]
31622
+ );
31627
31623
  assertIdentity(global, path);
31628
31624
  if (global.initializerSource !== void 0)
31629
31625
  assertLocation(global.initializerSource, `${path}.initializerSource`);
@@ -31937,7 +31933,7 @@ var init_registry = __esm({
31937
31933
  "../packages/manifest/schema-contract/registry.mjs"() {
31938
31934
  "use strict";
31939
31935
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
31940
- cliVersion: "0.70.3",
31936
+ cliVersion: "0.70.4",
31941
31937
  projectFileUploadBatchSize: 32,
31942
31938
  documentRecords: {
31943
31939
  member: {
@@ -112869,6 +112865,22 @@ function createGenerationContext(exportData, diagnostics, docs = EMPTY_UNITY_COD
112869
112865
  `${exportData.project.name}Neo`,
112870
112866
  "NeoProject"
112871
112867
  );
112868
+ const enums = Object.values(exportData.enums);
112869
+ const enumNames = buildEnumNameMap(enums, diagnostics);
112870
+ const typeNames = buildNameMap(
112871
+ Object.values(exportData.classes),
112872
+ "Type",
112873
+ diagnostics
112874
+ );
112875
+ const interfaceNames = buildNameMap(
112876
+ Object.values(exportData.interfaces),
112877
+ "Interface",
112878
+ diagnostics
112879
+ );
112880
+ const dialogueGroupClassNames = buildDialogueGroupClassNameMap(
112881
+ dialogueGroups,
112882
+ diagnostics
112883
+ );
112872
112884
  return {
112873
112885
  exportData,
112874
112886
  docs,
@@ -112876,22 +112888,23 @@ function createGenerationContext(exportData, diagnostics, docs = EMPTY_UNITY_COD
112876
112888
  classes: Object.values(exportData.classes),
112877
112889
  interfaces: Object.values(exportData.interfaces),
112878
112890
  diagnostics,
112879
- enumNames: buildEnumNameMap(Object.values(exportData.enums), diagnostics),
112880
- enumOptionFieldNames: /* @__PURE__ */ new Map(),
112881
- typeNames: buildNameMap(
112882
- Object.values(exportData.classes),
112883
- "Type",
112884
- diagnostics
112885
- ),
112886
- interfaceNames: buildNameMap(
112887
- Object.values(exportData.interfaces),
112888
- "Interface",
112889
- diagnostics
112890
- ),
112891
- dialogueGroupClassNames: buildDialogueGroupClassNameMap(
112892
- dialogueGroups,
112891
+ enumNames,
112892
+ enumOptionsNames: buildEnumOptionsNameMap(
112893
+ enums,
112894
+ enumNames,
112895
+ [
112896
+ projectClassName,
112897
+ ...enumNames.values(),
112898
+ ...typeNames.values(),
112899
+ ...interfaceNames.values(),
112900
+ ...dialogueGroupClassNames.values()
112901
+ ],
112893
112902
  diagnostics
112894
112903
  ),
112904
+ enumOptionFieldNames: /* @__PURE__ */ new Map(),
112905
+ typeNames,
112906
+ interfaceNames,
112907
+ dialogueGroupClassNames,
112895
112908
  dialogueGroupPropertyNames: buildDialogueGroupPropertyNameMap(
112896
112909
  dialogueGroups,
112897
112910
  diagnostics
@@ -112972,6 +112985,29 @@ function buildEnumNameMap(enums, diagnostics) {
112972
112985
  }
112973
112986
  return names;
112974
112987
  }
112988
+ function buildEnumOptionsNameMap(enums, enumNames, typeNames, diagnostics) {
112989
+ const taken = new Set(typeNames);
112990
+ const names = /* @__PURE__ */ new Map();
112991
+ for (const enumDef of enums) {
112992
+ const enumName = enumNames.get(enumDef.id);
112993
+ if (enumName === void 0) continue;
112994
+ const baseName = `${enumName}Options`;
112995
+ if (sdkRuntimeEnumBinding(enumDef.id) !== void 0 || !taken.has(baseName)) {
112996
+ taken.add(baseName);
112997
+ names.set(enumDef.id, baseName);
112998
+ continue;
112999
+ }
113000
+ const uniqueName = `${baseName}_${shortId(enumDef.id)}`;
113001
+ diagnostics.push({
113002
+ severity: "warning",
113003
+ message: `Generated C# options class "${baseName}" for enum "${enumDef.name}" collides with another generated type; using "${uniqueName}".`,
113004
+ path: `enums.${enumDef.id}.name`
113005
+ });
113006
+ taken.add(uniqueName);
113007
+ names.set(enumDef.id, uniqueName);
113008
+ }
113009
+ return names;
113010
+ }
112975
113011
  function buildDialogueGroupClassNameMap(groups, diagnostics) {
112976
113012
  const baseNames = buildNameMap(groups, "DialogueGroup", diagnostics);
112977
113013
  const used = /* @__PURE__ */ new Map();
@@ -146676,8 +146712,13 @@ function staticDelegate(target, parameters) {
146676
146712
  const list = parameters.join(", ");
146677
146713
  return `static (${list}) => ${target}(${list})`;
146678
146714
  }
146679
- function enumParser(enumName) {
146680
- return staticDelegate(`${enumName}.FromOptionId`, ["factoryOptionId"]);
146715
+ function enumOptionsName(ctx, enumId) {
146716
+ return ctx.enumOptionsNames.get(enumId) ?? "NeoEnumOptions";
146717
+ }
146718
+ function enumParser(ctx, enumId) {
146719
+ return staticDelegate(`${enumOptionsName(ctx, enumId)}.FromOptionId`, [
146720
+ "factoryOptionId"
146721
+ ]);
146681
146722
  }
146682
146723
  function immediateInvocationArguments(receiver, argumentNames) {
146683
146724
  const values = argumentNames.length === 1 ? [`(object?)(${argumentNames[0]})`] : argumentNames.length <= 4 ? argumentNames : [`new object?[] { ${argumentNames.join(", ")} }`];
@@ -146691,10 +146732,7 @@ function enumOptionFieldName(ctx, enumId, optionId) {
146691
146732
  const enumDef = ctx.exportData.enums[enumId];
146692
146733
  if (enumDef !== void 0) {
146693
146734
  const enumName = ctx.enumNames.get(enumId) ?? toCSharpTypeName(enumDef.name, "NeoEnum");
146694
- const taken = /* @__PURE__ */ new Set([
146695
- enumName,
146696
- ...GENERATED_ENUM_CLASS_MEMBER_NAMES
146697
- ]);
146735
+ const taken = /* @__PURE__ */ new Set(["value__"]);
146698
146736
  for (const key of getEnumOptionKeyOrder(enumDef)) {
146699
146737
  const option = enumDef.options[key];
146700
146738
  if (option === void 0) continue;
@@ -146707,7 +146745,7 @@ function enumOptionFieldName(ctx, enumId, optionId) {
146707
146745
  unique = `${preferred}_${ordinal}`;
146708
146746
  ctx.diagnostics.push({
146709
146747
  severity: "warning",
146710
- message: `Enum option "${option.name}" collides with a member the generated C# enum class "${enumName}" declares; using "${unique}".`,
146748
+ message: `Enum option "${option.name}" collides with another member of the generated C# enum "${enumName}"; using "${unique}".`,
146711
146749
  path: `enums.${enumId}.options.${key}`
146712
146750
  });
146713
146751
  }
@@ -146718,118 +146756,141 @@ function enumOptionFieldName(ctx, enumId, optionId) {
146718
146756
  }
146719
146757
  return names.get(optionId) ?? null;
146720
146758
  }
146759
+ function enumMemberValue(optionId) {
146760
+ let hash = 2166136261;
146761
+ for (let index = 0; index < optionId.length; index++) {
146762
+ hash = Math.imul(hash ^ optionId.charCodeAt(index), 16777619);
146763
+ }
146764
+ return (hash >>> 0) % 2147483647 + 1;
146765
+ }
146721
146766
  function generateEnumClass(ctx, enumId) {
146722
146767
  const enumDef = ctx.exportData.enums[enumId];
146723
146768
  if (enumDef === void 0) return [];
146724
146769
  if (sdkRuntimeEnumBinding(enumId) !== void 0) return [];
146725
146770
  const enumName = ctx.enumNames.get(enumId) ?? toCSharpTypeName(enumDef.name, "NeoEnum");
146726
- const optionKeyOrder = getEnumOptionKeyOrder(enumDef);
146771
+ const optionsName = enumOptionsName(ctx, enumId);
146772
+ const optionsByValue = /* @__PURE__ */ new Map();
146773
+ const options = getEnumOptionKeyOrder(enumDef).flatMap((optionId) => {
146774
+ const option = enumDef.options[optionId];
146775
+ if (option === void 0) {
146776
+ throw new Error(
146777
+ `Enum ${enumId} option order references missing option ${optionId}.`
146778
+ );
146779
+ }
146780
+ const fieldName = enumOptionFieldName(ctx, enumId, optionId);
146781
+ if (fieldName === null) {
146782
+ ctx.diagnostics.push({
146783
+ severity: "error",
146784
+ message: `Enum option name "${option.name}" is not a valid C# identifier.`,
146785
+ path: `enums.${enumId}.options.${optionId}`
146786
+ });
146787
+ return [];
146788
+ }
146789
+ const value = enumMemberValue(optionId);
146790
+ const clash = optionsByValue.get(value);
146791
+ if (clash !== void 0) {
146792
+ ctx.diagnostics.push({
146793
+ severity: "error",
146794
+ message: `Enum options "${clash}" and "${option.name}" generate the same C# enum value; recreate one of them to give it a new option id.`,
146795
+ path: `enums.${enumId}.options.${optionId}`
146796
+ });
146797
+ return [];
146798
+ }
146799
+ optionsByValue.set(value, option.name);
146800
+ return [
146801
+ {
146802
+ optionId,
146803
+ value,
146804
+ id: `"${escapeCSharpString(optionId)}"`,
146805
+ member: `${enumName}.${fieldName}`,
146806
+ fieldName,
146807
+ text: `"${escapeCSharpString(option.text)}"`
146808
+ }
146809
+ ];
146810
+ });
146811
+ const switchBody = (subject, arms, fallback) => [
146812
+ `return ${subject} switch`,
146813
+ "{",
146814
+ ...indent([...arms, `_ => ${fallback},`]),
146815
+ "};"
146816
+ ];
146817
+ const method2 = (signature, body) => [
146818
+ signature,
146819
+ "{",
146820
+ ...indent(body),
146821
+ "}"
146822
+ ];
146727
146823
  return [
146728
146824
  ...xmlSummary(ctx.docs.enums[enumId]),
146729
- `public sealed class ${enumName} : IEquatable<${enumName}>, global::NeoCompose.Runtime.INeoEnumOption`,
146825
+ `[NeoEnum(typeof(${optionsName}))]`,
146826
+ `public enum ${enumName}`,
146827
+ "{",
146828
+ ...indent(
146829
+ options.flatMap((option) => [
146830
+ ...xmlSummary(ctx.docs.enumOptions[option.optionId]),
146831
+ `${option.fieldName} = ${option.value},`
146832
+ ])
146833
+ ),
146834
+ "}",
146835
+ "",
146836
+ "/// <summary>",
146837
+ `/// Converts <see cref="${enumName}"/> to and from the option ids Neo stores.`,
146838
+ "/// </summary>",
146839
+ `public static class ${optionsName}`,
146730
146840
  "{",
146731
146841
  ...indent([
146732
- `private static readonly Dictionary<string, ${enumName}> values = new Dictionary<string, ${enumName}>();`,
146733
- "public string optionId { get; }",
146734
- "public string Text => TextForOptionId(optionId);",
146735
- "public string TextId => TextIdForOptionId(optionId);",
146736
- "",
146737
- `private ${enumName}(string optionId)`,
146738
- "{",
146739
- ...indent(["this.optionId = optionId;"]),
146740
- "}",
146741
- "",
146742
- ...optionKeyOrder.flatMap((optionId) => {
146743
- const option = enumDef.options[optionId];
146744
- if (option === void 0) {
146745
- throw new Error(
146746
- `Enum ${enumId} option order references missing option ${optionId}.`
146747
- );
146748
- }
146749
- const optionName = option.name;
146750
- const fieldName = enumOptionFieldName(ctx, enumId, optionId);
146751
- if (fieldName === null) {
146752
- ctx.diagnostics.push({
146753
- severity: "error",
146754
- message: `Enum option name "${optionName}" is not a valid C# identifier.`,
146755
- path: `enums.${enumId}.options.${optionId}`
146756
- });
146757
- return [`// Skipped invalid option id: ${optionId}`];
146758
- }
146759
- return [
146760
- ...xmlSummary(ctx.docs.enumOptions[optionId]),
146761
- `public static readonly ${enumName} ${fieldName} = FromOptionId("${escapeCSharpString(optionId)}");`
146762
- ];
146763
- }),
146764
- "",
146765
- `public static ${enumName} FromOptionId(string optionId)`,
146766
- "{",
146767
- ...indent([
146768
- "if (values.TryGetValue(optionId, out var known)) return known;",
146769
- `var created = new ${enumName}(optionId);`,
146770
- "values[optionId] = created;",
146771
- "return created;"
146772
- ]),
146773
- "}",
146842
+ ...method2(
146843
+ `public static ${enumName} FromOptionId(string optionId)`,
146844
+ switchBody(
146845
+ "optionId",
146846
+ options.map((option) => `${option.id} => ${option.member},`),
146847
+ `NeoUndeclaredEnumOptions<${enumName}>.FromOptionId(optionId)`
146848
+ )
146849
+ ),
146774
146850
  "",
146775
- `public static string[] ToOptionIds(IEnumerable<${enumName}>? options)`,
146776
- "{",
146777
- ...indent([
146778
- "if (options is null) return Array.Empty<string>();",
146779
- "var ids = new List<string>();",
146780
- "foreach (var option in options) ids.Add(option.optionId);",
146781
- "return ids.ToArray();"
146782
- ]),
146783
- "}",
146851
+ ...method2(
146852
+ `public static string OptionId(this ${enumName} value)`,
146853
+ switchBody(
146854
+ "value",
146855
+ options.map((option) => `${option.member} => ${option.id},`),
146856
+ `NeoUndeclaredEnumOptions<${enumName}>.OptionId(value)`
146857
+ )
146858
+ ),
146784
146859
  "",
146785
- "public static bool IsKnown(string id)",
146786
- "{",
146787
- ...indent([
146788
- "return id switch",
146789
- "{",
146790
- ...indent([
146791
- ...optionKeyOrder.map(
146792
- (optionId) => `"${escapeCSharpString(optionId)}" => true,`
146793
- ),
146794
- "_ => false,"
146795
- ]),
146796
- "};"
146797
- ]),
146798
- "}",
146860
+ ...method2(
146861
+ `public static string[] ToOptionIds(IEnumerable<${enumName}>? options)`,
146862
+ [
146863
+ "if (options is null) return Array.Empty<string>();",
146864
+ "var ids = new List<string>();",
146865
+ "foreach (var option in options) ids.Add(option.OptionId());",
146866
+ "return ids.ToArray();"
146867
+ ]
146868
+ ),
146799
146869
  "",
146800
- "public static string TextIdForOptionId(string optionId)",
146801
- "{",
146802
- ...indent([
146803
- "return optionId switch",
146804
- "{",
146805
- ...indent([
146806
- ...optionKeyOrder.flatMap((optionId) => {
146807
- const option = enumDef.options[optionId];
146808
- return [
146809
- `"${escapeCSharpString(optionId)}" => "${escapeCSharpString(option.text)}",`
146810
- ];
146811
- }),
146812
- "_ => optionId,"
146813
- ]),
146814
- "};"
146815
- ]),
146816
- "}",
146870
+ ...method2(
146871
+ "public static bool IsKnown(string optionId)",
146872
+ switchBody(
146873
+ "optionId",
146874
+ options.map((option) => `${option.id} => true,`),
146875
+ "false"
146876
+ )
146877
+ ),
146817
146878
  "",
146818
- "public static string TextForOptionId(string optionId, NeoClient? client = null)",
146819
- "{",
146820
- ...indent([
146821
- ctx.singleton ? `return (client ?? ${ctx.projectClassName}.RequireInstance().Client).Localization.ResolveText(TextIdForOptionId(optionId));` : "return client is null ? TextIdForOptionId(optionId) : client.Localization.ResolveText(TextIdForOptionId(optionId));"
146822
- ]),
146823
- "}",
146879
+ ...method2(
146880
+ `public static string TextId(this ${enumName} value)`,
146881
+ switchBody(
146882
+ "value",
146883
+ options.map((option) => `${option.member} => ${option.text},`),
146884
+ "value.OptionId()"
146885
+ )
146886
+ ),
146824
146887
  "",
146825
- `public static implicit operator string(${enumName} value) => value.optionId;`,
146826
- `public static implicit operator ${enumName}(string optionId) => FromOptionId(optionId);`,
146827
- "public override string ToString() => optionId;",
146828
- `public bool Equals(${enumName}? other) => other is not null && optionId == other.optionId;`,
146829
- `public override bool Equals(object? obj) => Equals(obj as ${enumName});`,
146830
- "public override int GetHashCode() => optionId.GetHashCode();",
146831
- `public static bool operator ==(${enumName}? left, ${enumName}? right) => ReferenceEquals(left, right) || (left is not null && left.Equals(right));`,
146832
- `public static bool operator !=(${enumName}? left, ${enumName}? right) => !(left == right);`
146888
+ ...method2(
146889
+ `public static string Text(this ${enumName} value, NeoClient? client = null)`,
146890
+ [
146891
+ ctx.singleton ? `return (client ?? ${ctx.projectClassName}.RequireInstance().Client).Localization.ResolveText(value.TextId());` : "return client is null ? value.TextId() : client.Localization.ResolveText(value.TextId());"
146892
+ ]
146893
+ )
146833
146894
  ]),
146834
146895
  "}"
146835
146896
  ];
@@ -147059,7 +147120,7 @@ function generateIndexedListWrappers(ctx, ownerClass, schemaKey, memberId, env)
147059
147120
  {
147060
147121
  definition: definition2,
147061
147122
  keyType: enumName,
147062
- codecs: enumKeyCodecArguments(indexedMember.enumId, enumName)
147123
+ codecs: enumKeyCodecArguments(ctx, indexedMember.enumId)
147063
147124
  }
147064
147125
  ];
147065
147126
  }
@@ -148329,7 +148390,7 @@ function generateExplicitInterfaceMember(ctx, schemaKey, memberId, interfaceName
148329
148390
  genericEnv,
148330
148391
  ownerClassId
148331
148392
  );
148332
- const setter = isMemberNSPropertyBase(member) && typeof member.setterCode === "string" && !suppressesInheritedSetter(interfaceContract) ? nsPropertyWriteExpression(schemaKey) : null;
148393
+ const setter = isMemberNSPropertyBase(member) && typeof member.setterCode === "string" && !suppressesInheritedSetter(interfaceContract) ? nsPropertyWriteExpression(ctx, member, schemaKey) : null;
148333
148394
  return [
148334
148395
  `${interfaceType2} ${interfaceName}.${memberName}`,
148335
148396
  "{",
@@ -149083,7 +149144,7 @@ function planWorldObjectEmission(ctx, classDef, worldKind) {
149083
149144
  // conversion runs through the wrapper's implicit operator, which is
149084
149145
  // where the required-member throw now lives.
149085
149146
  `Sprite ${SPRITE_OBJECT_VALUE_INTERFACE}.${schemaKeyToMemberName(SPRITE_OBJECT_SPRITE_SCHEMA_KEY)} => ${schemaKeyToMemberName(SPRITE_OBJECT_SPRITE_SCHEMA_KEY)};`,
149086
- `string ${SPRITE_OBJECT_VALUE_INTERFACE}.${schemaKeyToMemberName(SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY)} => ${schemaKeyToMemberName(SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY)}.optionId;`
149147
+ `string ${SPRITE_OBJECT_VALUE_INTERFACE}.${schemaKeyToMemberName(SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY)} => ${schemaKeyToMemberName(SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY)}.OptionId();`
149087
149148
  ],
149088
149149
  shadowedSchemaKeys: /* @__PURE__ */ new Set([
149089
149150
  SPRITE_OBJECT_SPRITE_SCHEMA_KEY,
@@ -149105,7 +149166,7 @@ function planSmartTileEmission(ctx, classDef) {
149105
149166
  return planValidatedContractEmission(ctx, classDef, worldKind, () => ({
149106
149167
  runtimeInterfaces: [SMART_TILE_INTERFACE],
149107
149168
  classMembers: [
149108
- `string ${SMART_TILE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY)}.optionId;`,
149169
+ `string ${SMART_TILE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_DEFAULT_COLLIDER_SCHEMA_KEY)}.OptionId();`,
149109
149170
  `IReadOnlyList<${SMART_TILE_RULE_INTERFACE}> ${SMART_TILE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULES_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULES_SCHEMA_KEY)};`
149110
149171
  ],
149111
149172
  shadowedSchemaKeys: /* @__PURE__ */ new Set([
@@ -149120,9 +149181,9 @@ function planSmartTileEmission(ctx, classDef) {
149120
149181
  classMembers: [
149121
149182
  `IReadOnlyList<${SMART_TILE_NEIGHBOR_INTERFACE}> ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_NEIGHBORS_SCHEMA_KEY)};`,
149122
149183
  `IReadOnlyList<Sprite> ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_SPRITES_SCHEMA_KEY)};`,
149123
- `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY)}.optionId;`,
149124
- `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY)}.optionId;`,
149125
- `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY)}.optionId;`,
149184
+ `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_OUTPUT_SCHEMA_KEY)}.OptionId();`,
149185
+ `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_COLLIDER_SCHEMA_KEY)}.OptionId();`,
149186
+ `string ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_TRANSFORM_SCHEMA_KEY)}.OptionId();`,
149126
149187
  `float ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_MIN_ANIMATION_SPEED_SCHEMA_KEY)};`,
149127
149188
  `float ${SMART_TILE_RULE_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_RULE_MAX_ANIMATION_SPEED_SCHEMA_KEY)};`
149128
149189
  ],
@@ -149142,7 +149203,7 @@ function planSmartTileEmission(ctx, classDef) {
149142
149203
  runtimeInterfaces: [SMART_TILE_NEIGHBOR_INTERFACE],
149143
149204
  classMembers: [
149144
149205
  `Vector2Int ${SMART_TILE_NEIGHBOR_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CELL_SCHEMA_KEY)}.Value;`,
149145
- `string ${SMART_TILE_NEIGHBOR_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY)}.optionId;`,
149206
+ `string ${SMART_TILE_NEIGHBOR_INTERFACE}.${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY)} => ${schemaKeyToMemberName(WORLD_SMART_TILE_NEIGHBOR_CONDITION_SCHEMA_KEY)}.OptionId();`,
149146
149207
  `string? ${SMART_TILE_NEIGHBOR_INTERFACE}.TileClassId => ${SMART_TILE_NEIGHBOR_TILE_RELATION_EXPRESSION};`
149147
149208
  ],
149148
149209
  shadowedSchemaKeys: /* @__PURE__ */ new Set([
@@ -150366,37 +150427,16 @@ function declaredConstructorParameters(ctx, classId, declared, genericEnv) {
150366
150427
  }
150367
150428
  identifiers.add(identifier2);
150368
150429
  const baseType = csharpFunctionTypeInfoValueType(ctx, argument2, true, genericEnv) ?? "object?";
150369
- const rendered = renderCSharpParameterDefault(
150370
- ctx,
150371
- argument2,
150372
- `constructors.${declared.id}.argumentTypes`
150373
- );
150374
- if (rendered === null) {
150375
- parameters.push({
150376
- declaredName: argument2.name,
150377
- identifier: identifier2,
150378
- csharpType: baseType,
150379
- defaultLiteral: null,
150380
- enumFallback: null
150381
- });
150382
- continue;
150383
- }
150384
- if (rendered.enumFallback === null) {
150385
- parameters.push({
150386
- declaredName: argument2.name,
150387
- identifier: identifier2,
150388
- csharpType: baseType,
150389
- defaultLiteral: rendered.literal,
150390
- enumFallback: null
150391
- });
150392
- continue;
150393
- }
150394
150430
  parameters.push({
150395
150431
  declaredName: argument2.name,
150396
150432
  identifier: identifier2,
150397
- csharpType: baseType.endsWith("?") ? baseType : `${baseType}?`,
150398
- defaultLiteral: rendered.literal,
150399
- enumFallback: rendered.enumFallback
150433
+ csharpType: baseType,
150434
+ defaultLiteral: renderCSharpParameterDefault(
150435
+ ctx,
150436
+ argument2,
150437
+ `constructors.${declared.id}.argumentTypes`
150438
+ ),
150439
+ scriptArgument: scriptValueExpression(ctx, argument2, identifier2)
150400
150440
  });
150401
150441
  }
150402
150442
  return parameters;
@@ -150470,10 +150510,9 @@ function generateDeclaredConstructor(ctx, classId, className, constructorId, par
150470
150510
  );
150471
150511
  const signatureParameters = [...declaredParameters, ...appendedParameters];
150472
150512
  const parameterText = ctx.singleton ? signatureParameters.join(", ") : [`${ctx.projectClassName} project`, ...signatureParameters].join(", ");
150473
- const argumentEntries = parameters.map((parameter4) => {
150474
- const valueExpression = parameter4.enumFallback === null ? parameter4.identifier : `${parameter4.identifier} ?? ${parameter4.enumFallback}`;
150475
- return `new global::NeoCompose.Runtime.NeoDeclaredConstructorArgument("${escapeCSharpString(parameter4.declaredName)}", ${valueExpression})`;
150476
- }).join(", ");
150513
+ const argumentEntries = parameters.map(
150514
+ (parameter4) => `new global::NeoCompose.Runtime.NeoDeclaredConstructorArgument("${escapeCSharpString(parameter4.declaredName)}", ${parameter4.scriptArgument})`
150515
+ ).join(", ");
150477
150516
  const argumentArray = argumentEntries.length === 0 ? "new global::NeoCompose.Runtime.NeoDeclaredConstructorArgument[] { }" : `new global::NeoCompose.Runtime.NeoDeclaredConstructorArgument[] { ${argumentEntries} }`;
150478
150517
  const suppliedValues = appendedMembers.map(
150479
150518
  (member) => `new global::NeoCompose.Runtime.NeoGeneratedConstructorValue("${escapeCSharpString(member.schemaKey)}", "${escapeCSharpString(member.memberId)}", ${member.identifier})`
@@ -150590,21 +150629,18 @@ function generateStaticFunctionMethod(ctx, ownerClass, member, genericEnv) {
150590
150629
  `members.${member.id}.argumentTypes`
150591
150630
  );
150592
150631
  const parameters = parameterList.map((parameter4) => parameter4.declaration).join(", ");
150593
- const coalesceStatements = parameterList.flatMap(
150594
- (parameter4) => parameter4.coalesceStatement === null ? [] : [parameter4.coalesceStatement]
150632
+ const argumentNames = parameterList.map((parameter4) => parameter4.identifier);
150633
+ const scriptArguments = parameterList.map(
150634
+ (parameter4) => parameter4.scriptArgument
150595
150635
  );
150596
- const argumentNames = parameterList.map(
150597
- (parameter4) => parameter4.valueExpression
150598
- );
150599
- const args = argumentNames.length === 0 ? "{ }" : `{ ${argumentNames.join(", ")} }`;
150636
+ const args = scriptArguments.length === 0 ? "{ }" : `{ ${scriptArguments.join(", ")} }`;
150600
150637
  const asyncModifier = member.kind === 23 /* NSFunction */ && callableIsDeferred(member) ? "async " : "";
150601
150638
  const declaration = `${memberAccessKeyword(member)} static ${asyncModifier}${returnType} ${functionMethodName(member.name)}(${parameters})`;
150602
150639
  const docs = xmlSummary(ctx.docs.members[member.id]);
150603
150640
  const stamp = memberMethodStamp(member);
150604
150641
  if (member.kind === 23 /* NSFunction */) {
150605
- const invocation = callableIsDeferred(member) ? `await node.InvokeStaticAsync(new object?[] ${args})` : `node.InvokeStatic(${immediateInvocationArguments(null, argumentNames)})`;
150642
+ const invocation = callableIsDeferred(member) ? `await node.InvokeStaticAsync(new object?[] ${args})` : `node.InvokeStatic(${immediateInvocationArguments(null, scriptArguments)})`;
150606
150643
  const body = [
150607
- ...coalesceStatements,
150608
150644
  `var client = ${ctx.projectClassName}.RequireInstance().Client;`,
150609
150645
  `var node = NeoMemberNSFunction.GetOrCreateStatic(client, "${escapeCSharpString(member.id)}");`,
150610
150646
  ...isFunctionVoidTypeInfo(member.returnTypeInfo) ? [`${invocation};`] : [
@@ -150641,7 +150677,6 @@ function generateStaticFunctionMethod(ctx, ownerClass, member, genericEnv) {
150641
150677
  declaration,
150642
150678
  "{",
150643
150679
  ...indent([
150644
- ...coalesceStatements,
150645
150680
  `if (${handler} is null)`,
150646
150681
  "{",
150647
150682
  ...indent([
@@ -150874,7 +150909,7 @@ function generateStaticNSProperty(ctx, member, memberName, memberId, genericEnv)
150874
150909
  ];
150875
150910
  const setter = typeof member.setterCode === "string" ? [
150876
150911
  ...prelude,
150877
- "var result = node.Set(value);",
150912
+ `var result = node.Set(${scriptValueExpression(ctx, member.returnTypeInfo, "value")});`,
150878
150913
  'if (!result.ok) throw new InvalidOperationException(result.error ?? "Static NSProperty setter failed.");'
150879
150914
  ] : null;
150880
150915
  return [
@@ -151044,7 +151079,7 @@ function generateMember(ctx, schemaKey, memberId, saved, modifier, emitBody, own
151044
151079
  genericEnv,
151045
151080
  ownerClassId
151046
151081
  );
151047
- const declaredPropertySetter = isMemberNSPropertyBase(member) && typeof member.setterCode === "string" ? nsPropertyWriteExpression(schemaKey) : null;
151082
+ const declaredPropertySetter = isMemberNSPropertyBase(member) && typeof member.setterCode === "string" ? nsPropertyWriteExpression(ctx, member, schemaKey) : null;
151048
151083
  const propertySetter = suppressesInheritedSetter(inheritedContract) ? null : declaredPropertySetter;
151049
151084
  const emitsStoredSetter = bindingContract === null ? memberSaved : bindingContract.hasSetter;
151050
151085
  const storedSetterBody = suppressesInheritedSetter(inheritedContract) || !emitsStoredSetter ? null : writeExpression(ctx, member, schemaKey, ownerClassName, ownerClassId);
@@ -151397,10 +151432,10 @@ function descendsFromWorldObject(ctx, classId) {
151397
151432
  }
151398
151433
  return false;
151399
151434
  }
151400
- function nsPropertyWriteExpression(schemaKey) {
151435
+ function nsPropertyWriteExpression(ctx, member, schemaKey) {
151401
151436
  const getNode = `writableNode.Get<NeoMemberNSProperty>("${escapeCSharpString(schemaKey)}")`;
151402
151437
  return [
151403
- `var result = ${getNode}.Set(valueId!, value);`,
151438
+ `var result = ${getNode}.Set(valueId!, ${scriptValueExpression(ctx, member.returnTypeInfo, "value")});`,
151404
151439
  'if (!result.ok) throw new InvalidOperationException(result.error ?? "NSProperty setter failed.");'
151405
151440
  ];
151406
151441
  }
@@ -151470,49 +151505,37 @@ function renderCSharpParameterDefault(ctx, argument2, path) {
151470
151505
  case 1 /* Bool */: {
151471
151506
  const defaultValue = argument2.defaultValue;
151472
151507
  if (defaultValue === void 0) return null;
151473
- if (defaultValue.value === null)
151474
- return { literal: "null", enumFallback: null };
151475
- return {
151476
- literal: defaultValue.value ? "true" : "false",
151477
- enumFallback: null
151478
- };
151508
+ if (defaultValue.value === null) return "null";
151509
+ return defaultValue.value ? "true" : "false";
151479
151510
  }
151480
151511
  case 2 /* Int */: {
151481
151512
  const defaultValue = argument2.defaultValue;
151482
151513
  if (defaultValue === void 0) return null;
151483
- if (defaultValue.value === null)
151484
- return { literal: "null", enumFallback: null };
151485
- return { literal: String(defaultValue.value), enumFallback: null };
151514
+ if (defaultValue.value === null) return "null";
151515
+ return String(defaultValue.value);
151486
151516
  }
151487
151517
  case 4 /* Float */: {
151488
151518
  const defaultValue = argument2.defaultValue;
151489
151519
  if (defaultValue === void 0) return null;
151490
- if (defaultValue.value === null)
151491
- return { literal: "null", enumFallback: null };
151492
- return { literal: `${String(defaultValue.value)}f`, enumFallback: null };
151520
+ if (defaultValue.value === null) return "null";
151521
+ return `${String(defaultValue.value)}f`;
151493
151522
  }
151494
151523
  case 20 /* Decimal */: {
151495
151524
  const defaultValue = argument2.defaultValue;
151496
151525
  if (defaultValue === void 0) return null;
151497
- if (defaultValue.value === null)
151498
- return { literal: "null", enumFallback: null };
151499
- return { literal: `${defaultValue.value}m`, enumFallback: null };
151526
+ if (defaultValue.value === null) return "null";
151527
+ return `${defaultValue.value}m`;
151500
151528
  }
151501
151529
  case 3 /* String */: {
151502
151530
  const defaultValue = argument2.defaultValue;
151503
151531
  if (defaultValue === void 0) return null;
151504
- if (defaultValue.value === null)
151505
- return { literal: "null", enumFallback: null };
151506
- return {
151507
- literal: `"${escapeCSharpString(defaultValue.value)}"`,
151508
- enumFallback: null
151509
- };
151532
+ if (defaultValue.value === null) return "null";
151533
+ return `"${escapeCSharpString(defaultValue.value)}"`;
151510
151534
  }
151511
151535
  case 8 /* Enum */: {
151512
151536
  const defaultValue = argument2.defaultValue;
151513
151537
  if (defaultValue === void 0) return null;
151514
- if (defaultValue.value === null)
151515
- return { literal: "null", enumFallback: null };
151538
+ if (defaultValue.value === null) return "null";
151516
151539
  const enumDef = ctx.exportData.enums[argument2.enumId];
151517
151540
  if (enumDef === void 0) {
151518
151541
  ctx.diagnostics.push({
@@ -151554,22 +151577,22 @@ function renderCSharpParameterDefault(ctx, argument2, path) {
151554
151577
  return null;
151555
151578
  }
151556
151579
  if (argument2.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
151557
- return {
151558
- literal: `NeoCompose.Runtime.NeoCellPatternExcluding.${schemaKeyToMemberName(option.name)}`,
151559
- enumFallback: null
151560
- };
151561
- return { literal: "null", enumFallback: `${enumName}.${accessor}` };
151580
+ return `NeoCompose.Runtime.NeoCellPatternExcluding.${schemaKeyToMemberName(option.name)}`;
151581
+ return `${enumName}.${accessor}`;
151562
151582
  }
151563
151583
  default: {
151564
151584
  if (argument2.defaultValue === void 0) return null;
151565
- return { literal: "null", enumFallback: null };
151585
+ return "null";
151566
151586
  }
151567
151587
  }
151568
151588
  }
151589
+ function scriptValueExpression(ctx, typeInfo, expression) {
151590
+ return typeInfo.type === 8 /* Enum */ && typeInfo.enumId !== NEO_CELL_PATTERN_EXCLUDING_ENUM_ID && ctx.enumNames.has(typeInfo.enumId) ? `${expression}${typeInfo.required ? "" : "?"}.OptionId()` : expression;
151591
+ }
151569
151592
  function renderFunctionParameters(ctx, member, genericBindingSaved, genericEnv, path) {
151570
151593
  return member.argumentTypes.map((argument2, index) => {
151571
151594
  const identifier2 = functionParameterName(argument2.name, index);
151572
- const baseType = csharpFunctionTypeInfoValueType(
151595
+ const type = csharpFunctionTypeInfoValueType(
151573
151596
  ctx,
151574
151597
  argument2,
151575
151598
  genericBindingSaved,
@@ -151577,10 +151600,9 @@ function renderFunctionParameters(ctx, member, genericBindingSaved, genericEnv,
151577
151600
  ) ?? "object?";
151578
151601
  const bare = {
151579
151602
  identifier: identifier2,
151580
- type: baseType,
151581
- declaration: `${baseType} ${identifier2}`,
151582
- valueExpression: identifier2,
151583
- coalesceStatement: null
151603
+ type,
151604
+ declaration: `${type} ${identifier2}`,
151605
+ scriptArgument: scriptValueExpression(ctx, argument2, identifier2)
151584
151606
  };
151585
151607
  if (callableIsDeferred(member) && parameterHasDefault(argument2)) {
151586
151608
  ctx.diagnostics.push({
@@ -151590,26 +151612,8 @@ function renderFunctionParameters(ctx, member, genericBindingSaved, genericEnv,
151590
151612
  });
151591
151613
  return bare;
151592
151614
  }
151593
- const rendered = renderCSharpParameterDefault(ctx, argument2, path);
151594
- if (rendered === null) return bare;
151595
- if (rendered.enumFallback === null) {
151596
- return {
151597
- identifier: identifier2,
151598
- type: baseType,
151599
- declaration: `${baseType} ${identifier2} = ${rendered.literal}`,
151600
- valueExpression: identifier2,
151601
- coalesceStatement: null
151602
- };
151603
- }
151604
- const nullableType = baseType.endsWith("?") ? baseType : `${baseType}?`;
151605
- const coalescedLocal = `${identifier2}Value`;
151606
- return {
151607
- identifier: identifier2,
151608
- type: nullableType,
151609
- declaration: `${nullableType} ${identifier2} = null`,
151610
- valueExpression: coalescedLocal,
151611
- coalesceStatement: `var ${coalescedLocal} = ${identifier2} ?? ${rendered.enumFallback};`
151612
- };
151615
+ const literal3 = renderCSharpParameterDefault(ctx, argument2, path);
151616
+ return literal3 === null ? bare : { ...bare, declaration: `${type} ${identifier2} = ${literal3}` };
151613
151617
  });
151614
151618
  }
151615
151619
  function functionSignature(ctx, member, genericEnv) {
@@ -151677,12 +151681,12 @@ function generateFunctionMethod(ctx, member, schemaKey, modifier = "", emitBody
151677
151681
  ];
151678
151682
  if (!emitBody) return [...docs, `${declaration};`];
151679
151683
  const stamp = memberMethodStamp(member);
151680
- const coalesceStatements = parameterList.flatMap(
151681
- (parameter4) => parameter4.coalesceStatement === null ? [] : [parameter4.coalesceStatement]
151682
- );
151683
- const argumentList = parameterList.map((parameter4) => parameter4.valueExpression).join(", ");
151684
+ const argumentList = parameterList.map((parameter4) => parameter4.identifier).join(", ");
151684
151685
  const call = `FunctionHandler.${methodName}(${argumentList})`;
151685
- const deferredArgs = member.argumentTypes.length === 0 ? "{ }" : `{ ${argumentList} }`;
151686
+ const scriptArguments = parameterList.map(
151687
+ (parameter4) => parameter4.scriptArgument
151688
+ );
151689
+ const deferredArgs = scriptArguments.length === 0 ? "{ }" : `{ ${scriptArguments.join(", ")} }`;
151686
151690
  const deferredCall = isFunctionVoidTypeInfo(member.returnTypeInfo) ? `return client.InvokeDeferredNativeFunction("${escapeCSharpString(member.id)}", this, new object?[] ${deferredArgs});` : `return client.InvokeDeferredNativeFunction<${csharpFunctionReturnType(ctx, member.returnTypeInfo, genericEnv, true)}>("${escapeCSharpString(member.id)}", this, new object?[] ${deferredArgs});`;
151687
151691
  if (member.id === NEO_TILE_CONVERT_MEMBER_ID) {
151688
151692
  return [
@@ -151690,10 +151694,7 @@ function generateFunctionMethod(ctx, member, schemaKey, modifier = "", emitBody
151690
151694
  ...stamp,
151691
151695
  declaration,
151692
151696
  "{",
151693
- ...indent([
151694
- ...coalesceStatements,
151695
- `return base.TryConvert(${argumentList});`
151696
- ]),
151697
+ ...indent([`return base.TryConvert(${argumentList});`]),
151697
151698
  "}"
151698
151699
  ];
151699
151700
  }
@@ -151704,7 +151705,6 @@ function generateFunctionMethod(ctx, member, schemaKey, modifier = "", emitBody
151704
151705
  declaration,
151705
151706
  "{",
151706
151707
  ...indent([
151707
- ...coalesceStatements,
151708
151708
  `var result = client.ScriptGridQueries.Invoke("${member.id}", this, new object?[] ${deferredArgs});`,
151709
151709
  ...nsGetterResultReturnExpression(
151710
151710
  ctx,
@@ -151720,11 +151720,10 @@ function generateFunctionMethod(ctx, member, schemaKey, modifier = "", emitBody
151720
151720
  if (isNSFunction2) {
151721
151721
  const invocation = callableIsDeferred(member) ? `writableNode.Get<NeoMemberNSFunction>("${escapeCSharpString(schemaKey)}").InvokeAsync(valueId!, new object?[] ${deferredArgs})` : `InvokeFunction(${immediateInvocationArguments(
151722
151722
  `"${escapeCSharpString(schemaKey)}"`,
151723
- parameterList.map((parameter4) => parameter4.valueExpression)
151723
+ scriptArguments
151724
151724
  )})`;
151725
151725
  const resultStatement = callableIsDeferred(member) ? `var result = await ${invocation};` : `var result = ${invocation};`;
151726
151726
  const body = [
151727
- ...coalesceStatements,
151728
151727
  ...callableIsDeferred(member) ? [
151729
151728
  `if (valueId is null) throw new InvalidOperationException("Cannot invoke NSFunction '${escapeCSharpString(member.name)}' without a backing receiver value id.");`
151730
151729
  ] : [],
@@ -151749,7 +151748,6 @@ function generateFunctionMethod(ctx, member, schemaKey, modifier = "", emitBody
151749
151748
  declaration,
151750
151749
  "{",
151751
151750
  ...indent([
151752
- ...coalesceStatements,
151753
151751
  ...callableIsDeferred(member) ? [deferredCall] : [
151754
151752
  "if (FunctionHandler is null)",
151755
151753
  "{",
@@ -151822,8 +151820,8 @@ function nativeFunctionArgExpression(ctx, typeInfo, valueExpression, argumentNam
151822
151820
  case 8 /* Enum */: {
151823
151821
  if (typeInfo.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
151824
151822
  return `NeoCellPatternStorage.${required2 ? "ReadExcluding" : "ReadOptionalExcluding"}(${valueExpression})`;
151825
- const enumName = ctx.enumNames.get(typeInfo.enumId) ?? "string";
151826
- return required2 ? `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(enumName)}) ?? throw new InvalidOperationException("Required enum argument '${escapeCSharpString(argumentName)}' could not be resolved.")` : `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(enumName)})`;
151823
+ const parser = enumParser(ctx, typeInfo.enumId);
151824
+ return required2 ? `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${parser}) ?? throw new InvalidOperationException("Required enum argument '${escapeCSharpString(argumentName)}' could not be resolved.")` : `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${parser})`;
151827
151825
  }
151828
151826
  case 18 /* DialogueLookup */: {
151829
151827
  const dialogueIds = `NeoGeneratedTypesSupport.ToStringArray(${valueExpression})`;
@@ -151862,8 +151860,7 @@ function nativeFunctionArgExpression(ctx, typeInfo, valueExpression, argumentNam
151862
151860
  if (isMemberEnumBase(binding) && isMultiSelectionMember(binding)) {
151863
151861
  if (binding.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
151864
151862
  return `NeoCellPatternStorage.ReadExcludingList(${valueExpression})`;
151865
- const enumName = ctx.enumNames.get(binding.enumId) ?? "string";
151866
- return `NeoGeneratedTypesSupport.ReadEnumList(${valueExpression}, ${enumParser(enumName)})`;
151863
+ return `NeoGeneratedTypesSupport.ReadEnumList(${valueExpression}, ${enumParser(ctx, binding.enumId)})`;
151867
151864
  }
151868
151865
  if (isMemberClassBase(binding)) {
151869
151866
  const typeName = ctx.typeNames.get(binding.classId);
@@ -152107,10 +152104,9 @@ function nsGetterResultReturnExpression(ctx, returnTypeInfo, valueExpression, sa
152107
152104
  ...prefix,
152108
152105
  `return NeoCellPatternStorage.${optional2 ? "ReadOptionalExcluding" : "ReadExcluding"}(${valueExpression});`
152109
152106
  ];
152110
- const enumName = ctx.enumNames.get(returnTypeInfo.enumId) ?? "string";
152111
152107
  return [
152112
152108
  ...prefix,
152113
- `var selected = NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(enumName)});`,
152109
+ `var selected = NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(ctx, returnTypeInfo.enumId)});`,
152114
152110
  optional2 ? "return selected;" : 'return selected ?? throw new InvalidOperationException("NSProperty returned null for a required enum value.");'
152115
152111
  ];
152116
152112
  }
@@ -152226,11 +152222,11 @@ function nsGetterGenericResultExpression(ctx, typeInfo, valueExpression, saved,
152226
152222
  if (isMemberEnumBase(binding)) {
152227
152223
  if (binding.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
152228
152224
  return `NeoCellPatternStorage.${isMultiSelectionMember(binding) ? "ReadExcludingList" : required2 ? "ReadExcluding" : "ReadOptionalExcluding"}(${valueExpression})`;
152229
- const enumName = ctx.enumNames.get(binding.enumId) ?? "string";
152225
+ const parser = enumParser(ctx, binding.enumId);
152230
152226
  if (isMultiSelectionMember(binding)) {
152231
- return `NeoGeneratedTypesSupport.ReadEnumList(${valueExpression}, ${enumParser(enumName)})`;
152227
+ return `NeoGeneratedTypesSupport.ReadEnumList(${valueExpression}, ${parser})`;
152232
152228
  }
152233
- const read = `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(enumName)})`;
152229
+ const read = `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${parser})`;
152234
152230
  return required2 ? `${read} ?? throw new InvalidOperationException("Required generic enum result was null.")` : read;
152235
152231
  }
152236
152232
  if (isMemberClassBase(binding)) {
@@ -152380,11 +152376,11 @@ function detachedValueExpression(ctx, member, value, required2, saved, genericEn
152380
152376
  if (isMemberEnumBase(member)) {
152381
152377
  if (member.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
152382
152378
  return `NeoCellPatternStorage.${isMultiSelectionMember(member) ? "ReadExcludingList" : required2 ? "ReadExcluding" : "ReadOptionalExcluding"}(${value})`;
152383
- const enumName = ctx.enumNames.get(member.enumId);
152384
- if (enumName === void 0) return null;
152379
+ if (!ctx.enumNames.has(member.enumId)) return null;
152380
+ const parser = enumParser(ctx, member.enumId);
152385
152381
  if (isMultiSelectionMember(member))
152386
- return `NeoGeneratedTypesSupport.ReadEnumList(${value}, ${enumParser(enumName)})`;
152387
- const read = `NeoGeneratedTypesSupport.ReadEnumSingle(${value}, ${enumParser(enumName)})`;
152382
+ return `NeoGeneratedTypesSupport.ReadEnumList(${value}, ${parser})`;
152383
+ const read = `NeoGeneratedTypesSupport.ReadEnumSingle(${value}, ${parser})`;
152388
152384
  return required2 ? `${read} ?? throw new InvalidOperationException("Required enum '${escapeCSharpString(member.name)}' has no selected option.")` : `${value} is null ? null : ${read}`;
152389
152385
  }
152390
152386
  if (isMemberClassBase(member) && member.classArguments == null) {
@@ -152553,15 +152549,15 @@ function storedReadExpression(ctx, member, schemaKey, nodeType, saved, ownerClas
152553
152549
  return [
152554
152550
  `return NeoCellPatternStorage.${isMultiSelectionMember(member) ? "ReadExcludingList" : isRequiredMember2(member) ? "ReadExcluding" : "ReadOptionalExcluding"}(${getNode}.Selected());`
152555
152551
  ];
152556
- const enumName = ctx.enumNames.get(member.enumId) ?? "string";
152552
+ const optionsName = enumOptionsName(ctx, member.enumId);
152557
152553
  return isMultiSelectionMember(member) ? [
152558
- `return NeoGeneratedTypesSupport.ReadEnumList(${getNode}.Selected(), ${enumParser(enumName)});`
152554
+ `return NeoGeneratedTypesSupport.ReadEnumList(${getNode}.Selected(), ${enumParser(ctx, member.enumId)});`
152559
152555
  ] : isRequiredMember2(member) ? [
152560
152556
  `var selected = NeoGeneratedTypesSupport.ReadSingleSelected(${getNode});`,
152561
- `return selected is null ? throw new InvalidOperationException("Required enum '${escapeCSharpString(schemaKey)}' has no selected option.") : ${enumName}.FromOptionId(selected);`
152557
+ `return selected is null ? throw new InvalidOperationException("Required enum '${escapeCSharpString(schemaKey)}' has no selected option.") : ${optionsName}.FromOptionId(selected);`
152562
152558
  ] : [
152563
152559
  `var selected = NeoGeneratedTypesSupport.ReadSingleSelected(${getNode});`,
152564
- `return selected is null ? null : ${enumName}.FromOptionId(selected);`
152560
+ `return selected is null ? null : ${optionsName}.FromOptionId(selected);`
152565
152561
  ];
152566
152562
  }
152567
152563
  if (isMemberLookupBase(member)) {
@@ -152718,13 +152714,12 @@ function writeExpression(ctx, member, schemaKey, ownerClassName, ownerClassId) {
152718
152714
  return [
152719
152715
  `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(NeoCellPatternStorage.${isMultiSelectionMember(member) ? "ExcludingListIds" : "OptionalExcludingIds"}(value)));`
152720
152716
  ];
152721
- const enumName = ctx.enumNames.get(member.enumId) ?? "string";
152722
152717
  return isMultiSelectionMember(member) ? [
152723
- `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(${enumName}.ToOptionIds(value)));`
152718
+ `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(${enumOptionsName(ctx, member.enumId)}.ToOptionIds(value)));`
152724
152719
  ] : isRequiredMember2(member) ? [
152725
- `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(new[] { value.optionId }));`
152720
+ `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(new[] { value.OptionId() }));`
152726
152721
  ] : [
152727
- `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(value is null ? null : new[] { value.optionId }));`
152722
+ `NeoGeneratedTypesSupport.SetValue(writableNode, "${key}", NeoGeneratedTypesSupport.Value(value is null ? null : new[] { value.Value.OptionId() }));`
152728
152723
  ];
152729
152724
  }
152730
152725
  if (isMemberLookupBase(member)) {
@@ -152839,14 +152834,13 @@ function collectionReadExpression(ctx, member, getNode, schemaKey, entryMember,
152839
152834
  `new ${collectionType}(client, memberNode, (client, child) => ${childConverter(ctx, entryMember, false, false, genericEnv)}${keyCodecArguments})`
152840
152835
  );
152841
152836
  }
152842
- function enumKeyCodecArguments(enumId, enumName) {
152843
- return enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID ? ", id => NeoCellPatternStorage.ReadExcluding(new[] { id }), key => NeoCellPatternStorage.ExcludingIds(key)[0]" : `, ${enumParser(enumName)}, key => key.optionId`;
152837
+ function enumKeyCodecArguments(ctx, enumId) {
152838
+ return enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID ? ", id => NeoCellPatternStorage.ReadExcluding(new[] { id }), key => NeoCellPatternStorage.ExcludingIds(key)[0]" : `, ${enumParser(ctx, enumId)}, key => key.OptionId()`;
152844
152839
  }
152845
152840
  function dictionaryKeyCodecArguments(ctx, member) {
152846
152841
  if (!isEnumKeyedDictionaryMember(member)) return "";
152847
- const keyEnumName = ctx.enumNames.get(member.keyEnumId);
152848
- if (keyEnumName === void 0) return "";
152849
- return enumKeyCodecArguments(member.keyEnumId, keyEnumName);
152842
+ if (!ctx.enumNames.has(member.keyEnumId)) return "";
152843
+ return enumKeyCodecArguments(ctx, member.keyEnumId);
152850
152844
  }
152851
152845
  function serializeItemExpression(ctx, member, valueExpression) {
152852
152846
  if (member === null) return valueExpression;
@@ -152855,7 +152849,7 @@ function serializeItemExpression(ctx, member, valueExpression) {
152855
152849
  if (isMemberEnumBase(member)) {
152856
152850
  if (member.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
152857
152851
  return `NeoGeneratedTypesSupport.Value(NeoCellPatternStorage.${isMultiSelectionMember(member) ? "ExcludingListIds" : "OptionalExcludingIds"}(${valueExpression}))`;
152858
- const rawExpression = isMultiSelectionMember(member) ? `${ctx.enumNames.get(member.enumId) ?? "NeoEnum"}.ToOptionIds(${valueExpression})` : `${valueExpression} is null ? null : new[] { ${valueExpression}.optionId }`;
152852
+ const rawExpression = isMultiSelectionMember(member) ? `${enumOptionsName(ctx, member.enumId)}.ToOptionIds(${valueExpression})` : `${valueExpression} is ${ctx.enumNames.get(member.enumId) ?? "NeoEnum"} enumOption ? new[] { enumOption.OptionId() } : null`;
152859
152853
  return `NeoGeneratedTypesSupport.Value(${rawExpression})`;
152860
152854
  }
152861
152855
  if (isMemberLookupBase(member)) {
@@ -153044,8 +153038,8 @@ function childConverter(ctx, member, saved = false, branchOnReadOnly = false, ge
153044
153038
  if (isMemberEnumBase(member)) {
153045
153039
  if (member.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
153046
153040
  return `NeoCellPatternStorage.${isMultiSelectionMember(member) ? "ReadExcludingList" : isRequiredMember2(member) ? "ReadExcluding" : "ReadOptionalExcluding"}(((NeoMemberEnum)child).Selected())`;
153047
- const enumName = ctx.enumNames.get(member.enumId) ?? "string";
153048
- return isMultiSelectionMember(member) ? `NeoGeneratedTypesSupport.ReadEnumList(((NeoMemberEnum)child).Selected(), ${enumParser(enumName)})` : isRequiredMember2(member) ? `NeoGeneratedTypesSupport.ReadEnumSingle(((NeoMemberEnum)child).Selected(), ${enumParser(enumName)}) ?? throw new InvalidOperationException("Required enum '${escapeCSharpString(member.name)}' has no selected option.")` : `NeoGeneratedTypesSupport.ReadEnumSingle(((NeoMemberEnum)child).Selected(), ${enumParser(enumName)})`;
153041
+ const parser = enumParser(ctx, member.enumId);
153042
+ return isMultiSelectionMember(member) ? `NeoGeneratedTypesSupport.ReadEnumList(((NeoMemberEnum)child).Selected(), ${parser})` : isRequiredMember2(member) ? `NeoGeneratedTypesSupport.ReadEnumSingle(((NeoMemberEnum)child).Selected(), ${parser}) ?? throw new InvalidOperationException("Required enum '${escapeCSharpString(member.name)}' has no selected option.")` : `NeoGeneratedTypesSupport.ReadEnumSingle(((NeoMemberEnum)child).Selected(), ${parser})`;
153049
153043
  }
153050
153044
  if (isMemberLookupBase(member)) return "((NeoMemberLookup)child).Selected()";
153051
153045
  if (isMemberDialogueLookupBase(member))
@@ -153099,8 +153093,8 @@ function nsGetterChildConverter(ctx, returnTypeInfo, saved, genericEnv) {
153099
153093
  case 8 /* Enum */: {
153100
153094
  if (returnTypeInfo.enumId === NEO_CELL_PATTERN_EXCLUDING_ENUM_ID)
153101
153095
  return `NeoCellPatternStorage.${returnTypeInfo.required ? "ReadExcluding" : "ReadOptionalExcluding"}(${valueExpression})`;
153102
- const enumName = ctx.enumNames.get(returnTypeInfo.enumId) ?? "string";
153103
- return `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(enumName)})`;
153096
+ const readExpression2 = `NeoGeneratedTypesSupport.ReadEnumSingle(${valueExpression}, ${enumParser(ctx, returnTypeInfo.enumId)})`;
153097
+ return returnTypeInfo.required ? `${readExpression2} ?? throw new InvalidOperationException("NSProperty returned null for a required enum value.")` : readExpression2;
153104
153098
  }
153105
153099
  case 18 /* DialogueLookup */: {
153106
153100
  const dialogueIds = `NeoGeneratedTypesSupport.ToStringArray(${valueExpression})`;
@@ -153167,7 +153161,7 @@ function escapeCSharpString(value) {
153167
153161
  (character) => CSHARP_STRING_ESCAPES.get(character) ?? `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`
153168
153162
  );
153169
153163
  }
153170
- var NEO_MEMORY_SCHEMA_KEYS, NEO_MEMORY_CLASS_NAMES, GENERATED_ENUM_CLASS_MEMBER_NAMES, CHILDREN_SCHEMA_KEY, TILE_LAYER_LINK_INTERFACE, OBJECT_LAYER_LINK_INTERFACE, OBJECT_SPAWN_HOOKS_INTERFACE, TILE_LAYER_RENDER_TARGET_PROVIDER_INTERFACE, SMART_TILE_SOURCE_INTERFACE, SMART_TILE_INTERFACE, SMART_TILE_RULE_INTERFACE, SMART_TILE_NEIGHBOR_INTERFACE, WORLD_OBJECT_VALUE_INTERFACE, OBJECT_COMPOSITION_SOURCE_INTERFACE, COLLIDER_SOURCE_INTERFACE, SORTING_GROUP_SOURCE_INTERFACE, COLLIDER_INTERFACE, SORTING_GROUP_INTERFACE, SPRITE_OBJECT_VALUE_INTERFACE, SORTING_GROUP_SOURCE_MEMBER_NAME, OBJECT_BASE_NAME_SCHEMA_KEY, OBJECT_BASE_POSITION_SCHEMA_KEY, OBJECT_BASE_SIZE_SCHEMA_KEY, SPRITE_OBJECT_SPRITE_SCHEMA_KEY, SPRITE_OBJECT_FLIP_X_SCHEMA_KEY, SPRITE_OBJECT_FLIP_Y_SCHEMA_KEY, SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY, SPRITE_OBJECT_SORTING_ORDER_SCHEMA_KEY, TILE_CELL_SCHEMA_KEY, EMPTY_RUNTIME_CONTRACT_PLAN, SMART_TILE_CONTRACT_WORLD_KINDS, WORLD_OBJECT_CONTRACT_WORLD_KINDS, SMART_TILE_NEIGHBOR_TILE_RELATION_EXPRESSION, REQUIRED_STRING_CONTRACT_FIELD, REQUIRED_BOOL_CONTRACT_FIELD, OPTIONAL_BOOL_CONTRACT_FIELD, OPTIONAL_INT_CONTRACT_FIELD, REQUIRED_FLOAT_CONTRACT_FIELD, REQUIRED_SPRITE_CONTRACT_FIELD, REQUIRED_VECTOR2_CONTRACT_FIELD, OPTIONAL_VECTOR2_CONTRACT_FIELD, REQUIRED_VECTOR2_INT_CONTRACT_FIELD, REQUIRED_VECTOR3_CONTRACT_FIELD, VARIANTS_SCOPE_NAME, BASE_VARIANT_NAME, VARIANT_APPLY_METHOD_NAME, VARIANT_FOLDER_SEPARATOR, CSHARP_STRING_ESCAPES, UNRESOLVED_VARIANT_TARGET;
153164
+ var NEO_MEMORY_SCHEMA_KEYS, NEO_MEMORY_CLASS_NAMES, CHILDREN_SCHEMA_KEY, TILE_LAYER_LINK_INTERFACE, OBJECT_LAYER_LINK_INTERFACE, OBJECT_SPAWN_HOOKS_INTERFACE, TILE_LAYER_RENDER_TARGET_PROVIDER_INTERFACE, SMART_TILE_SOURCE_INTERFACE, SMART_TILE_INTERFACE, SMART_TILE_RULE_INTERFACE, SMART_TILE_NEIGHBOR_INTERFACE, WORLD_OBJECT_VALUE_INTERFACE, OBJECT_COMPOSITION_SOURCE_INTERFACE, COLLIDER_SOURCE_INTERFACE, SORTING_GROUP_SOURCE_INTERFACE, COLLIDER_INTERFACE, SORTING_GROUP_INTERFACE, SPRITE_OBJECT_VALUE_INTERFACE, SORTING_GROUP_SOURCE_MEMBER_NAME, OBJECT_BASE_NAME_SCHEMA_KEY, OBJECT_BASE_POSITION_SCHEMA_KEY, OBJECT_BASE_SIZE_SCHEMA_KEY, SPRITE_OBJECT_SPRITE_SCHEMA_KEY, SPRITE_OBJECT_FLIP_X_SCHEMA_KEY, SPRITE_OBJECT_FLIP_Y_SCHEMA_KEY, SPRITE_OBJECT_MASK_INTERACTION_SCHEMA_KEY, SPRITE_OBJECT_SORTING_ORDER_SCHEMA_KEY, TILE_CELL_SCHEMA_KEY, EMPTY_RUNTIME_CONTRACT_PLAN, SMART_TILE_CONTRACT_WORLD_KINDS, WORLD_OBJECT_CONTRACT_WORLD_KINDS, SMART_TILE_NEIGHBOR_TILE_RELATION_EXPRESSION, REQUIRED_STRING_CONTRACT_FIELD, REQUIRED_BOOL_CONTRACT_FIELD, OPTIONAL_BOOL_CONTRACT_FIELD, OPTIONAL_INT_CONTRACT_FIELD, REQUIRED_FLOAT_CONTRACT_FIELD, REQUIRED_SPRITE_CONTRACT_FIELD, REQUIRED_VECTOR2_CONTRACT_FIELD, OPTIONAL_VECTOR2_CONTRACT_FIELD, REQUIRED_VECTOR2_INT_CONTRACT_FIELD, REQUIRED_VECTOR3_CONTRACT_FIELD, VARIANTS_SCOPE_NAME, BASE_VARIANT_NAME, VARIANT_APPLY_METHOD_NAME, VARIANT_FOLDER_SEPARATOR, CSHARP_STRING_ESCAPES, UNRESOLVED_VARIANT_TARGET;
153171
153165
  var init_generate_unity_classes = __esm({
153172
153166
  "../src/models/exports/unity-codegen/generate-unity-classes.ts"() {
153173
153167
  "use strict";
@@ -153213,24 +153207,6 @@ var init_generate_unity_classes = __esm({
153213
153207
  textNodeMemory: "NeoTextNodeMemory",
153214
153208
  choiceLog: "NeoChoiceLog"
153215
153209
  };
153216
- GENERATED_ENUM_CLASS_MEMBER_NAMES = /* @__PURE__ */ new Set([
153217
- "values",
153218
- "optionId",
153219
- "Text",
153220
- "TextId",
153221
- "FromOptionId",
153222
- "ToOptionIds",
153223
- "IsKnown",
153224
- "TextIdForOptionId",
153225
- "TextForOptionId",
153226
- "ToString",
153227
- "Equals",
153228
- "GetHashCode",
153229
- "GetType",
153230
- "ReferenceEquals",
153231
- "MemberwiseClone",
153232
- "Finalize"
153233
- ]);
153234
153210
  CHILDREN_SCHEMA_KEY = "Children";
153235
153211
  TILE_LAYER_LINK_INTERFACE = "INeoTileLayerLinkValue";
153236
153212
  OBJECT_LAYER_LINK_INTERFACE = "INeoObjectLayerLinkValue";
@@ -156488,7 +156464,7 @@ var UNITY_CODEGEN_REVISION;
156488
156464
  var init_unity_codegen_revision = __esm({
156489
156465
  "../src/models/exports/unity-codegen-revision.ts"() {
156490
156466
  "use strict";
156491
- UNITY_CODEGEN_REVISION = "03bfbde6bcc46538292d7c03998e5a684d7a0a0bff8959f9aeaa8a38d18753f5";
156467
+ UNITY_CODEGEN_REVISION = "30d96d89e3d179ccf291e522834281f90dbd44b464cf51eea76aae87eed97e7e";
156492
156468
  }
156493
156469
  });
156494
156470
 
@@ -174074,6 +174050,7 @@ function selectedSpecPaths(workspace, selectors) {
174074
174050
  const normalizedSelectors = selectors.map(
174075
174051
  (selector) => selector.replaceAll("\\", "/").replace(/^\.\//u, "")
174076
174052
  );
174053
+ const realRoot = realpathSync2(workspace.root);
174077
174054
  for (const selector of normalizedSelectors) {
174078
174055
  if (/[*?]/u.test(selector)) continue;
174079
174056
  if (isAbsolute3(selector)) {
@@ -174090,7 +174067,7 @@ function selectedSpecPaths(workspace, selectors) {
174090
174067
  }
174091
174068
  if (!existsSync19(absolute)) continue;
174092
174069
  const real = realpathSync2(absolute);
174093
- const realRelative = relative9(workspace.root, real);
174070
+ const realRelative = relative9(realRoot, real);
174094
174071
  if (realRelative === ".." || realRelative.startsWith(`..${sep9}`)) {
174095
174072
  throw new Error(
174096
174073
  `Spec selector ${JSON.stringify(selector)} resolves outside the workspace through a symlink.`
@@ -182175,7 +182152,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
182175
182152
  async function main() {
182176
182153
  const args = parseArgs(process.argv.slice(2));
182177
182154
  if (args.command === "--version") {
182178
- console.log("0.70.3");
182155
+ console.log("0.70.4");
182179
182156
  return;
182180
182157
  }
182181
182158
  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.70.3",
3
+ "version": "0.70.4",
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.70.3 -->
12
+ <!-- reviewed-through-cli: 0.70.4 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -110,7 +110,7 @@ wrappers.
110
110
  The marker near the top of `SKILL.md` must exactly match the package version:
111
111
 
112
112
  ```html
113
- <!-- reviewed-through-cli: 0.70.3 -->
113
+ <!-- reviewed-through-cli: 0.70.4 -->
114
114
  ```
115
115
 
116
116
  The quoted version above is checked too, so this instruction cannot go stale