@neocompose/cli 0.24.7 → 0.24.8

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,18 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.24.8] - 2026-08-08
4
+
5
+ ### Fixed
6
+
7
+ - Preserve generated Generic-slot initializers while closing their concrete
8
+ type. `NeoAnimationSegmentFrame<int>(value: 60)` now materializes `Value` as
9
+ `60` instead of replacing the initializer with the Int binding's fallback
10
+ `0`, keeping local and server construction graphs identical.
11
+ - Keep constructor-pane preview graphs stable while runtime values change, and
12
+ invalidate each animation segment lane only from the value rows that its
13
+ getter actually reads. Direction changes update the affected leaves without
14
+ reconstructing the ephemeral character graph.
15
+
3
16
  ## [0.24.7] - 2026-08-08
4
17
 
5
18
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -40044,6 +40044,9 @@ function substituteMember(member, env, members) {
40044
40044
  accessModifierKind: resolved.accessModifierKind,
40045
40045
  system: resolved.system ?? void 0
40046
40046
  };
40047
+ if (resolved.defaultValue !== void 0) {
40048
+ substituted.defaultValue = resolved.defaultValue;
40049
+ }
40047
40050
  const slotId = getOptionalString(member, "id");
40048
40051
  if (slotId !== void 0) {
40049
40052
  substituted.id = slotId;
@@ -56638,7 +56641,8 @@ function evalMemberById(vm, id2) {
56638
56641
  if (vm.databaseVM?.memberById) return vm.databaseVM.memberById(id2);
56639
56642
  return vm.members.find((a) => a.id === id2) ?? null;
56640
56643
  }
56641
- function evalValueById(vm, id2, runtimeValues, overlayValues) {
56644
+ function evalValueById(ctx, id2, runtimeValues, overlayValues) {
56645
+ const vm = ctx.vm;
56642
56646
  const runtime = runtimeValues?.get(id2);
56643
56647
  if (runtime !== void 0) return runtime;
56644
56648
  const overlay = overlayValues?.get(id2);
@@ -56908,7 +56912,7 @@ function evaluatorOwnershipDistances(rowId, indexes) {
56908
56912
  }
56909
56913
  function resolveRuntimeReferenceRow(sourceValueId, ctx) {
56910
56914
  const direct = evalValueById(
56911
- ctx.vm,
56915
+ ctx,
56912
56916
  sourceValueId,
56913
56917
  ctx.__runtimeSessionValues,
56914
56918
  ctx.__valueOverlay
@@ -57347,7 +57351,7 @@ function finalizeConstructorAllocations(ctx, returnValue, ownsInvocationState, r
57347
57351
  if (scannedRows.has(valueId)) return;
57348
57352
  scannedRows.add(valueId);
57349
57353
  const row = evalValueById(
57350
- ctx.vm,
57354
+ ctx,
57351
57355
  valueId,
57352
57356
  ctx.__runtimeSessionValues,
57353
57357
  ctx.__valueOverlay
@@ -57357,7 +57361,7 @@ function finalizeConstructorAllocations(ctx, returnValue, ownsInvocationState, r
57357
57361
  const { id: argumentId, typeInfo } = argument2;
57358
57362
  if (groupByRowId.has(argumentId)) scanOwnedRow(argumentId);
57359
57363
  const argumentRow = evalValueById(
57360
- ctx.vm,
57364
+ ctx,
57361
57365
  argumentId,
57362
57366
  ctx.__runtimeSessionValues,
57363
57367
  ctx.__valueOverlay
@@ -58210,7 +58214,7 @@ function applyOverlayAssignment(target, targetTypeInfo, value, scope, ctx) {
58210
58214
  const existing2 = receiver[index];
58211
58215
  if (typeof existing2 === "string") {
58212
58216
  const row = evalValueById(
58213
- ctx.vm,
58217
+ ctx,
58214
58218
  existing2,
58215
58219
  ctx.__runtimeSessionValues,
58216
58220
  ctx.__valueOverlay
@@ -58247,7 +58251,7 @@ function applyOverlayAssignment(target, targetTypeInfo, value, scope, ctx) {
58247
58251
  const existing = object2[stringKey];
58248
58252
  if (typeof existing === "string") {
58249
58253
  const row = evalValueById(
58250
- ctx.vm,
58254
+ ctx,
58251
58255
  existing,
58252
58256
  ctx.__runtimeSessionValues,
58253
58257
  ctx.__valueOverlay
@@ -58297,7 +58301,7 @@ function applyOverlayStaticAssignment(memberId, value, ctx) {
58297
58301
  }
58298
58302
  if (!referenceAssignment && currentId !== null) {
58299
58303
  const row2 = evalValueById(
58300
- ctx.vm,
58304
+ ctx,
58301
58305
  currentId,
58302
58306
  ctx.__runtimeSessionValues,
58303
58307
  ctx.__valueOverlay
@@ -58803,7 +58807,7 @@ function evalStaticMember(memberId, ctx) {
58803
58807
  return null;
58804
58808
  }
58805
58809
  const row = evalValueById(
58806
- ctx.vm,
58810
+ ctx,
58807
58811
  targetId,
58808
58812
  ctx.__runtimeSessionValues,
58809
58813
  ctx.__valueOverlay
@@ -58813,6 +58817,7 @@ function evalStaticMember(memberId, ctx) {
58813
58817
  `Static member '${member.name}' is bound to missing value '${targetId}'.`
58814
58818
  );
58815
58819
  }
58820
+ ctx.valueDependencies?.add(row.id);
58816
58821
  return row.value;
58817
58822
  }
58818
58823
  function evalPointer(pointer, scope, ctx) {
@@ -59098,7 +59103,7 @@ function invokeDelegateValue(value, args, ctx, callSiteId) {
59098
59103
  let receiver = null;
59099
59104
  if (value.valueId !== null) {
59100
59105
  const row = evalValueById(
59101
- ctx.vm,
59106
+ ctx,
59102
59107
  value.valueId,
59103
59108
  ctx.__runtimeSessionValues,
59104
59109
  ctx.__valueOverlay
@@ -59225,7 +59230,7 @@ function delegateClosureLexicalThis(closure, ctx) {
59225
59230
  )) {
59226
59231
  if (ancestorId === closureRow.id) continue;
59227
59232
  const ancestor = evalValueById(
59228
- ctx.vm,
59233
+ ctx,
59229
59234
  ancestorId,
59230
59235
  ctx.__runtimeSessionValues,
59231
59236
  ctx.__valueOverlay
@@ -59371,7 +59376,7 @@ function runtimeParentGenericEnv(row, ctx, visited) {
59371
59376
  const result = /* @__PURE__ */ new Map();
59372
59377
  for (const link of evaluatorParentLinks(evaluatorIndexes(ctx), row.id)) {
59373
59378
  const parent = evalValueById(
59374
- ctx.vm,
59379
+ ctx,
59375
59380
  link.parentId,
59376
59381
  ctx.__runtimeSessionValues,
59377
59382
  ctx.__valueOverlay
@@ -60042,12 +60047,13 @@ function resolveAssetRuntimeMember(receiver, memberName, ctx) {
60042
60047
  function resolveValueIfId(at, ctx) {
60043
60048
  if (typeof at !== "string") return at;
60044
60049
  const row = evalValueById(
60045
- ctx.vm,
60050
+ ctx,
60046
60051
  at,
60047
60052
  ctx.__runtimeSessionValues,
60048
60053
  ctx.__valueOverlay
60049
60054
  );
60050
60055
  if (!row) return at;
60056
+ ctx.valueDependencies?.add(row.id);
60051
60057
  const member = memberForValueRow(row, ctx);
60052
60058
  const value = member === null ? resolveLocalizedRowValue(row, ctx) : resolveLocalizedRowValueForMember(row, member, ctx);
60053
60059
  return shouldUnwrapSingleLookupValue(member) ? unwrapSingleLookupValue(value, ctx) : value;
@@ -60055,12 +60061,13 @@ function resolveValueIfId(at, ctx) {
60055
60061
  function resolveValueIfIdForMember(at, member, ctx) {
60056
60062
  if (typeof at !== "string") return at;
60057
60063
  const row = evalValueById(
60058
- ctx.vm,
60064
+ ctx,
60059
60065
  at,
60060
60066
  ctx.__runtimeSessionValues,
60061
60067
  ctx.__valueOverlay
60062
60068
  );
60063
60069
  if (!row) return at;
60070
+ ctx.valueDependencies?.add(row.id);
60064
60071
  const value = resolveLocalizedRowValueForMember(row, member, ctx);
60065
60072
  return shouldUnwrapSingleLookupValue(member) ? unwrapSingleLookupValue(value, ctx) : value;
60066
60073
  }
@@ -60072,12 +60079,15 @@ function shouldUnwrapSingleLookupValue(member) {
60072
60079
  function unwrapSingleLookupValue(value, ctx) {
60073
60080
  if (Array.isArray(value) && value.length === 1 && typeof value[0] === "string") {
60074
60081
  const next = evalValueById(
60075
- ctx.vm,
60082
+ ctx,
60076
60083
  value[0],
60077
60084
  ctx.__runtimeSessionValues,
60078
60085
  ctx.__valueOverlay
60079
60086
  );
60080
- if (next) return next.value;
60087
+ if (next) {
60088
+ ctx.valueDependencies?.add(next.id);
60089
+ return next.value;
60090
+ }
60081
60091
  }
60082
60092
  return value;
60083
60093
  }
@@ -60118,7 +60128,7 @@ function resolveMemberForValueRow(row, ctx, visited) {
60118
60128
  }
60119
60129
  for (const link of evaluatorParentLinks(indexes, row.id)) {
60120
60130
  const parent = evalValueById(
60121
- ctx.vm,
60131
+ ctx,
60122
60132
  link.parentId,
60123
60133
  ctx.__runtimeSessionValues,
60124
60134
  ctx.__valueOverlay
@@ -60443,7 +60453,7 @@ function evalDeclaredListIndex(info, scope, ctx) {
60443
60453
  for (const valueId of collection) {
60444
60454
  if (typeof valueId !== "string") continue;
60445
60455
  const row = evalValueById(
60446
- ctx.vm,
60456
+ ctx,
60447
60457
  valueId,
60448
60458
  ctx.__runtimeSessionValues,
60449
60459
  ctx.__valueOverlay
@@ -61028,7 +61038,7 @@ function applyConstructorFields(args) {
61028
61038
  const trackedValueId = findKnownRowIdByValueReference(value, ctx);
61029
61039
  if (trackedValueId !== null && isMemberClassBase(member)) {
61030
61040
  const source = evalValueById(
61031
- ctx.vm,
61041
+ ctx,
61032
61042
  trackedValueId,
61033
61043
  ctx.__runtimeSessionValues,
61034
61044
  ctx.__valueOverlay
@@ -61139,7 +61149,7 @@ function bindConstructedDelegateTargets(rootId, ctx) {
61139
61149
  if (rowId === void 0 || visited.has(rowId)) continue;
61140
61150
  visited.add(rowId);
61141
61151
  const row = evalValueById(
61142
- ctx.vm,
61152
+ ctx,
61143
61153
  rowId,
61144
61154
  ctx.__runtimeSessionValues,
61145
61155
  ctx.__valueOverlay
@@ -61171,7 +61181,7 @@ function bindConstructedDelegateTargets(rootId, ctx) {
61171
61181
  indexes
61172
61182
  )) {
61173
61183
  const ancestor = evalValueById(
61174
- ctx.vm,
61184
+ ctx,
61175
61185
  ancestorId,
61176
61186
  ctx.__runtimeSessionValues,
61177
61187
  ctx.__valueOverlay
@@ -62318,7 +62328,7 @@ function constructDeclaredClassValueWithinFrame(descriptor, record3, info, scope
62318
62328
  }
62319
62329
  function assertOwnedValueAttachable(valueId, destination, destinationName2, ctx, reserveUntilPublished = false) {
62320
62330
  const row = evalValueById(
62321
- ctx.vm,
62331
+ ctx,
62322
62332
  valueId,
62323
62333
  ctx.__runtimeSessionValues,
62324
62334
  ctx.__valueOverlay
@@ -62364,7 +62374,7 @@ function currentOwnedValueAttachments(valueId, ctx) {
62364
62374
  found.set(attachment.identity, attachment);
62365
62375
  };
62366
62376
  const row = evalValueById(
62367
- ctx.vm,
62377
+ ctx,
62368
62378
  valueId,
62369
62379
  ctx.__runtimeSessionValues,
62370
62380
  ctx.__valueOverlay
@@ -62401,7 +62411,7 @@ function currentOwnedValueAttachments(valueId, ctx) {
62401
62411
  );
62402
62412
  for (const parentId of parentIds) {
62403
62413
  const parent = evalValueById(
62404
- ctx.vm,
62414
+ ctx,
62405
62415
  parentId,
62406
62416
  ctx.__runtimeSessionValues,
62407
62417
  ctx.__valueOverlay
@@ -62469,7 +62479,7 @@ function constructorArgumentStorage(valueId, ctx, visiting = /* @__PURE__ */ new
62469
62479
  if (visiting.has(valueId)) return null;
62470
62480
  visiting.add(valueId);
62471
62481
  const row = evalValueById(
62472
- ctx.vm,
62482
+ ctx,
62473
62483
  valueId,
62474
62484
  ctx.__runtimeSessionValues,
62475
62485
  ctx.__valueOverlay
@@ -62491,7 +62501,7 @@ function constructorArgumentStorage(valueId, ctx, visiting = /* @__PURE__ */ new
62491
62501
  const parentIds = /* @__PURE__ */ new Set();
62492
62502
  for (const owner of currentOwnedValueAttachments(valueId, ctx)) {
62493
62503
  if (evalValueById(
62494
- ctx.vm,
62504
+ ctx,
62495
62505
  owner.label,
62496
62506
  ctx.__runtimeSessionValues,
62497
62507
  ctx.__valueOverlay
@@ -62601,7 +62611,7 @@ function cloneConstructorArgumentGraph(args) {
62601
62611
  args.ctx
62602
62612
  );
62603
62613
  const child = evalValueById(
62604
- args.ctx.vm,
62614
+ args.ctx,
62605
62615
  childId,
62606
62616
  args.ctx.__runtimeSessionValues,
62607
62617
  args.ctx.__valueOverlay
@@ -62637,7 +62647,7 @@ function cloneConstructorArgumentGraph(args) {
62637
62647
  );
62638
62648
  }
62639
62649
  const child = evalValueById(
62640
- args.ctx.vm,
62650
+ args.ctx,
62641
62651
  childId,
62642
62652
  args.ctx.__runtimeSessionValues,
62643
62653
  args.ctx.__valueOverlay
@@ -62684,7 +62694,7 @@ function cloneConstructorArgumentGraph(args) {
62684
62694
  );
62685
62695
  }
62686
62696
  const child = evalValueById(
62687
- args.ctx.vm,
62697
+ args.ctx,
62688
62698
  childId,
62689
62699
  args.ctx.__runtimeSessionValues,
62690
62700
  args.ctx.__valueOverlay
@@ -62726,7 +62736,7 @@ function materializeConstructorArgumentValue(args) {
62726
62736
  }
62727
62737
  if (trackedValueId !== null) {
62728
62738
  const tracked = evalValueById(
62729
- args.ctx.vm,
62739
+ args.ctx,
62730
62740
  trackedValueId,
62731
62741
  args.ctx.__runtimeSessionValues,
62732
62742
  args.ctx.__valueOverlay
@@ -62909,7 +62919,7 @@ function assertConstructorClassValueAdmitted(args) {
62909
62919
  function constructorCollectionEntryValue(value, ctx, resolveStoredId) {
62910
62920
  if (!resolveStoredId || typeof value !== "string") return value;
62911
62921
  const row = evalValueById(
62912
- ctx.vm,
62922
+ ctx,
62913
62923
  value,
62914
62924
  ctx.__runtimeSessionValues,
62915
62925
  ctx.__valueOverlay
@@ -62959,7 +62969,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
62959
62969
  );
62960
62970
  }
62961
62971
  const source = evalValueById(
62962
- ctx.vm,
62972
+ ctx,
62963
62973
  sourceId3,
62964
62974
  ctx.__runtimeSessionValues,
62965
62975
  ctx.__valueOverlay
@@ -63024,7 +63034,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
63024
63034
  const childTypeInfo = sourceTypeInfo?.type === 5 /* Dictionary */ ? sourceTypeInfo.entryTypeInfo : void 0;
63025
63035
  if (childMember === null && childTypeInfo === void 0) continue;
63026
63036
  const child = evalValueById(
63027
- ctx.vm,
63037
+ ctx,
63028
63038
  childId,
63029
63039
  ctx.__runtimeSessionValues,
63030
63040
  ctx.__valueOverlay
@@ -63045,7 +63055,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
63045
63055
  clone.value = sourceRow.value.map((childId) => {
63046
63056
  if (typeof childId !== "string") return childId;
63047
63057
  const child = evalValueById(
63048
- ctx.vm,
63058
+ ctx,
63049
63059
  childId,
63050
63060
  ctx.__runtimeSessionValues,
63051
63061
  ctx.__valueOverlay
@@ -63075,7 +63085,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
63075
63085
  }
63076
63086
  if (constructorArgumentReferenceCounts.get(argument2.id) !== 1) continue;
63077
63087
  const argumentRow = evalValueById(
63078
- ctx.vm,
63088
+ ctx,
63079
63089
  argument2.id,
63080
63090
  ctx.__runtimeSessionValues,
63081
63091
  ctx.__valueOverlay
@@ -101660,7 +101670,7 @@ var init_registry2 = __esm({
101660
101670
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
101661
101671
  formatVersion: 3,
101662
101672
  contractVersion: "3.9",
101663
- cliVersion: "0.24.7",
101673
+ cliVersion: "0.24.8",
101664
101674
  projectFileUploadBatchSize: 32,
101665
101675
  documentRecords: {
101666
101676
  member: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.24.7",
3
+ "version": "0.24.8",
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.24.7 -->
12
+ <!-- reviewed-through-cli: 0.24.8 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -127,6 +127,10 @@ Use `NeoAnimationSegment<T>` for a frame-indexed value lane. The shipped
127
127
  sprite specialization is `NeoSpriteAnimationSegment`, whose
128
128
  `NeoAnimationSegmentFrame<SpriteInfo>` rows each provide `Index` and
129
129
  `Value`. Sparse frame values hold until the next row or `Duration`.
130
+ Pass `Value` through the frame constructor (for example,
131
+ `new NeoAnimationSegmentFrame<int>(value: 60)`). The constructor argument is
132
+ the frame's authored value; it must not collapse to the concrete generic
133
+ binding's fallback while the segment is materialized.
130
134
 
131
135
  Use one polymorphic `NeoAnimationClip.Tracks` list:
132
136
 
@@ -82,7 +82,7 @@ wrappers.
82
82
  The marker near the top of `SKILL.md` must exactly match the package version:
83
83
 
84
84
  ```html
85
- <!-- reviewed-through-cli: 0.24.7 -->
85
+ <!-- reviewed-through-cli: 0.24.8 -->
86
86
  ```
87
87
 
88
88
  The quoted version above is checked too, so this instruction cannot go stale