@neocompose/cli 0.52.4 → 0.52.5

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,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.52.5] - 2026-09-17
4
+
5
+ - Materialize computed collection defaults, including `List.Repeat<T?>(null, count)`, as stored entries when seeding new instances.
6
+
3
7
  ## [0.52.4] - 2026-09-17
4
8
 
5
9
  - Accept declared list-index lookups in constructor arguments, including readable string keys such as `root.Assets.Items.Index.Slug["stone"]!`.
package/dist/neo.mjs CHANGED
@@ -55060,7 +55060,8 @@ function evaluateLiteralContainer(args) {
55060
55060
  const evaluated = args.initEvaluator(
55061
55061
  args.member,
55062
55062
  body.init,
55063
- args.sourceValueId
55063
+ args.sourceValueId,
55064
+ args.genericEnv
55064
55065
  );
55065
55066
  const literal3 = {
55066
55067
  value: evaluated.value,
@@ -55113,6 +55114,7 @@ function buildDefaultMemberValue(args) {
55113
55114
  if (documentHasInitValueContent(args.document, declaredDefault)) {
55114
55115
  const initializerCreatedValuesStart = args.createdValues.length;
55115
55116
  const evaluated = evaluateLiteralContainer({
55117
+ genericEnv: args.genericEnv,
55116
55118
  body: declaredDefault,
55117
55119
  member,
55118
55120
  initEvaluator: args.initEvaluator
@@ -55134,7 +55136,7 @@ function buildDefaultMemberValue(args) {
55134
55136
  value2.genericBindings = { ...evaluated.genericBindings };
55135
55137
  }
55136
55138
  if (evaluated.provisionalRootId !== void 0) {
55137
- retargetDelegateReceiverValueIds(
55139
+ retargetInitializerRootValueIds(
55138
55140
  [value2, ...args.createdValues.slice(initializerCreatedValuesStart)],
55139
55141
  evaluated.provisionalRootId,
55140
55142
  value2.id
@@ -55436,7 +55438,7 @@ function buildNewValue(projectId, body, timestamp2 = Date.now()) {
55436
55438
  }
55437
55439
  return props;
55438
55440
  }
55439
- function retargetDelegateReceiverValueIds(rows, fromValueId, toValueId) {
55441
+ function retargetInitializerRootValueIds(rows, fromValueId, toValueId) {
55440
55442
  const visited = /* @__PURE__ */ new WeakSet();
55441
55443
  const visit = (value) => {
55442
55444
  if (typeof value !== "object" || value === null) return;
@@ -55453,6 +55455,7 @@ function retargetDelegateReceiverValueIds(rows, fromValueId, toValueId) {
55453
55455
  for (const entry of Object.values(value)) visit(entry);
55454
55456
  };
55455
55457
  for (const row of rows) {
55458
+ if (row.containerId === fromValueId) row.containerId = toValueId;
55456
55459
  if (!isLiteralValueContent(row)) continue;
55457
55460
  visit(row.value);
55458
55461
  visit(row.constructorArgs);
@@ -55582,6 +55585,7 @@ function cloneDefaultValueForMember(args) {
55582
55585
  if (documentHasInitValueContent(args.document, sourceValue)) {
55583
55586
  const initializerCreatedValuesStart = args.createdValues.length;
55584
55587
  const evaluated = evaluateLiteralContainer({
55588
+ genericEnv: args.genericEnv,
55585
55589
  body: sourceValue,
55586
55590
  member,
55587
55591
  initEvaluator: args.initEvaluator,
@@ -55604,7 +55608,7 @@ function cloneDefaultValueForMember(args) {
55604
55608
  evaluatedRow.genericBindings = { ...evaluated.genericBindings };
55605
55609
  }
55606
55610
  if (evaluated.provisionalRootId !== void 0) {
55607
- retargetDelegateReceiverValueIds(
55611
+ retargetInitializerRootValueIds(
55608
55612
  [
55609
55613
  evaluatedRow,
55610
55614
  ...args.createdValues.slice(initializerCreatedValuesStart)
@@ -71334,6 +71338,29 @@ function evaluateNSGetterWithEffects(getter, ctx, argumentValues = [], options =
71334
71338
  if (getter.typeInfo.type === 20 /* Decimal */ && typeof result.value === "number") {
71335
71339
  result.value = coerceDecimalOperand(result.value, "return");
71336
71340
  }
71341
+ const initializerResult = options.initializerResult;
71342
+ if (initializerResult !== void 0 && result.value !== null && (isMemberListBase(initializerResult.member) || isMemberDictionaryBase(initializerResult.member)) && findKnownRowIdByValueReference(result.value, runtimeCtx) === null) {
71343
+ const createdValues = createdSessionValuesSince(runtimeCtx, creationCheckpoint);
71344
+ const declarations = /* @__PURE__ */ new Map();
71345
+ const root = materializeConstructorArgumentValue({
71346
+ member: initializerResult.member,
71347
+ value: result.value,
71348
+ genericEnv: initializerResult.genericEnv ?? /* @__PURE__ */ new Map(),
71349
+ ctx: runtimeCtx,
71350
+ createdValues,
71351
+ createdById: new Map(createdValues.map((row) => [row.id, row])),
71352
+ storageKeyDeclarations: declarations,
71353
+ collectionEntriesAreReferences: false
71354
+ });
71355
+ declarations.delete(root.id);
71356
+ publishConstructedRows({
71357
+ root,
71358
+ createdValues,
71359
+ storageKeyDeclarations: declarations,
71360
+ ctx: runtimeCtx
71361
+ });
71362
+ result.value = root.value;
71363
+ }
71337
71364
  if (options.exportInitializerValues) {
71338
71365
  const created = createdSessionValuesSince(
71339
71366
  runtimeCtx,
@@ -74997,17 +75024,19 @@ function readDeclarationDefault(member, ctx) {
74997
75024
  projectId: ctx.vm.project.id,
74998
75025
  member,
74999
75026
  createdValues: created,
75000
- initEvaluator: (child, init, sourceValueId) => withConstructionGenericSlots(
75027
+ initEvaluator: (child, init, sourceValueId, genericEnv = /* @__PURE__ */ new Map()) => withConstructionGenericSlots(
75001
75028
  child,
75002
75029
  ctx,
75003
- /* @__PURE__ */ new Map(),
75030
+ genericEnv,
75004
75031
  () => evaluateInitializerInContext(
75005
75032
  init,
75006
75033
  child,
75007
75034
  ctx,
75008
75035
  created,
75009
75036
  [],
75010
- sourceValueId
75037
+ sourceValueId,
75038
+ void 0,
75039
+ genericEnv
75011
75040
  )
75012
75041
  )
75013
75042
  });
@@ -77796,7 +77825,7 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
77796
77825
  }
77797
77826
  return null;
77798
77827
  };
77799
- return (member, init, sourceValueId) => {
77828
+ return (member, init, sourceValueId, genericEnv = instanceEnv) => {
77800
77829
  const memberId = Reflect.get(member, "id");
77801
77830
  const effectiveMemberId = typeof memberId === "string" ? memberId : null;
77802
77831
  const scopeMemberId = indexes2.initializerScopeMemberIds.get(init) ?? (typeof sourceValueId !== "string" ? void 0 : indexes2.initializerScopeMemberIdsByValueId.get(sourceValueId)) ?? effectiveMemberId;
@@ -77811,7 +77840,7 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
77811
77840
  return withConstructionGenericSlots(
77812
77841
  member,
77813
77842
  ctx,
77814
- instanceEnv,
77843
+ genericEnv,
77815
77844
  () => evaluateInitializerInContext(
77816
77845
  init,
77817
77846
  member,
@@ -77819,7 +77848,8 @@ function constructionInitEvaluator(ctx, createdValues, argumentScopes, construct
77819
77848
  createdValues,
77820
77849
  argumentValues,
77821
77850
  sourceValueId ?? null,
77822
- scopeMemberId
77851
+ scopeMemberId,
77852
+ genericEnv
77823
77853
  )
77824
77854
  );
77825
77855
  };
@@ -77956,7 +77986,7 @@ function runtimeValueReferencesVariable(value, variableId, visited = /* @__PURE_
77956
77986
  (child) => runtimeValueReferencesVariable(child, variableId, visited)
77957
77987
  );
77958
77988
  }
77959
- function evaluateInitializerInContext(init, member, ctx, createdValues, argumentValues = [], sourceValueId = null, compileMemberId) {
77989
+ function evaluateInitializerInContext(init, member, ctx, createdValues, argumentValues = [], sourceValueId = null, compileMemberId, genericEnv = /* @__PURE__ */ new Map()) {
77960
77990
  ctx.__constructedArgumentsByValue ??= /* @__PURE__ */ new WeakMap();
77961
77991
  const compiled = ensureInitializerCompiled({
77962
77992
  init,
@@ -77972,7 +78002,8 @@ function evaluateInitializerInContext(init, member, ctx, createdValues, argument
77972
78002
  result = evaluateNSGetterWithEffects(
77973
78003
  compiled,
77974
78004
  initializerCtx,
77975
- argumentValues
78005
+ argumentValues,
78006
+ { initializerResult: { member, genericEnv } }
77976
78007
  );
77977
78008
  } finally {
77978
78009
  closeFrame();
@@ -79620,6 +79651,9 @@ function cloneConstructorLiteralValue(value) {
79620
79651
  }
79621
79652
  function materializeConstructorArgumentValue(args) {
79622
79653
  const trackedValueId = findKnownRowIdByValueReference(args.value, args.ctx);
79654
+ if (args.value === null && !isRequiredMember2(args.member) && (isMemberListBase(args.member) || isMemberDictionaryBase(args.member))) {
79655
+ return registerConstructorArgumentRow(args, null);
79656
+ }
79623
79657
  if (isMemberClassBase(args.member)) {
79624
79658
  if (args.value === null || args.value === void 0) {
79625
79659
  if (isRequiredMember2(args.member)) {
@@ -79955,7 +79989,8 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
79955
79989
  initializerCreatedValues,
79956
79990
  argumentValues,
79957
79991
  sourceRow.id,
79958
- compileMemberId
79992
+ compileMemberId,
79993
+ isMemberListBase(sourceMember) || isMemberDictionaryBase(sourceMember) ? runtimeGenericEnvForValueRow(sourceRow, ctx, /* @__PURE__ */ new Set()) : void 0
79959
79994
  );
79960
79995
  if (evaluated.existingValueRow !== void 0) {
79961
79996
  const adoptedClone = cloneRow2(
@@ -79990,7 +80025,7 @@ function cloneClassValueGraph(receiver, expectedClassId, ctx) {
79990
80025
  Reflect.deleteProperty(clone, "containerId");
79991
80026
  }
79992
80027
  if (evaluated.provisionalRootId !== void 0) {
79993
- retargetDelegateReceiverValueIds(
80028
+ retargetInitializerRootValueIds(
79994
80029
  [clone, ...initializerCreatedValues],
79995
80030
  evaluated.provisionalRootId,
79996
80031
  clone.id
@@ -80555,6 +80590,7 @@ function evaluateInitializerMaterialization(args) {
80555
80590
  const createdValues = [];
80556
80591
  const storageKeyDeclarations = /* @__PURE__ */ new Map();
80557
80592
  const evaluated = args.evaluateInitializer({
80593
+ genericEnv: args.genericEnv,
80558
80594
  init: args.init,
80559
80595
  member: args.member,
80560
80596
  document: args.document,
@@ -80603,6 +80639,7 @@ function materializeInitializerValue(args) {
80603
80639
  ...args.storedConstructionReplay === true ? { storedConstructionReplay: true } : {},
80604
80640
  ...args.constructionBaselineReplay === true ? { constructionBaselineReplay: true } : {},
80605
80641
  ...args.argumentValues === void 0 ? {} : { argumentValues: args.argumentValues },
80642
+ genericEnv: envFromStamp(args.row.genericBindings),
80606
80643
  sourceValueId: args.row.id,
80607
80644
  readTracking: args.readTracking,
80608
80645
  saveStaticBindings: args.saveStaticBindings,
@@ -80631,7 +80668,7 @@ function materializeInitializerValue(args) {
80631
80668
  };
80632
80669
  const allCreated = [root, ...createdValues];
80633
80670
  if (evaluated.provisionalRootId !== void 0) {
80634
- retargetDelegateReceiverValueIds(
80671
+ retargetInitializerRootValueIds(
80635
80672
  allCreated,
80636
80673
  evaluated.provisionalRootId,
80637
80674
  root.id
@@ -80694,7 +80731,9 @@ function materializeMemberDefaultValue(args) {
80694
80731
  ...args.genericEnv === void 0 ? {} : { genericEnv: args.genericEnv },
80695
80732
  // A declaration default may itself be init-backed one level down (P43 §2),
80696
80733
  // and those nested initializers must evaluate against the same document.
80697
- initEvaluator: (member, init, sourceValueId) => args.evaluateInitializer({
80734
+ initEvaluator: (member, init, sourceValueId, genericEnv) => args.evaluateInitializer({
80735
+ genericEnv,
80736
+ storageKeyDeclarations,
80698
80737
  init,
80699
80738
  member,
80700
80739
  document: args.document,
@@ -80719,7 +80758,7 @@ function materializeMemberDefaultValue(args) {
80719
80758
  ...built.genericBindings == null ? {} : { genericBindings: { ...built.genericBindings } }
80720
80759
  };
80721
80760
  const allCreated = [root, ...interior];
80722
- retargetDelegateReceiverValueIds(allCreated, built.id, root.id);
80761
+ retargetInitializerRootValueIds(allCreated, built.id, root.id);
80723
80762
  finalizeMaterializedRoot({
80724
80763
  root,
80725
80764
  allCreated,
@@ -80736,6 +80775,7 @@ var init_initializer_materialization = __esm({
80736
80775
  init_deep_clone_plain_data();
80737
80776
  init_members();
80738
80777
  init_inheritance();
80778
+ init_generics();
80739
80779
  init_evaluateNSGetter();
80740
80780
  init_initializer_context();
80741
80781
  init_value_row_owner_members();
@@ -83772,7 +83812,10 @@ function evaluateMemberInitializer(args) {
83772
83812
  compiled,
83773
83813
  ctx,
83774
83814
  args.argumentValues ?? [],
83775
- { exportInitializerValues: true }
83815
+ {
83816
+ exportInitializerValues: true,
83817
+ initializerResult: { member: args.member, genericEnv: args.genericEnv }
83818
+ }
83776
83819
  );
83777
83820
  const created = result.createdSessionValues ?? [];
83778
83821
  if (isMemberLookupBase(args.member)) {
@@ -98983,7 +99026,8 @@ function isStringValueRecord(value) {
98983
99026
  return value !== null && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((entry) => typeof entry === "string");
98984
99027
  }
98985
99028
  function commitInitEvaluator(document, createdValues) {
98986
- return (member, init, sourceValueId) => evaluateMemberInitializer({
99029
+ return (member, init, sourceValueId, genericEnv) => evaluateMemberInitializer({
99030
+ genericEnv,
98987
99031
  init,
98988
99032
  member,
98989
99033
  document,
@@ -99002,10 +99046,19 @@ function assertConstructedGraphReferencesResolve(args) {
99002
99046
  const valueIds = new Set(args.document.values.map((value) => value.id));
99003
99047
  for (const site of sites) {
99004
99048
  if ((site.init.compiled?.parameters.length ?? 2) > 2) continue;
99049
+ if (site.sourceValueId === void 0 && [
99050
+ ...referencedGenericParams(
99051
+ resolveMember2(site.member, args.document.members),
99052
+ args.document.members
99053
+ )
99054
+ ].some((paramId) => site.genericEnv.get(paramId)?.kind !== "member"))
99055
+ continue;
99005
99056
  const createdValues = [];
99006
99057
  const produced = evaluateMemberInitializer({
99007
99058
  init: site.init,
99008
99059
  member: site.member,
99060
+ genericEnv: site.genericEnv,
99061
+ sourceValueId: site.sourceValueId,
99009
99062
  document: args.document,
99010
99063
  createdValues
99011
99064
  });
@@ -99037,6 +99090,10 @@ function collectTouchedInitializerSites(args) {
99037
99090
  if (!isInitValueContent(member.defaultValue)) continue;
99038
99091
  if (!changedConstructor && !changedMemberIds.has(member.id)) continue;
99039
99092
  sites.push({
99093
+ genericEnv: resolveDeclaringClassGenericEnv(
99094
+ member.id,
99095
+ args.document.classes
99096
+ ),
99040
99097
  label: `Member "${member.name}" (${member.id})`,
99041
99098
  member,
99042
99099
  init: member.defaultValue.init
@@ -99064,6 +99121,8 @@ function collectTouchedInitializerSites(args) {
99064
99121
  );
99065
99122
  }
99066
99123
  sites.push({
99124
+ genericEnv: envFromStamp(row.genericBindings),
99125
+ sourceValueId: row.id,
99067
99126
  label: `Value "${row.id}"`,
99068
99127
  member,
99069
99128
  init: row.init
@@ -99080,11 +99139,19 @@ function assertProducedGraphLookupsResolve(args) {
99080
99139
  projectId: args.document.project.id,
99081
99140
  value: args.produced.value,
99082
99141
  classId: args.produced.classId,
99142
+ ...args.produced.genericBindings === void 0 ? {} : { genericBindings: { ...args.produced.genericBindings } },
99083
99143
  ...args.produced.constructorArgs === void 0 ? {} : { constructorArgs: args.produced.constructorArgs },
99084
99144
  ...args.produced.instanceConstructorId === void 0 ? {} : { instanceConstructorId: args.produced.instanceConstructorId },
99085
99145
  createdAt: 0,
99086
99146
  updatedAt: 0
99087
99147
  };
99148
+ if (args.produced.provisionalRootId !== void 0) {
99149
+ retargetInitializerRootValueIds(
99150
+ graphValues,
99151
+ args.produced.provisionalRootId,
99152
+ rootRow.id
99153
+ );
99154
+ }
99088
99155
  const ownerByValueId = resolveSemanticOwnerMembersForValues(
99089
99156
  { ...args.document, values: [...graphValues, rootRow] },
99090
99157
  new Set(args.createdValues.map((value) => value.id)),
@@ -137722,7 +137789,7 @@ var init_registry2 = __esm({
137722
137789
  "schema-contract/registry.mjs"() {
137723
137790
  "use strict";
137724
137791
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
137725
- cliVersion: "0.52.4",
137792
+ cliVersion: "0.52.5",
137726
137793
  projectFileUploadBatchSize: 32,
137727
137794
  documentRecords: {
137728
137795
  member: {
@@ -145595,7 +145662,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
145595
145662
  async function main() {
145596
145663
  const args = parseArgs(process.argv.slice(2));
145597
145664
  if (args.command === "--version") {
145598
- console.log("0.52.4");
145665
+ console.log("0.52.5");
145599
145666
  return;
145600
145667
  }
145601
145668
  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.52.4",
3
+ "version": "0.52.5",
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.52.4 -->
12
+ <!-- reviewed-through-cli: 0.52.5 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -97,7 +97,7 @@ wrappers.
97
97
  The marker near the top of `SKILL.md` must exactly match the package version:
98
98
 
99
99
  ```html
100
- <!-- reviewed-through-cli: 0.52.4 -->
100
+ <!-- reviewed-through-cli: 0.52.5 -->
101
101
  ```
102
102
 
103
103
  The quoted version above is checked too, so this instruction cannot go stale