@neocompose/cli 0.57.2 → 0.58.0

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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.58.0] - 2026-09-24
4
+
5
+ - **Behavior change:** NeoScript cell queries the CLI evaluates, such as in `neo test`, no longer return an object that has no placement tiles. Before, such an object answered for its origin cell. This matches the Unity SDK (0.43.0) and the web editor: `PlacementTiles` are the cells an object occupies, and without them it occupies none.
6
+
7
+ ## [0.57.3] - 2026-09-24
8
+
9
+ - Status, pull, and push no longer copy a shared row passed to a constructor when they check a stored construction. Before, a constructor argument that named a shared row, such as a schedule event's `area`, copied that row's whole graph for every construction. Once an area grid held a few placed characters, this failed with "NeoScript constructed Session row limit of 4096 exceeded."
10
+ - Dry run and push no longer read a shared constructor argument's current graph when they check a stored construction. Before, a push that deleted a variant still placed in that graph, such as a character in the area a schedule event names, failed with "Variant '…' does not exist in this project."
11
+ - `neo dialogue dryrun` evaluates conditions that have the dialogue context in scope. Before, every such condition failed with "NeoScript getter expected 1 argument(s), got 0."
12
+
3
13
  ## [0.57.2] - 2026-09-23
4
14
 
5
15
  - Removing a variant's last `overrides:` argument deletes its stored override row. Dry run and push accept the edit, including variants whose initializer is an inline delegate.
package/dist/neo.mjs CHANGED
@@ -70414,7 +70414,6 @@ function buildIndex(source) {
70414
70414
  seen.add(key);
70415
70415
  }
70416
70416
  }
70417
- if (footprint.length === 0) footprint.push(cell);
70418
70417
  const placement = {
70419
70418
  valueId,
70420
70419
  isNeoObject: kinds.get(row.classId) === NeoWorldSystemClassKind.Object,
@@ -72067,7 +72066,9 @@ function evaluateNSGetterWithEffects(getter, ctx, argumentValues = [], options =
72067
72066
  const writes = runtimeCtx.__executionState?.writes ?? requestedWrites;
72068
72067
  const creationCheckpoint = sessionCreationCheckpoint(runtimeCtx);
72069
72068
  const scope = createTopLevelScope(runtimeCtx);
72070
- const parameters = getter.parameters.slice(2);
72069
+ const parameters = getter.parameters.slice(
72070
+ getter.parameters[2]?.id === DIALOGUE_CONTEXT_PARAMETER_ID ? 3 : 2
72071
+ );
72071
72072
  if (parameters.length !== argumentValues.length) {
72072
72073
  throw new NSGetterRuntimeError(
72073
72074
  `NeoScript getter expected ${parameters.length} argument(s), got ${argumentValues.length}.`
@@ -72942,7 +72943,7 @@ function createTopLevelScope(ctx) {
72942
72943
  scope.setLocal("__this__", ctx.thisValue);
72943
72944
  scope.setLocal("__root__", ctx.rootValue);
72944
72945
  scope.setLocal(
72945
- "__context__",
72946
+ DIALOGUE_CONTEXT_PARAMETER_ID,
72946
72947
  ctx.dialogueContext ?? {
72947
72948
  primary: null,
72948
72949
  trigger: null
@@ -81208,7 +81209,7 @@ function collectionEntryUsesReferenceResolution(collection, key, ctx) {
81208
81209
  );
81209
81210
  return referenceIndexes === void 0 || referenceIndexes.has(key);
81210
81211
  }
81211
- var DELEGATE_LEXICAL_THIS, DELEGATE_LEXICAL_ROOT, NonCatchableNSGetterRuntimeError, NativeFunctionDelegateUnavailableError, CorruptNeoScriptIRError, NeoScriptResourceLimitError, NeoScriptWallClockTimeoutError, DEFAULT_NEO_SCRIPT_EXECUTION_BUDGET_LIMITS, liveListIndexesByProject, evaluatorOwnershipCachesByBase, MAX_CONSTRUCTION_DEPTH, MAX_LOOP_ITERATIONS, resolutionCacheByMembers, NO_SCHEMA_REVISION, LazyValueOverlay, READONLY_FOREACH_BINDING_ERROR, READONLY_CATCH_BINDING_ERROR, NS_MATH_OP_NAMES, DOUBLE_INTEGRAL_MAGNITUDE, EMPTY_SUPPLIED_CONSTRUCTOR_FIELDS;
81212
+ var DELEGATE_LEXICAL_THIS, DELEGATE_LEXICAL_ROOT, NonCatchableNSGetterRuntimeError, NativeFunctionDelegateUnavailableError, CorruptNeoScriptIRError, NeoScriptResourceLimitError, NeoScriptWallClockTimeoutError, DEFAULT_NEO_SCRIPT_EXECUTION_BUDGET_LIMITS, liveListIndexesByProject, evaluatorOwnershipCachesByBase, MAX_CONSTRUCTION_DEPTH, MAX_LOOP_ITERATIONS, resolutionCacheByMembers, NO_SCHEMA_REVISION, LazyValueOverlay, READONLY_FOREACH_BINDING_ERROR, READONLY_CATCH_BINDING_ERROR, DIALOGUE_CONTEXT_PARAMETER_ID, NS_MATH_OP_NAMES, DOUBLE_INTEGRAL_MAGNITUDE, EMPTY_SUPPLIED_CONSTRUCTOR_FIELDS;
81212
81213
  var init_evaluateNSGetter = __esm({
81213
81214
  "../src/runtime/neoscript/evaluateNSGetter.ts"() {
81214
81215
  "use strict";
@@ -81377,6 +81378,7 @@ var init_evaluateNSGetter = __esm({
81377
81378
  };
81378
81379
  READONLY_FOREACH_BINDING_ERROR = "Cannot assign to a read-only foreach iterator binding.";
81379
81380
  READONLY_CATCH_BINDING_ERROR = "Cannot assign to a read-only catch message binding.";
81381
+ DIALOGUE_CONTEXT_PARAMETER_ID = "__context__";
81380
81382
  NS_MATH_OP_NAMES = {
81381
81383
  min: "Min",
81382
81384
  max: "Max",
@@ -117187,12 +117189,13 @@ function materializedInitializerReconciliationFailuresV4(args) {
117187
117189
  const replay = replayRows.get(reconciliation.valueId);
117188
117190
  const replayArgs = replay !== void 0 && isLiteralValueContent(replay) ? replay.constructorArgs : void 0;
117189
117191
  const currentRoot = currentRows.get(reconciliation.valueId);
117192
+ const [storedArgs, replayedArgs] = isObjectRecord2(replayArgs) ? withoutSharedArguments(reconciliation.storedConstructorArgs, replayArgs) : [reconciliation.storedConstructorArgs, replayArgs];
117190
117193
  const currentNormalized = currentRoot === void 0 ? void 0 : currentReader.normalizeConstructorArguments(
117191
- reconciliation.storedConstructorArgs,
117194
+ storedArgs,
117192
117195
  currentRoot,
117193
117196
  owner
117194
117197
  );
117195
- const replayNormalized = replay === void 0 || !isObjectRecord2(replayArgs) ? void 0 : currentReader.withRowOverrides(replayRows).normalizeConstructorArguments(replayArgs, replay, owner);
117198
+ const replayNormalized = replay === void 0 || !isObjectRecord2(replayedArgs) ? void 0 : currentReader.withRowOverrides(replayRows).normalizeConstructorArguments(replayedArgs, replay, owner);
117196
117199
  const argumentsMatch = isObjectRecord2(replayArgs) && currentRoot !== void 0 && replay !== void 0 && effectiveValuesEqual(currentNormalized, replayNormalized);
117197
117200
  if (argumentsMatch) {
117198
117201
  continue;
@@ -117213,6 +117216,16 @@ function materializedInitializerReconciliationFailuresV4(args) {
117213
117216
  }
117214
117217
  return failures;
117215
117218
  }
117219
+ function withoutSharedArguments(stored, replayed) {
117220
+ const storedRest = { ...stored };
117221
+ const replayedRest = { ...replayed };
117222
+ for (const [slot, value] of Object.entries(stored)) {
117223
+ if (typeof value !== "string" || replayed[slot] !== value) continue;
117224
+ delete storedRest[slot];
117225
+ delete replayedRest[slot];
117226
+ }
117227
+ return [storedRest, replayedRest];
117228
+ }
117216
117229
  function reconciliationRecords(workspace, changes, seeds = /* @__PURE__ */ new Map()) {
117217
117230
  return prospectiveInitializerRecordsV4({
117218
117231
  workspace,
@@ -127418,7 +127431,13 @@ function storedConstructorArgumentSource(context, type, value, environment, visi
127418
127431
  );
127419
127432
  }
127420
127433
  if (cloneAggregateArguments) {
127421
- return storedAggregateCloneSource(context, type, value, environment);
127434
+ return storedAggregateReplaySource(
127435
+ context,
127436
+ type,
127437
+ value,
127438
+ environment,
127439
+ constructorOwnsGraph
127440
+ );
127422
127441
  }
127423
127442
  return storedTypedRowSource(
127424
127443
  context,
@@ -127661,14 +127680,18 @@ function requiredGenericBindingMemberId(environment, genericParamId) {
127661
127680
  }
127662
127681
  return bindingId;
127663
127682
  }
127664
- function storedAggregateCloneSource(context, type, valueId, environment) {
127683
+ function storedAggregateReplaySource(context, type, valueId, environment, constructorOwnsGraph) {
127665
127684
  if (!context.values.has(valueId)) {
127666
127685
  throw new Error(
127667
127686
  `Stored ${type.kind} constructor argument references missing value row ${valueId}.`
127668
127687
  );
127669
127688
  }
127670
127689
  const typeName = storedSchemaTypeName(context, type, environment, valueId);
127671
- return `Reference<${typeName}>(id: ${quote5(valueId)}).Clone()`;
127690
+ const reference2 = `Reference<${typeName}>(id: ${quote5(valueId)})`;
127691
+ return isSharedConstructorArgument(context, valueId, constructorOwnsGraph) ? reference2 : `${reference2}.Clone()`;
127692
+ }
127693
+ function isSharedConstructorArgument(context, valueId, constructorOwnsGraph) {
127694
+ return !constructorOwnsGraph && context.readMaterializedGraph().independentlyOwnedValueIds.has(valueId);
127672
127695
  }
127673
127696
  function storedSchemaTypeName(context, type, environment, valueId) {
127674
127697
  switch (type.kind) {
@@ -127758,7 +127781,7 @@ function storedTypedRowSource(context, type, valueId, environment, visited, writ
127758
127781
  `Stored ${type.kind} constructor argument references missing value row ${valueId}.`
127759
127782
  );
127760
127783
  }
127761
- if (!constructorOwnsGraph && context.readMaterializedGraph().independentlyOwnedValueIds.has(valueId)) {
127784
+ if (isSharedConstructorArgument(context, valueId, constructorOwnsGraph)) {
127762
127785
  return `Reference<${storedSchemaTypeName(context, type, environment, valueId)}>(id: ${quote5(valueId)})`;
127763
127786
  }
127764
127787
  if (context.activeStoredConstructorArguments.has(valueId)) {
@@ -140421,7 +140444,7 @@ var init_registry2 = __esm({
140421
140444
  "schema-contract/registry.mjs"() {
140422
140445
  "use strict";
140423
140446
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
140424
- cliVersion: "0.57.2",
140447
+ cliVersion: "0.58.0",
140425
140448
  projectFileUploadBatchSize: 32,
140426
140449
  documentRecords: {
140427
140450
  member: {
@@ -148242,7 +148265,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
148242
148265
  async function main() {
148243
148266
  const args = parseArgs(process.argv.slice(2));
148244
148267
  if (args.command === "--version") {
148245
- console.log("0.57.2");
148268
+ console.log("0.58.0");
148246
148269
  return;
148247
148270
  }
148248
148271
  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.57.2",
3
+ "version": "0.58.0",
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.57.2 -->
12
+ <!-- reviewed-through-cli: 0.58.0 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -71,7 +71,9 @@ initializer cannot assign them. `Cell` is the placement's writable field.
71
71
 
72
72
  Object `PlacementTiles` is a `List<NeoPlacementTile>`. Each entry marks a
73
73
  footprint cell with its own `Cell` member. It is independent of `NeoTile`. Rendered
74
- tile classes do not belong in this list.
74
+ tile classes do not belong in this list. An object with no placement tiles
75
+ occupies no cells. It doesn't block other placements, and cell queries don't
76
+ return it.
75
77
 
76
78
  Convert a writable placement without changing its row identity or cell:
77
79
 
@@ -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.57.2 -->
100
+ <!-- reviewed-through-cli: 0.58.0 -->
101
101
  ```
102
102
 
103
103
  The quoted version above is checked too, so this instruction cannot go stale