@neocompose/cli 0.52.1 → 0.52.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,10 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.52.2] - 2026-09-17
4
+
5
+ - Preserve inherited defaults when a sparse readonly override changes other member metadata.
6
+ - Read packed values with stale compiler output during reset and retain unchanged server-derived bodies without reporting spurious updates.
7
+
3
8
  ## [0.52.1] - 2026-09-17
4
9
 
5
10
  - Retire the completed pre-0.52 tile schema and source upgrade. Existing workspaces must already use the current tile schema; ordinary `neo pull` continues to refresh compiler-only changes while preserving local edits and custom paths.
package/dist/neo.mjs CHANGED
@@ -26424,7 +26424,7 @@ function validateClassMemberModifiers(ref, environment, diagnostics) {
26424
26424
  `Read-only field '${member.name}' cannot be static.`
26425
26425
  );
26426
26426
  }
26427
- if (member.initializer === void 0 && !modifiers.has("abstract")) {
26427
+ if (member.initializer === void 0 && !modifiers.has("abstract") && !modifiers.has("override")) {
26428
26428
  diagnose(
26429
26429
  diagnostics,
26430
26430
  ref.uri,
@@ -42044,7 +42044,7 @@ function assertMemberInvariants(member, path) {
42044
42044
  );
42045
42045
  if (member.storage !== "immutable" && (member.storage !== null || member.overrideOf === null))
42046
42046
  fail2("storage", "must be immutable when isReadOnly is true.");
42047
- if (member.defaultValue === null && !abstract)
42047
+ if (member.defaultValue === null && !abstract && member.overrideOf === null)
42048
42048
  fail2("defaultValue", "is required when isReadOnly is true.");
42049
42049
  }
42050
42050
  if (member.kind === "string" && member.isReadOnly && member.searchKey)
@@ -113183,12 +113183,13 @@ function storedValueRowsByIdV4(records2) {
113183
113183
  logical.set(valueId, row);
113184
113184
  continue;
113185
113185
  }
113186
- if (!isMemberValue(row)) {
113186
+ const authoredRow = stripClientDerivedBodies("value", row);
113187
+ if (!isMemberValue(authoredRow)) {
113187
113188
  throw new PackedValueEncodingError(
113188
113189
  `Stored value row "${valueId}" packs a child but is not a well-formed value row, so its packed payload cannot be expanded.`
113189
113190
  );
113190
113191
  }
113191
- const decoded = decodePackedValueRow(row);
113192
+ const decoded = decodePackedValueRow(authoredRow);
113192
113193
  logical.set(valueId, { ...decoded.row });
113193
113194
  for (const child of decoded.children) {
113194
113195
  logical.set(child.id, { ...child });
@@ -113379,6 +113380,7 @@ var init_stored_value_placements = __esm({
113379
113380
  init_constructors2();
113380
113381
  init_constructor_parameter_settlement();
113381
113382
  init_members();
113383
+ init_neo_script_derived_bodies();
113382
113384
  init_projection();
113383
113385
  }
113384
113386
  });
@@ -113832,12 +113834,13 @@ function logicalValueBaseRecordsV4(records2) {
113832
113834
  if (record6.recordKind !== "value") continue;
113833
113835
  if (!isObjectRecord2(record6.data)) continue;
113834
113836
  if (!rowCarriesPackedValueContent(record6.data)) continue;
113835
- if (!isMemberValue(record6.data)) {
113837
+ const authoredData = stripClientDerivedBodies("value", record6.data);
113838
+ if (!isMemberValue(authoredData)) {
113836
113839
  throw new PackedValueEncodingError(
113837
113840
  `Workspace base row "${key}" packs a child but is not a well-formed value row, so its packed payload cannot be expanded.`
113838
113841
  );
113839
113842
  }
113840
- const decoded = decodePackedValueRow(record6.data);
113843
+ const decoded = decodePackedValueRow(authoredData);
113841
113844
  expanded ??= { ...records2 };
113842
113845
  expanded[key] = { ...record6, data: decoded.row };
113843
113846
  for (const child of decoded.children) {
@@ -113886,7 +113889,16 @@ function foldCandidateValueRowsV4(args) {
113886
113889
  `Packed fold produced a physical row for "${row.id}", which is not a candidate value row of this push.`
113887
113890
  );
113888
113891
  }
113889
- bodyByValueId.set(row.id, storedContentApplied(candidate, row));
113892
+ const folded = storedContentApplied(candidate, row);
113893
+ const physical = args.physicalBase?.[`value:${row.id}`]?.data;
113894
+ const authoredPhysical = stripClientDerivedBodies("value", physical);
113895
+ bodyByValueId.set(
113896
+ row.id,
113897
+ isObjectRecord2(physical) && isObjectRecord2(authoredPhysical) && canonicallyEqual(
113898
+ stripClientDerivedBodies("value", folded),
113899
+ authoredPhysical
113900
+ ) ? physical : folded
113901
+ );
113890
113902
  }
113891
113903
  return { bodyByValueId, foldedValueIds };
113892
113904
  }
@@ -113927,6 +113939,7 @@ var init_packed_value_parity = __esm({
113927
113939
  init_core();
113928
113940
  init_members();
113929
113941
  init_packed_value_write_fold();
113942
+ init_neo_script_derived_bodies();
113930
113943
  init_projection();
113931
113944
  EMPTY_FOLD = {
113932
113945
  bodyByValueId: /* @__PURE__ */ new Map(),
@@ -116122,6 +116135,7 @@ function applyPackedValueFoldV4(args) {
116122
116135
  const fold = foldCandidateValueRowsV4({
116123
116136
  candidates,
116124
116137
  base: args.loweringRecords,
116138
+ physicalBase: args.workspace.state.records,
116125
116139
  touchedValueIds,
116126
116140
  projectId: args.workspace.config.projectId,
116127
116141
  schema: args.schema
@@ -137282,7 +137296,7 @@ var init_registry2 = __esm({
137282
137296
  "schema-contract/registry.mjs"() {
137283
137297
  "use strict";
137284
137298
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
137285
- cliVersion: "0.52.1",
137299
+ cliVersion: "0.52.2",
137286
137300
  projectFileUploadBatchSize: 32,
137287
137301
  documentRecords: {
137288
137302
  member: {
@@ -145153,7 +145167,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
145153
145167
  async function main() {
145154
145168
  const args = parseArgs(process.argv.slice(2));
145155
145169
  if (args.command === "--version") {
145156
- console.log("0.52.1");
145170
+ console.log("0.52.2");
145157
145171
  return;
145158
145172
  }
145159
145173
  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.1",
3
+ "version": "0.52.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.52.1 -->
12
+ <!-- reviewed-through-cli: 0.52.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.52.1 -->
93
+ <!-- reviewed-through-cli: 0.52.2 -->
94
94
  ```
95
95
 
96
96
  The quoted version above is checked too, so this instruction cannot go stale