@neocompose/cli 0.65.0 → 0.65.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,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.65.1] - 2026-10-03
4
+
5
+ - Pull and push reconciliation emit a stored `new NeoAnimationSegmentFrame<NeoCollider?>(value: null)`. A null constructor argument typed by a class's generic parameter now checks nullability against the row's type argument. Previously, a pushed segment holding a null frame committed, but source reconciliation failed with "Required constructor argument stores null".
6
+ - Pulled type arguments keep a nullable binding's `?`, in constructions, references, and declared member types. Previously `FrameBox<NeoCollider?> Box` pulled as `FrameBox<NeoCollider> Box`, and the next push made the binding required.
7
+ - Code compiled from stored records keeps a nullable binding's `?`. A member declared `NeoAnimationSegmentFrame<NeoCollider?>` keeps that type, so passing it where that type is expected compiles, and reading its value as a required `NeoCollider` reports an error. Previously, every bound type argument was typed as required.
8
+
3
9
  ## [0.65.0] - 2026-10-03
4
10
 
5
11
  - Move `Collider` from `NeoObject` to `NeoObjectBase`, so sprite objects and layer groups can carry a box collider too. Unity codegen implements `INeoColliderSource` on `NeoObjectBase`.
package/dist/neo.mjs CHANGED
@@ -29955,7 +29955,7 @@ var init_registry = __esm({
29955
29955
  "../packages/manifest/schema-contract/registry.mjs"() {
29956
29956
  "use strict";
29957
29957
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
29958
- cliVersion: "0.65.0",
29958
+ cliVersion: "0.65.1",
29959
29959
  projectFileUploadBatchSize: 32,
29960
29960
  documentRecords: {
29961
29961
  member: {
@@ -52525,7 +52525,7 @@ function renderMemberType(context, member, enclosingClassId, elementSettings = f
52525
52525
  context,
52526
52526
  required(context.members, boundMemberId, "generic binding"),
52527
52527
  enclosingClassId
52528
- ).replace(/\?$/u, "");
52528
+ );
52529
52529
  });
52530
52530
  value = `${schemaClass2.name}${args.length ? `<${args.join(", ")}>` : ""}`;
52531
52531
  }
@@ -65468,13 +65468,11 @@ function classArguments(member, context, seen, genericEnvironment) {
65468
65468
  if (environmentEntry?.kind === "member") {
65469
65469
  const argument3 = analyzerMemberById(context, environmentEntry.memberId);
65470
65470
  return argument3 ? [
65471
- requiredType(
65472
- memberRuntimeType(
65473
- argument3,
65474
- context,
65475
- new Set(seen),
65476
- genericEnvironment
65477
- )
65471
+ memberRuntimeType(
65472
+ argument3,
65473
+ context,
65474
+ new Set(seen),
65475
+ genericEnvironment
65478
65476
  )
65479
65477
  ] : [];
65480
65478
  }
@@ -65489,13 +65487,11 @@ function classArguments(member, context, seen, genericEnvironment) {
65489
65487
  }
65490
65488
  const argument2 = analyzerMemberById(context, binding.memberId);
65491
65489
  return argument2 ? [
65492
- requiredType(
65493
- memberRuntimeType(
65494
- argument2,
65495
- context,
65496
- new Set(seen),
65497
- genericEnvironment
65498
- )
65490
+ memberRuntimeType(
65491
+ argument2,
65492
+ context,
65493
+ new Set(seen),
65494
+ genericEnvironment
65499
65495
  )
65500
65496
  ] : [];
65501
65497
  });
@@ -65682,11 +65678,7 @@ function genericConstraintLanguageType(constraint, context, genericEnvironment,
65682
65678
  ];
65683
65679
  }
65684
65680
  const member = analyzerMemberById(context, binding.memberId);
65685
- return member ? [
65686
- requiredType(
65687
- memberRuntimeType(member, context, /* @__PURE__ */ new Set(), genericEnvironment)
65688
- )
65689
- ] : [];
65681
+ return member ? [memberRuntimeType(member, context, /* @__PURE__ */ new Set(), genericEnvironment)] : [];
65690
65682
  });
65691
65683
  return {
65692
65684
  kind: "named",
@@ -127740,7 +127732,7 @@ function recordedStoredConstructorId(value, schemaClass2) {
127740
127732
  }
127741
127733
  function storedConstructorArgumentSource(context, type, value, environment, visited, cloneAggregateArguments = false, partial = false, constructorOwnsGraph = false) {
127742
127734
  if (value === null) {
127743
- if (!type.nullable) {
127735
+ if (!type.nullable && (type.kind !== "generic" || !storedGenericArgumentType(context, type, environment).nullable)) {
127744
127736
  throw new Error("Required constructor argument stores null.");
127745
127737
  }
127746
127738
  return "null";
@@ -127830,26 +127822,10 @@ function storedConstructorArgumentSource(context, type, value, environment, visi
127830
127822
  constructorOwnsGraph
127831
127823
  );
127832
127824
  }
127833
- case "generic": {
127834
- const bindingId = environment.get(type.genericParamId);
127835
- const inferredClassId = inferredGenericClassId(bindingId);
127836
- const resolvedType = inferredClassId === null ? bindingId === void 0 ? null : schemaTypeForBindingMember(context, bindingId, environment) : {
127837
- kind: "class",
127838
- nullable: type.nullable,
127839
- classId: inferredClassId,
127840
- classArguments: {}
127841
- };
127842
- if (resolvedType === null) {
127843
- throw new Error(
127844
- `Stored Generic constructor argument cannot resolve parameter ${type.genericParamId}.`
127845
- );
127846
- }
127825
+ case "generic":
127847
127826
  return storedConstructorArgumentSource(
127848
127827
  context,
127849
- withSchemaTypeNullability(
127850
- resolvedType,
127851
- type.nullable || resolvedType.nullable
127852
- ),
127828
+ storedGenericArgumentType(context, type, environment),
127853
127829
  value,
127854
127830
  environment,
127855
127831
  visited,
@@ -127857,7 +127833,6 @@ function storedConstructorArgumentSource(context, type, value, environment, visi
127857
127833
  partial,
127858
127834
  constructorOwnsGraph
127859
127835
  );
127860
- }
127861
127836
  case "interface":
127862
127837
  case "list":
127863
127838
  case "dictionary":
@@ -127908,6 +127883,25 @@ function storedConstructorArgumentSource(context, type, value, environment, visi
127908
127883
  );
127909
127884
  }
127910
127885
  }
127886
+ function storedGenericArgumentType(context, type, environment) {
127887
+ const bindingId = environment.get(type.genericParamId);
127888
+ const inferredClassId = inferredGenericClassId(bindingId);
127889
+ const resolvedType = inferredClassId === null ? bindingId === void 0 ? null : schemaTypeForBindingMember(context, bindingId, environment) : {
127890
+ kind: "class",
127891
+ nullable: type.nullable,
127892
+ classId: inferredClassId,
127893
+ classArguments: {}
127894
+ };
127895
+ if (resolvedType === null) {
127896
+ throw new Error(
127897
+ `Stored Generic constructor argument cannot resolve parameter ${type.genericParamId}.`
127898
+ );
127899
+ }
127900
+ return withSchemaTypeNullability(
127901
+ resolvedType,
127902
+ type.nullable || resolvedType.nullable
127903
+ );
127904
+ }
127911
127905
  function schemaTypeForBindingMember(context, memberId, environment, visited = /* @__PURE__ */ new Set()) {
127912
127906
  if (visited.has(memberId)) {
127913
127907
  throw new Error(
@@ -128073,6 +128067,10 @@ function storedAggregateReplaySource(context, type, valueId, environment, constr
128073
128067
  function isSharedConstructorArgument(context, valueId, constructorOwnsGraph) {
128074
128068
  return !constructorOwnsGraph && context.readMaterializedGraph().independentlyOwnedValueIds.has(valueId);
128075
128069
  }
128070
+ function storedTypeArgumentName(context, type, environment) {
128071
+ const settled = type.kind === "generic" ? storedGenericArgumentType(context, type, environment) : type;
128072
+ return `${storedSchemaTypeName(context, settled, environment)}${settled.nullable ? "?" : ""}`;
128073
+ }
128076
128074
  function storedSchemaTypeName(context, type, environment, valueId) {
128077
128075
  switch (type.kind) {
128078
128076
  case "unknown":
@@ -128085,7 +128083,7 @@ function storedSchemaTypeName(context, type, environment, valueId) {
128085
128083
  const argumentsValue = schemaClass2.genericParameters.flatMap(
128086
128084
  (parameter4) => {
128087
128085
  const argument2 = type.classArguments[parameter4.id];
128088
- return argument2 === void 0 ? [] : [storedSchemaTypeName(context, argument2, environment)];
128086
+ return argument2 === void 0 ? [] : [storedTypeArgumentName(context, argument2, environment)];
128089
128087
  }
128090
128088
  );
128091
128089
  return `${schemaClass2.name}${argumentsValue.length === 0 ? "" : `<${argumentsValue.join(", ")}>`}`;
@@ -128113,10 +128111,10 @@ function storedSchemaTypeName(context, type, environment, valueId) {
128113
128111
  return manifestMemberTypeName(context, member);
128114
128112
  }
128115
128113
  case "list":
128116
- return `List<${storedSchemaTypeName(context, type.entryType, environment)}>`;
128114
+ return `List<${storedTypeArgumentName(context, type.entryType, environment)}>`;
128117
128115
  case "dictionary": {
128118
128116
  const keyType = type.keyEnumId === null ? "string" : stringField3(context.enums.get(type.keyEnumId) ?? {}, "name");
128119
- return `Dictionary<${keyType}, ${storedSchemaTypeName(context, type.entryType, environment)}>`;
128117
+ return `Dictionary<${keyType}, ${storedTypeArgumentName(context, type.entryType, environment)}>`;
128120
128118
  }
128121
128119
  case "bool":
128122
128120
  case "int":
@@ -128333,10 +128331,13 @@ function classValueTypeName(context, classId, member, environment) {
128333
128331
  `Stored Class member ${String(member.name ?? member.id)} has no concrete ${parameter4.name} binding.`
128334
128332
  );
128335
128333
  }
128336
- return manifestMemberTypeName(context, bindingMember);
128334
+ return typeArgumentName(context, bindingMember);
128337
128335
  });
128338
128336
  return `${name}<${argumentsValue.join(", ")}>`;
128339
128337
  }
128338
+ function typeArgumentName(context, member) {
128339
+ return `${manifestMemberTypeName(context, member)}${member.required ? "" : "?"}`;
128340
+ }
128340
128341
  function manifestMemberTypeName(context, member) {
128341
128342
  if (member.kind === "class") {
128342
128343
  const schemaClass2 = context.manifestClasses.get(member.classId);
@@ -128357,7 +128358,7 @@ function manifestMemberTypeName(context, member) {
128357
128358
  `Stored generic binding ${binding.memberId} was not pulled.`
128358
128359
  );
128359
128360
  }
128360
- return manifestMemberTypeName(context, argument2);
128361
+ return typeArgumentName(context, argument2);
128361
128362
  });
128362
128363
  return `${schemaClass2.name}<${argumentsValue.join(", ")}>`;
128363
128364
  }
@@ -156205,7 +156206,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
156205
156206
  async function main() {
156206
156207
  const args = parseArgs(process.argv.slice(2));
156207
156208
  if (args.command === "--version") {
156208
- console.log("0.65.0");
156209
+ console.log("0.65.1");
156209
156210
  return;
156210
156211
  }
156211
156212
  if (args.command === null || args.command === "help" || args.command === "--help" || args.command === "-h") {
@@ -40639,13 +40639,11 @@ function classArguments(member, context, seen, genericEnvironment) {
40639
40639
  if (environmentEntry?.kind === "member") {
40640
40640
  const argument3 = analyzerMemberById(context, environmentEntry.memberId);
40641
40641
  return argument3 ? [
40642
- requiredType(
40643
- memberRuntimeType(
40644
- argument3,
40645
- context,
40646
- new Set(seen),
40647
- genericEnvironment
40648
- )
40642
+ memberRuntimeType(
40643
+ argument3,
40644
+ context,
40645
+ new Set(seen),
40646
+ genericEnvironment
40649
40647
  )
40650
40648
  ] : [];
40651
40649
  }
@@ -40660,13 +40658,11 @@ function classArguments(member, context, seen, genericEnvironment) {
40660
40658
  }
40661
40659
  const argument2 = analyzerMemberById(context, binding.memberId);
40662
40660
  return argument2 ? [
40663
- requiredType(
40664
- memberRuntimeType(
40665
- argument2,
40666
- context,
40667
- new Set(seen),
40668
- genericEnvironment
40669
- )
40661
+ memberRuntimeType(
40662
+ argument2,
40663
+ context,
40664
+ new Set(seen),
40665
+ genericEnvironment
40670
40666
  )
40671
40667
  ] : [];
40672
40668
  });
@@ -40853,11 +40849,7 @@ function genericConstraintLanguageType(constraint, context, genericEnvironment,
40853
40849
  ];
40854
40850
  }
40855
40851
  const member = analyzerMemberById(context, binding.memberId);
40856
- return member ? [
40857
- requiredType(
40858
- memberRuntimeType(member, context, /* @__PURE__ */ new Set(), genericEnvironment)
40859
- )
40860
- ] : [];
40852
+ return member ? [memberRuntimeType(member, context, /* @__PURE__ */ new Set(), genericEnvironment)] : [];
40861
40853
  });
40862
40854
  return {
40863
40855
  kind: "named",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.65.0",
3
+ "version": "0.65.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.65.0 -->
12
+ <!-- reviewed-through-cli: 0.65.1 -->
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.65.0 -->
113
+ <!-- reviewed-through-cli: 0.65.1 -->
114
114
  ```
115
115
 
116
116
  The quoted version above is checked too, so this instruction cannot go stale