@neocompose/cli 0.50.5 → 0.50.6

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.50.6] - 2026-09-14
4
+
5
+ - Match server preparation when adding world placements by loading their layer links and binding values without expanding unchanged placement siblings.
6
+
3
7
  ## [0.50.5] - 2026-09-14
4
8
 
5
9
  - Resolve push references, rewrite assigned identities, and cascade scripted member edits without rescanning the project for each changed record. Reuse animation replay indexes and constructor validation across roots. Preserve list membership indexes when an initializer only replaces entry content.
package/dist/neo.mjs CHANGED
@@ -95528,6 +95528,16 @@ var init_project_version_relation_sweep_trigger = __esm({
95528
95528
  });
95529
95529
 
95530
95530
  // ../src/database/project-world-placement-bindings.ts
95531
+ function createdWorldPlacementIds(changes) {
95532
+ if (changes.length === 0) return null;
95533
+ const ids = /* @__PURE__ */ new Set();
95534
+ for (const change of changes) {
95535
+ if (change.recordKind !== "value" || change.operation !== "create" || change.deleted === true || !hasWorldPlacementSidecar(change.nextData))
95536
+ return null;
95537
+ ids.add(change.recordId);
95538
+ }
95539
+ return ids;
95540
+ }
95531
95541
  function hasWorldPlacementSidecar(value) {
95532
95542
  if (!isPlainRecord3(value) || !isPlainRecord3(value.value)) return false;
95533
95543
  const body = value.value;
@@ -96050,6 +96060,8 @@ function validateWorldContentSidecars(args) {
96050
96060
  valuesById
96051
96061
  });
96052
96062
  for (const placementId of placementIds) {
96063
+ if (args.placementIds !== void 0 && !args.placementIds.has(placementId))
96064
+ continue;
96053
96065
  const placement = valuesById.get(placementId);
96054
96066
  if (placement === void 0) {
96055
96067
  throw new Error(
@@ -96112,6 +96124,8 @@ function validateWorldContentSidecars(args) {
96112
96124
  placementList,
96113
96125
  containedIds
96114
96126
  )) {
96127
+ if (args.placementIds !== void 0 && !args.placementIds.has(placementId))
96128
+ continue;
96115
96129
  const placement = valuesById.get(placementId);
96116
96130
  if (placement === void 0) {
96117
96131
  throw new Error(
@@ -96133,6 +96147,8 @@ function validateWorldContentSidecars(args) {
96133
96147
  }
96134
96148
  }
96135
96149
  for (const value of args.values) {
96150
+ if (args.placementIds !== void 0 && !args.placementIds.has(value.id))
96151
+ continue;
96136
96152
  const record4 = valueObjectRecord(value);
96137
96153
  if (record4 === null) continue;
96138
96154
  if (optionalNonEmptyString(record4.assetClassId) !== null && !validatedPlacementIds.has(value.id) && !reachablePlacementIds.has(value.id)) {
@@ -103977,7 +103993,7 @@ function* prepareServerOwnedSchemaCommitPasses(args) {
103977
103993
  (change) => change.recordKind === "value"
103978
103994
  );
103979
103995
  const hasAdditionalContractImpact = (args.additionalImpactedIds?.size ?? 0) > 0 || (args.additionalChangedValueIds?.size ?? 0) > 0;
103980
- if (!hasSchemaChange && !hasMigrationChange && !hasDialogueSourceChange && !hasValueChange && !hasAdditionalContractImpact) {
103996
+ if (!hasSchemaChange && !hasMigrationChange && !hasDialogueSourceChange && !hasValueChange && !hasAdditionalContractImpact && (args.authoredValueSeeds?.length ?? 0) === 0) {
103981
103997
  return authoredChanges;
103982
103998
  }
103983
103999
  args.passLifecycle?.("start", "neo-script-recompile-targets");
@@ -108765,6 +108781,7 @@ function assertStagedWorldContentLayerBindingsValid(current, projected, changes)
108765
108781
  classes,
108766
108782
  relations,
108767
108783
  values: projected.values,
108784
+ placementIds: createdWorldPlacementIds(changes) ?? void 0,
108768
108785
  variants: worldPlacementVariantBindings({
108769
108786
  variants: projected.variants ?? [],
108770
108787
  variantFolders: projected.variantFolders ?? [],
@@ -112461,6 +112478,8 @@ function worldKindByClassId(document) {
112461
112478
  return result;
112462
112479
  }
112463
112480
  function commitPreparationWorldScopeKinds(args) {
112481
+ if (createdWorldPlacementIds(args.changes) !== null)
112482
+ return /* @__PURE__ */ new Set(["tileGrid", "tileLayerLink", "objectLayerLink"]);
112464
112483
  const allKinds = new Set(
112465
112484
  [...args.currentDocument.classes, ...args.postDocument.classes].flatMap(
112466
112485
  (schemaClass2) => typeof schemaClass2.system?.worldKind === "string" ? [schemaClass2.system.worldKind] : []
@@ -112612,7 +112631,10 @@ function planCommitPreparationInitialScope(args) {
112612
112631
  }
112613
112632
  if (change.recordKind !== "localized-text") {
112614
112633
  for (const valueId of collectStoredRecordIds(change.nextData))
112615
- rememberExact("value", valueId, true);
112634
+ rememberExact("value", valueId, change.recordKind !== "value");
112635
+ if (change.recordKind === "value")
112636
+ for (const valueId of collectStoredDescendantRecordIds(change.nextData))
112637
+ rememberExact("value", valueId, true);
112616
112638
  }
112617
112639
  }
112618
112640
  const currentTextsById = new Map(
@@ -113105,10 +113127,27 @@ function planCommitPreparationLoadedClosureScope(args) {
113105
113127
  });
113106
113128
  }
113107
113129
  }
113130
+ if (args.placementCreationScope && record4.recordKind === "value" && record4.data !== null && typeof record4.data === "object") {
113131
+ const body = Reflect.get(record4.data, "value");
113132
+ if (body !== null && typeof body === "object") {
113133
+ for (const key of [
113134
+ "Children",
113135
+ "Tiles",
113136
+ "Objects",
113137
+ "layerOverrideValueId"
113138
+ ])
113139
+ if (typeof Reflect.get(body, key) === "string")
113140
+ rememberExact("value", Reflect.get(body, key));
113141
+ }
113142
+ }
113108
113143
  if (record4.includeDescendants !== false) {
113109
113144
  for (const valueId of collectStoredRecordIds(record4.data)) {
113110
- rememberDescendant("value", valueId);
113145
+ if (record4.recordKind === "value") rememberExact("value", valueId);
113146
+ else rememberDescendant("value", valueId);
113111
113147
  }
113148
+ if (record4.recordKind === "value")
113149
+ for (const valueId of collectStoredDescendantRecordIds(record4.data))
113150
+ rememberDescendant("value", valueId);
113112
113151
  }
113113
113152
  }
113114
113153
  return {
@@ -113551,6 +113590,14 @@ function projectDocumentRecordsByKey(document) {
113551
113590
  add("value", document.values ?? []);
113552
113591
  return result;
113553
113592
  }
113593
+ function collectStoredDescendantRecordIds(value) {
113594
+ if (value === null || typeof value !== "object" || Array.isArray(value))
113595
+ return collectStoredRecordIds(value);
113596
+ const descendants = [];
113597
+ for (const [key, entry] of Object.entries(value))
113598
+ if (key !== "containerId") descendants.push(entry);
113599
+ return collectStoredRecordIds(descendants);
113600
+ }
113554
113601
  function collectStoredRecordIds(value) {
113555
113602
  const result = /* @__PURE__ */ new Set();
113556
113603
  const visit = (candidate) => {
@@ -114003,7 +114050,8 @@ function closeInMemoryLoadedScope(args) {
114003
114050
  records: closureRecords,
114004
114051
  rangeLimit: COMMIT_PREPARATION_SCOPE_RANGE_ROW_LIMIT,
114005
114052
  postingLimit: COMMIT_PREPARATION_SCOPE_POSTING_ROW_LIMIT,
114006
- animationSchema
114053
+ animationSchema,
114054
+ placementCreationScope: createdWorldPlacementIds(args.prepared) !== null
114007
114055
  });
114008
114056
  const answer = readCommitPreparationScopeInMemory({
114009
114057
  request,
@@ -114165,6 +114213,7 @@ var init_server_preparation_preflight = __esm({
114165
114213
  init_trusted_commit_verification();
114166
114214
  init_project_version_schema_commit();
114167
114215
  init_project_version_whole_graph_validation();
114216
+ init_project_world_placement_bindings();
114168
114217
  init_projectRecordBuckets();
114169
114218
  init_compile_ns_property();
114170
114219
  init_valueHeadPlacementGraph();
@@ -133193,7 +133242,7 @@ var init_registry2 = __esm({
133193
133242
  "schema-contract/registry.mjs"() {
133194
133243
  "use strict";
133195
133244
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
133196
- cliVersion: "0.50.5",
133245
+ cliVersion: "0.50.6",
133197
133246
  projectFileUploadBatchSize: 32,
133198
133247
  documentRecords: {
133199
133248
  member: {
@@ -140409,7 +140458,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
140409
140458
  async function main() {
140410
140459
  const args = parseArgs(process.argv.slice(2));
140411
140460
  if (args.command === "--version") {
140412
- console.log("0.50.5");
140461
+ console.log("0.50.6");
140413
140462
  return;
140414
140463
  }
140415
140464
  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.50.5",
3
+ "version": "0.50.6",
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.50.5 -->
12
+ <!-- reviewed-through-cli: 0.50.6 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -88,7 +88,7 @@ wrappers.
88
88
  The marker near the top of `SKILL.md` must exactly match the package version:
89
89
 
90
90
  ```html
91
- <!-- reviewed-through-cli: 0.50.5 -->
91
+ <!-- reviewed-through-cli: 0.50.6 -->
92
92
  ```
93
93
 
94
94
  The quoted version above is checked too, so this instruction cannot go stale