@neocompose/cli 0.26.3 → 0.26.4

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,16 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.26.4] - 2026-08-10
4
+
5
+ ### Fixed
6
+
7
+ - Read an omitted nullable member on a newly constructed class as `null`
8
+ instead of throwing a missing-object-key error. `neo test` can now assert
9
+ explicit nullable defaults without requiring an otherwise-empty value row.
10
+ - Let local candidate validation resolve an image or audio file created in the
11
+ same source change. `neo doctor`, `neo test`, and push dry runs now preserve
12
+ the pending file identity while rehearsing the uploaded project-file row.
13
+
3
14
  ## [0.26.3] - 2026-08-10
4
15
 
5
16
  ### Changed
package/dist/neo.mjs CHANGED
@@ -61908,6 +61908,7 @@ function dispatchSchemaMember(receiver, schemaKey, ctx) {
61908
61908
  };
61909
61909
  }
61910
61910
  if (!Object.prototype.hasOwnProperty.call(receiver, schemaKey)) {
61911
+ if (!member.required) return { kind: "ok", value: null };
61911
61912
  return { kind: "no-info", matchedMember: true };
61912
61913
  }
61913
61914
  const at = receiver[schemaKey];
@@ -83278,6 +83279,15 @@ function applyProjectVersionWriteChanges(document, changes) {
83278
83279
  "constructor"
83279
83280
  ),
83280
83281
  values: applyArrayChanges(document.values ?? [], changes, "value"),
83282
+ // Project-file staging finalizes pending uploads before schema
83283
+ // preparation. Defaults and authored instance graphs may reference a file
83284
+ // created by the same source transaction, so every construction pass must
83285
+ // see that finalized row in its post-write document.
83286
+ projectFiles: applyArrayChanges(
83287
+ document.projectFiles ?? [],
83288
+ changes,
83289
+ "project-file"
83290
+ ),
83281
83291
  internalRecordRelations: applyArrayChanges(
83282
83292
  document.internalRecordRelations ?? [],
83283
83293
  changes,
@@ -101055,7 +101065,11 @@ async function prepareLocalPushArtifactsV4(workspace, status, onPhase = () => vo
101055
101065
  );
101056
101066
  preparedChanges = assertServerPreparationSucceeds({
101057
101067
  workspace,
101058
- changes: transportChanges,
101068
+ changes: completeLocallyStagedProjectFileChanges({
101069
+ projectId: workspace.config.projectId,
101070
+ changes: transportChanges,
101071
+ stagedRecordIds: new Set(preparedFiles.map((file) => file.recordId))
101072
+ }),
101059
101073
  authoredValueSeeds: transportSeeds,
101060
101074
  sourceByRecord: status.reconstructed,
101061
101075
  localInitializerMaterialization: pendingAssignment.localInitializerMaterialization,
@@ -101178,6 +101192,33 @@ async function prepareLocalCandidateV4(workspace, options = {}) {
101178
101192
  preparedLocal
101179
101193
  };
101180
101194
  }
101195
+ function completeLocallyStagedProjectFileChanges(args) {
101196
+ return args.changes.map((change) => {
101197
+ if (!args.stagedRecordIds.has(change.recordId)) return change;
101198
+ if (change.recordKind !== "project-file") {
101199
+ throw new Error(
101200
+ `Staged project file ${change.recordId} matched a ${change.recordKind} change.`
101201
+ );
101202
+ }
101203
+ if (!isObjectRecord2(change.nextData)) {
101204
+ throw new Error(
101205
+ `Staged project file ${change.recordId} has no local source record.`
101206
+ );
101207
+ }
101208
+ const completed = {
101209
+ ...change,
101210
+ nextData: {
101211
+ ...change.nextData,
101212
+ id: change.recordId,
101213
+ projectId: args.projectId,
101214
+ status: "uploaded",
101215
+ storageKey: `local-candidate/${change.recordId}`,
101216
+ storageETag: "local-candidate"
101217
+ }
101218
+ };
101219
+ return completed;
101220
+ });
101221
+ }
101181
101222
  function transportChangesForStatus(status) {
101182
101223
  return status.changes.map((change) => ({
101183
101224
  recordKind: change.recordKind,
@@ -102632,7 +102673,7 @@ var init_registry2 = __esm({
102632
102673
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
102633
102674
  formatVersion: 3,
102634
102675
  contractVersion: "3.9",
102635
- cliVersion: "0.26.3",
102676
+ cliVersion: "0.26.4",
102636
102677
  projectFileUploadBatchSize: 32,
102637
102678
  documentRecords: {
102638
102679
  member: {
@@ -109197,7 +109238,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
109197
109238
  async function main() {
109198
109239
  const args = parseArgs(process.argv.slice(2));
109199
109240
  if (args.command === "--version") {
109200
- console.log("0.26.3");
109241
+ console.log("0.26.4");
109201
109242
  return;
109202
109243
  }
109203
109244
  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.26.3",
3
+ "version": "0.26.4",
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.26.3 -->
12
+ <!-- reviewed-through-cli: 0.26.4 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -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.26.3 -->
86
+ <!-- reviewed-through-cli: 0.26.4 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale