@neocompose/cli 0.51.1 → 0.51.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.51.2] - 2026-09-16
4
+
5
+ - Preserve aggregate arguments owned by declared constructors when materializing nested values, including `NeoCellPattern` values in stored bindings.
6
+ - Preserve local initializer identities when canonical source emission reorders unordered lists.
7
+ - Preserve texture and audio templates in script documents so tests and script evaluation can construct classes with template-backed sprite defaults.
8
+ - Identify a pending server derived-edge repair explicitly instead of recommending another pull to rebuild the index.
9
+ - Keep local tests and dialogue dry-runs available while the server's derived-edge index awaits repair. Push dry-runs still check the live server watermark.
10
+
3
11
  ## [0.51.1] - 2026-09-16
4
12
 
5
13
  - Refresh compiler-only changes with ordinary `neo pull` before compiling the local workspace. Preserve authored source, local edits, custom paths, and managed binaries while adopting the current server compilation.
package/dist/neo.mjs CHANGED
@@ -71079,15 +71079,14 @@ function ownedConstructorArgumentValues(row, ctx, readRow) {
71079
71079
  }
71080
71080
  const classId = row.classId;
71081
71081
  if (typeof classId !== "string") return [];
71082
- const schemaClass2 = evaluatorSchemaIndex(ctx).class(classId);
71083
- const requiredConstructorId2 = schemaClass2?.requiredConstructorId;
71084
- if (requiredConstructorId2 === void 0 || requiredConstructorId2 === null) {
71085
- return [];
71086
- }
71087
- const constructor2 = evaluatorSchemaIndex(ctx).constructorRecord(
71088
- requiredConstructorId2
71089
- );
71082
+ const constructorId = row.instanceConstructorId;
71083
+ if (constructorId === void 0 || constructorId === null) return [];
71084
+ const constructor2 = evaluatorSchemaIndex(ctx).constructorRecord(constructorId);
71090
71085
  if (constructor2 === void 0 || constructor2.classId !== classId) return [];
71086
+ if (!constructor2.argumentTypes.some(
71087
+ (typeInfo) => typeInfo.type === 7 /* Class */ || typeInfo.type === 22 /* Interface */ || typeInfo.type === 6 /* List */ || typeInfo.type === 5 /* Dictionary */ || typeInfo.type === 21 /* Generic */
71088
+ ))
71089
+ return [];
71091
71090
  let genericEnv = /* @__PURE__ */ new Map();
71092
71091
  try {
71093
71092
  genericEnv = runtimeGenericEnvForValueRow(row, ctx, /* @__PURE__ */ new Set(), readRow);
@@ -88797,6 +88796,15 @@ var init_localizable_member_value_writes = __esm({
88797
88796
  }
88798
88797
  });
88799
88798
 
88799
+ // ../src/database/project-snapshot-derived-edge-version.ts
88800
+ var PROJECT_SNAPSHOT_DERIVED_EDGE_EXTRACTOR_VERSION;
88801
+ var init_project_snapshot_derived_edge_version = __esm({
88802
+ "../src/database/project-snapshot-derived-edge-version.ts"() {
88803
+ "use strict";
88804
+ PROJECT_SNAPSHOT_DERIVED_EDGE_EXTRACTOR_VERSION = 4;
88805
+ }
88806
+ });
88807
+
88800
88808
  // ../src/database/project-snapshot-derived-edges.ts
88801
88809
  function extractProjectSnapshotDerivedEdges(source) {
88802
88810
  const edges = /* @__PURE__ */ new Map();
@@ -88955,7 +88963,7 @@ function collectDirectBodyChildIds(value) {
88955
88963
  function asRecord3(value) {
88956
88964
  return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
88957
88965
  }
88958
- var PROJECT_SNAPSHOT_DERIVED_EDGE_EXTRACTOR_VERSION, STORED_PROJECT_RECORD_ID_PATTERN;
88966
+ var STORED_PROJECT_RECORD_ID_PATTERN;
88959
88967
  var init_project_snapshot_derived_edges = __esm({
88960
88968
  "../src/database/project-snapshot-derived-edges.ts"() {
88961
88969
  "use strict";
@@ -88963,7 +88971,7 @@ var init_project_snapshot_derived_edges = __esm({
88963
88971
  init_neo_script_recompile_scope();
88964
88972
  init_member_kinds();
88965
88973
  init_packed_value_encoding();
88966
- PROJECT_SNAPSHOT_DERIVED_EDGE_EXTRACTOR_VERSION = 4;
88974
+ init_project_snapshot_derived_edge_version();
88967
88975
  STORED_PROJECT_RECORD_ID_PATTERN = /^(?:system_)?[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu;
88968
88976
  }
88969
88977
  });
@@ -115928,11 +115936,13 @@ function verifyProjectSourceCommitAgainstStateV4(args) {
115928
115936
  assignments
115929
115937
  );
115930
115938
  const usedAssignments = /* @__PURE__ */ new Set();
115939
+ const positionless = positionIndependentAssignments(assignments);
115940
+ const rewrite = (value) => rewritePending(value, assignments, usedAssignments, positionless);
115931
115941
  const expectedChanges = status.changes.map((change) => {
115932
- const rewrittenData = change.nextData === void 0 ? void 0 : rewritePending(change.nextData, assignments, usedAssignments);
115942
+ const rewrittenData = change.nextData === void 0 ? void 0 : rewrite(change.nextData);
115933
115943
  return {
115934
115944
  recordKind: change.recordKind,
115935
- recordId: rewritePending(change.recordId, assignments, usedAssignments),
115945
+ recordId: rewrite(change.recordId),
115936
115946
  operation: change.kind,
115937
115947
  // Source syntax does not author project ownership. The CLI stamps the
115938
115948
  // authenticated project id on creates immediately before transport;
@@ -115944,14 +115954,12 @@ function verifyProjectSourceCommitAgainstStateV4(args) {
115944
115954
  });
115945
115955
  const expectedSeeds = [...status.authoredValueSeeds].map(
115946
115956
  ([memberId, seed]) => ({
115947
- memberId: rewritePending(memberId, assignments, usedAssignments),
115948
- ...rewritePending(seed, assignments, usedAssignments)
115957
+ memberId: rewrite(memberId),
115958
+ ...rewrite(seed)
115949
115959
  })
115950
115960
  );
115951
- const expectedInitializerMaterialization = rewritePending(
115952
- status.localInitializerMaterialization ?? { roots: [] },
115953
- assignments,
115954
- usedAssignments
115961
+ const expectedInitializerMaterialization = rewrite(
115962
+ status.localInitializerMaterialization ?? { roots: [] }
115955
115963
  );
115956
115964
  for (const pendingId2 of assignments.keys()) {
115957
115965
  if (!usedAssignments.has(pendingId2)) {
@@ -116116,8 +116124,27 @@ function positionIndependentAssignments(assignments) {
116116
116124
  }
116117
116125
  return resolved;
116118
116126
  }
116119
- function rewritePending(value, assignments, used, byPosition) {
116120
- const positionless = byPosition ?? positionIndependentAssignments(assignments);
116127
+ function relocatedAssignment(pendingId2, assignments, byPosition) {
116128
+ const key = positionIndependentPendingKey(pendingId2);
116129
+ const relocated = key === null ? void 0 : byPosition.get(key);
116130
+ if (relocated !== void 0) return relocated;
116131
+ const virtual = pendingVirtualValueIdentity(pendingId2);
116132
+ if (virtual === null) return null;
116133
+ let relocatedRoot = virtual.instanceRootId;
116134
+ if (!assignments.has(relocatedRoot)) {
116135
+ const rootKey = positionIndependentPendingKey(relocatedRoot);
116136
+ if (rootKey === null) return null;
116137
+ const canonicalRoot = byPosition.get(rootKey);
116138
+ if (canonicalRoot === void 0) return null;
116139
+ relocatedRoot = canonicalRoot;
116140
+ }
116141
+ const relocatedVirtual = pendingVirtualValueId(
116142
+ relocatedRoot,
116143
+ virtual.sourceIdentity
116144
+ );
116145
+ return assignments.has(relocatedVirtual) ? relocatedVirtual : null;
116146
+ }
116147
+ function rewritePending(value, assignments, used, positionless) {
116121
116148
  if (typeof value === "string") {
116122
116149
  const exact = assignments.get(value);
116123
116150
  if (exact !== void 0) {
@@ -116125,9 +116152,8 @@ function rewritePending(value, assignments, used, byPosition) {
116125
116152
  return exact;
116126
116153
  }
116127
116154
  if (value.startsWith("__pending__:")) {
116128
- const key = positionIndependentPendingKey(value);
116129
- const relocated = key === null ? void 0 : positionless.get(key);
116130
- if (relocated !== void 0) {
116155
+ const relocated = relocatedAssignment(value, assignments, positionless);
116156
+ if (relocated !== null) {
116131
116157
  used.add(relocated);
116132
116158
  return assignments.get(relocated);
116133
116159
  }
@@ -116135,6 +116161,7 @@ function rewritePending(value, assignments, used, byPosition) {
116135
116161
  `Verified source identity ${value} has no pending id assignment.`
116136
116162
  );
116137
116163
  }
116164
+ if (!value.includes("__pending__:")) return value;
116138
116165
  let rewritten = value;
116139
116166
  for (const [pendingId2, assignedId] of assignments) {
116140
116167
  if (!rewritten.includes(pendingId2)) continue;
@@ -116452,7 +116479,6 @@ function assertServerPreparationSucceeds(args) {
116452
116479
  });
116453
116480
  if (refusal !== null) throw new ServerPreparationPreflightError(refusal);
116454
116481
  }
116455
- assertDerivedEdgeCompatibility(args.workspace);
116456
116482
  try {
116457
116483
  return prepareServerPreparationChanges({
116458
116484
  ...args,
@@ -116481,6 +116507,14 @@ function assertDerivedEdgeCompatibility(workspace) {
116481
116507
  `Project "${workspace.config.projectId}" has no derived-edge watermark. Run \`neo pull\` and retry. If this persists, repair the project's derived edge index.`
116482
116508
  );
116483
116509
  }
116510
+ if (serverVersion === 0) {
116511
+ throw new DerivedEdgeCompatibilityError(
116512
+ "server-stale",
116513
+ localVersion,
116514
+ serverVersion,
116515
+ `Project "${workspace.config.projectId}" has a pending server derived-edge repair (watermark 0). Wait for repair to complete and retry. If it remains pending, inspect the server repair status and logs; \`neo pull\` cannot rebuild this index.`
116516
+ );
116517
+ }
116484
116518
  if (serverVersion > localVersion) {
116485
116519
  throw new DerivedEdgeCompatibilityError(
116486
116520
  "cli-stale",
@@ -120506,7 +120540,9 @@ function structuralMemberByParameterName(context, effectiveClass) {
120506
120540
  function lowerSeedChild(context, member, expression, source, path, rows, localizedTexts, containerId, environment, authoredSlice) {
120507
120541
  const symbolId = sourceValueSymbol(context, expression);
120508
120542
  if (symbolId !== null) return symbolId;
120509
- const annotatedId = annotatedValue(expression).id;
120543
+ const annotatedId = annotatedValue(
120544
+ context.localValues.resolve(expression, source).expression
120545
+ ).id;
120510
120546
  const valueId = annotatedId ?? context.structuralStoredIds.get(path) ?? pendingNestedValueId(source, path);
120511
120547
  lowerSeedRow(
120512
120548
  context,
@@ -130576,6 +130612,8 @@ function readDocumentArrays(raw) {
130576
130612
  return {
130577
130613
  project: raw.project,
130578
130614
  projectFiles: arrayOf2("projectFiles"),
130615
+ textureTemplates: arrayOf2("textureTemplates"),
130616
+ audioClipTemplates: arrayOf2("audioClipTemplates"),
130579
130617
  members: arrayOf2("members"),
130580
130618
  classes: arrayOf2("classes"),
130581
130619
  constructors: arrayOf2("constructors"),
@@ -131396,6 +131434,7 @@ async function runScript(workspace, command, options, dependencies = {}) {
131396
131434
  variants: document.variants,
131397
131435
  variantFolders: document.variantFolders,
131398
131436
  projectFiles: document.projectFiles,
131437
+ textureTemplates: document.textureTemplates,
131399
131438
  localizationConfig: document.localizationConfig,
131400
131439
  localizedTexts: document.localizedTexts,
131401
131440
  ...runtime
@@ -134667,6 +134706,7 @@ async function prepareLocalCandidateV4(workspace, options = {}) {
134667
134706
  versionId: workspace.config.versionId
134668
134707
  });
134669
134708
  workspace.state.derivedEdgeVersion = signal?.derivedEdgeVersion ?? null;
134709
+ assertDerivedEdgeCompatibility(workspace);
134670
134710
  }
134671
134711
  preparedLocal = await prepareLocalPushArtifactsV4(
134672
134712
  workspace,
@@ -135006,7 +135046,8 @@ function createPendingProjectSourceIdentityV4(workspace, status, authoredValueSe
135006
135046
  recordFiles: projectRecordFilesV4(
135007
135047
  Object.values(workspace.state.records),
135008
135048
  status.reconstructed.values()
135009
- )
135049
+ ),
135050
+ localValues: status.localValues
135010
135051
  });
135011
135052
  const files = emission.files.map((file) => {
135012
135053
  const kind = neoProjectSourceKind(file.path, file.content);
@@ -136502,7 +136543,7 @@ var init_registry2 = __esm({
136502
136543
  "schema-contract/registry.mjs"() {
136503
136544
  "use strict";
136504
136545
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
136505
- cliVersion: "0.51.1",
136546
+ cliVersion: "0.51.2",
136506
136547
  projectFileUploadBatchSize: 32,
136507
136548
  documentRecords: {
136508
136549
  member: {
@@ -138099,6 +138140,7 @@ function sharedEvaluatorBase(rawDocument) {
138099
138140
  variants: document.variants,
138100
138141
  variantFolders: document.variantFolders,
138101
138142
  projectFiles: document.projectFiles,
138143
+ textureTemplates: document.textureTemplates,
138102
138144
  localizationConfig: document.localizationConfig,
138103
138145
  localizedTexts: document.localizedTexts,
138104
138146
  ...runtime
@@ -143731,7 +143773,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
143731
143773
  async function main() {
143732
143774
  const args = parseArgs(process.argv.slice(2));
143733
143775
  if (args.command === "--version") {
143734
- console.log("0.51.1");
143776
+ console.log("0.51.2");
143735
143777
  return;
143736
143778
  }
143737
143779
  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.51.1",
3
+ "version": "0.51.2",
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.51.1 -->
12
+ <!-- reviewed-through-cli: 0.51.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -90,7 +90,7 @@ wrappers.
90
90
  The marker near the top of `SKILL.md` must exactly match the package version:
91
91
 
92
92
  ```html
93
- <!-- reviewed-through-cli: 0.51.1 -->
93
+ <!-- reviewed-through-cli: 0.51.2 -->
94
94
  ```
95
95
 
96
96
  The quoted version above is checked too, so this instruction cannot go stale