@neocompose/cli 0.34.1 → 0.34.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.34.2] - 2026-08-19
4
+
5
+ ### Fixed
6
+
7
+ - Treat unknown top-level document fields with a JSON `null` value as absent
8
+ while continuing to reject unknown non-null authored data, so harmless fields
9
+ emitted by an older CLI do not block project commands.
10
+
3
11
  ## [0.34.1] - 2026-08-19
4
12
 
5
13
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -35172,8 +35172,9 @@ function fieldDisposition(recordKind, field) {
35172
35172
  return null;
35173
35173
  }
35174
35174
  function assertKnownDocumentFields(recordKind, value) {
35175
- for (const field of Object.keys(value)) {
35175
+ for (const [field, fieldValue] of Object.entries(value)) {
35176
35176
  if (fieldDisposition(recordKind, field) !== null) continue;
35177
+ if (fieldValue === null) continue;
35177
35178
  throw new SchemaDocumentContractError(recordKind, field);
35178
35179
  }
35179
35180
  }
@@ -35188,6 +35189,7 @@ function partitionDocumentFields(recordKind, value) {
35188
35189
  if (fieldValue === void 0) continue;
35189
35190
  const disposition = fieldDisposition(recordKind, field);
35190
35191
  if (disposition === null) {
35192
+ if (fieldValue === null) continue;
35191
35193
  throw new SchemaDocumentContractError(recordKind, field);
35192
35194
  }
35193
35195
  result[disposition][field] = fieldValue;
@@ -35198,6 +35200,11 @@ function normalizeDocumentFields(recordKind, value) {
35198
35200
  assertKnownDocumentFields(recordKind, value);
35199
35201
  const contract = SCHEMA_DOCUMENT_FIELD_CONTRACTS[recordKind];
35200
35202
  const normalized = deepOmitUndefined(value);
35203
+ for (const [field, fieldValue] of Object.entries(normalized)) {
35204
+ if (fieldValue === null && fieldDisposition(recordKind, field) === null) {
35205
+ delete normalized[field];
35206
+ }
35207
+ }
35201
35208
  for (const [field, rule] of Object.entries(contract.normalization)) {
35202
35209
  const current = normalized[field];
35203
35210
  if (rule === "nullIsAbsent") {
@@ -113174,7 +113181,7 @@ var init_registry2 = __esm({
113174
113181
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
113175
113182
  formatVersion: 3,
113176
113183
  contractVersion: "3.14",
113177
- cliVersion: "0.34.1",
113184
+ cliVersion: "0.34.2",
113178
113185
  projectFileUploadBatchSize: 32,
113179
113186
  documentRecords: {
113180
113187
  member: {
@@ -119776,7 +119783,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
119776
119783
  async function main() {
119777
119784
  const args = parseArgs(process.argv.slice(2));
119778
119785
  if (args.command === "--version") {
119779
- console.log("0.34.1");
119786
+ console.log("0.34.2");
119780
119787
  return;
119781
119788
  }
119782
119789
  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.34.1",
3
+ "version": "0.34.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.34.1 -->
12
+ <!-- reviewed-through-cli: 0.34.2 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -47,8 +47,9 @@ Treat pull followed immediately by status or dry-run as a semantic no-op. If it
47
47
  reports project changes, stop and report a round-trip bug instead of pushing.
48
48
 
49
49
  The compiler reports file:line:column diagnostics and fails closed. Unknown
50
- authorable server fields require a CLI contract update; never preserve them as
51
- opaque JSON or guessed syntax.
50
+ non-null authorable server fields require a CLI contract update; never preserve
51
+ them as opaque JSON or guessed syntax. An unknown top-level document field whose
52
+ value is exactly JSON `null` is treated as absent.
52
53
 
53
54
  ## Honor hard authoring invariants
54
55
 
@@ -83,7 +83,7 @@ wrappers.
83
83
  The marker near the top of `SKILL.md` must exactly match the package version:
84
84
 
85
85
  ```html
86
- <!-- reviewed-through-cli: 0.34.1 -->
86
+ <!-- reviewed-through-cli: 0.34.2 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale