@neocompose/cli 0.19.5 → 0.19.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,25 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.19.6] - 2026-08-02
4
+
5
+ ### Changed
6
+
7
+ - A push sends its authored value content as `authoredValueSeeds`, renamed
8
+ from `staticValueSeeds`. The seeds were never only a static member's — they
9
+ carry every authored value row, root values and collection entries included.
10
+ A CLI older than this fails against a server that has it, and vice versa: the
11
+ field is part of the push request and its staged payload.
12
+
13
+ ### Fixed
14
+
15
+ - `neo push` no longer ends in an opaque `500` after a large push has already
16
+ committed. The transaction's results are read back a page at a time, and the
17
+ page was bounded by chunk count alone, so a big enough push read past what
18
+ the server may in one query. Pages are bounded by bytes now, and a workspace
19
+ learns the result of its own push.
20
+ - `neo pull` no longer rejects a project whose committed members carry doc text
21
+ while the local copy still names their pre-push ids.
22
+
3
23
  ## [0.19.5] - 2026-08-02
4
24
 
5
25
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -31428,10 +31428,18 @@ function assertMember2(value, path) {
31428
31428
  assertMemberOwner(member.owner, `${path}.owner`);
31429
31429
  assertOptionalDocsText2(member.docsText, `${path}.docsText`);
31430
31430
  const owner = requireRecord(member.owner, `${path}.owner`);
31431
- if (member.docsText !== void 0 && owner.kind !== "classMember" && owner.kind !== "sharedClassMember") {
31431
+ if (member.docsText !== void 0 && owner.kind !== "classMember" && owner.kind !== "sharedClassMember" && // A loose member is not a kind of member — it is a member no class schema
31432
+ // in *this* view claims. A workspace merging its own pending records over
31433
+ // newer server ones sees exactly that: the local class still names the
31434
+ // pending member id the push replaced, so the committed member it now
31435
+ // holds is claimed by nothing. Doc text belongs to the member record, not
31436
+ // to where a schema happens to place it, so rejecting it here fails a pull
31437
+ // for a workspace whose only problem is being mid-sync — the one operation
31438
+ // that would fix it.
31439
+ owner.kind !== "loose") {
31432
31440
  invalid(
31433
31441
  `${path}.docsText`,
31434
- "is allowed only on source-declarable class members."
31442
+ `is allowed only on source-declarable class members; ${JSON.stringify(String(member.name))} is owned by ${JSON.stringify(String(owner.kind))}.`
31435
31443
  );
31436
31444
  }
31437
31445
  nonEmptyString(member.name, `${path}.name`);
@@ -60117,7 +60125,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60117
60125
  parseErrors,
60118
60126
  parseWarnings,
60119
60127
  reconstructed: /* @__PURE__ */ new Map(),
60120
- staticValueSeeds: /* @__PURE__ */ new Map(),
60128
+ authoredValueSeeds: /* @__PURE__ */ new Map(),
60121
60129
  binaryChanges: [],
60122
60130
  binaryFiles: []
60123
60131
  };
@@ -60125,7 +60133,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60125
60133
  const baseDocuments = schemaBaseDocuments(workspace);
60126
60134
  const baseManifest = baseDocuments.length === 0 ? void 0 : documentsToProjectSchemaManifest(baseDocuments);
60127
60135
  let manifest;
60128
- let staticValueSeeds = /* @__PURE__ */ new Map();
60136
+ let authoredValueSeeds = /* @__PURE__ */ new Map();
60129
60137
  let staticMemberValueIds = /* @__PURE__ */ new Map();
60130
60138
  let memberDefaults = {
60131
60139
  records: [],
@@ -60167,7 +60175,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60167
60175
  parseErrors,
60168
60176
  parseWarnings,
60169
60177
  reconstructed: /* @__PURE__ */ new Map(),
60170
- staticValueSeeds,
60178
+ authoredValueSeeds,
60171
60179
  binaryChanges: [],
60172
60180
  binaryFiles: []
60173
60181
  };
@@ -60192,7 +60200,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60192
60200
  parseErrors,
60193
60201
  parseWarnings,
60194
60202
  reconstructed: /* @__PURE__ */ new Map(),
60195
- staticValueSeeds,
60203
+ authoredValueSeeds,
60196
60204
  binaryChanges: [],
60197
60205
  binaryFiles: []
60198
60206
  };
@@ -60241,7 +60249,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60241
60249
  parseErrors,
60242
60250
  parseWarnings,
60243
60251
  reconstructed: /* @__PURE__ */ new Map(),
60244
- staticValueSeeds: /* @__PURE__ */ new Map(),
60252
+ authoredValueSeeds: /* @__PURE__ */ new Map(),
60245
60253
  binaryChanges: [],
60246
60254
  binaryFiles: []
60247
60255
  };
@@ -60289,7 +60297,10 @@ function computeWorkspaceStatus(workspace, options = {}) {
60289
60297
  manifest,
60290
60298
  { registry: valueLowerRegistry }
60291
60299
  );
60292
- staticValueSeeds = new Map([...staticValues.seeds, ...memberDefaults.seeds]);
60300
+ authoredValueSeeds = new Map([
60301
+ ...staticValues.seeds,
60302
+ ...memberDefaults.seeds
60303
+ ]);
60293
60304
  staticMemberValueIds = staticValues.memberValueIds;
60294
60305
  const rootValues = lowerProjectRootSourceV4(
60295
60306
  workspace.state.records,
@@ -60297,7 +60308,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60297
60308
  manifest,
60298
60309
  { registry: valueLowerRegistry }
60299
60310
  );
60300
- staticValueSeeds = new Map([...staticValueSeeds, ...rootValues.seeds]);
60311
+ authoredValueSeeds = new Map([...authoredValueSeeds, ...rootValues.seeds]);
60301
60312
  const rootPathResolutionState = overlayProspectiveSourceRecords(
60302
60313
  workspace.state.records,
60303
60314
  documents,
@@ -60533,7 +60544,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60533
60544
  parseErrors,
60534
60545
  parseWarnings,
60535
60546
  reconstructed: /* @__PURE__ */ new Map(),
60536
- staticValueSeeds: /* @__PURE__ */ new Map(),
60547
+ authoredValueSeeds: /* @__PURE__ */ new Map(),
60537
60548
  binaryChanges: [],
60538
60549
  binaryFiles: []
60539
60550
  };
@@ -60607,7 +60618,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60607
60618
  workspace.state.records,
60608
60619
  reconstructed3,
60609
60620
  changes,
60610
- staticValueSeeds
60621
+ authoredValueSeeds
60611
60622
  )
60612
60623
  );
60613
60624
  } catch (error) {
@@ -60637,7 +60648,7 @@ function computeWorkspaceStatus(workspace, options = {}) {
60637
60648
  parseErrors,
60638
60649
  parseWarnings,
60639
60650
  reconstructed: reconstructed3,
60640
- staticValueSeeds,
60651
+ authoredValueSeeds,
60641
60652
  binaryChanges,
60642
60653
  binaryFiles,
60643
60654
  initConversions: collectInitDefaultConversions(
@@ -63586,7 +63597,7 @@ var init_project_file_pull = __esm({
63586
63597
  function staticValueSeedEmitRecords(status, present) {
63587
63598
  const records2 = /* @__PURE__ */ new Map();
63588
63599
  if (status === null) return records2;
63589
- for (const [memberId, seed] of status.staticValueSeeds) {
63600
+ for (const [memberId, seed] of status.authoredValueSeeds) {
63590
63601
  const rootId = seed.valueId ?? memberValueIdFromRecord(status, memberId);
63591
63602
  if (rootId !== null) {
63592
63603
  addSeedRecord(records2, present, {
@@ -81029,7 +81040,7 @@ function verifyProjectSourceCommitAgainstStateV4(args) {
81029
81040
  );
81030
81041
  }
81031
81042
  auditAuthoredSeedRowIdentities(
81032
- status.staticValueSeeds,
81043
+ status.authoredValueSeeds,
81033
81044
  args.stateRecords,
81034
81045
  assignments
81035
81046
  );
@@ -81048,7 +81059,7 @@ function verifyProjectSourceCommitAgainstStateV4(args) {
81048
81059
  expectedBaseContentHash: change.kind === "create" ? null : change.casBaseHash ?? null
81049
81060
  };
81050
81061
  });
81051
- const expectedSeeds = [...status.staticValueSeeds].map(
81062
+ const expectedSeeds = [...status.authoredValueSeeds].map(
81052
81063
  ([memberId, seed]) => ({
81053
81064
  memberId: rewritePending(memberId, assignments, usedAssignments),
81054
81065
  value: rewritePending(seed.value, assignments, usedAssignments),
@@ -81092,7 +81103,7 @@ function verifyProjectSourceCommitAgainstStateV4(args) {
81092
81103
  return !isDerivedOnlyRefresh(change, args.stateRecords);
81093
81104
  });
81094
81105
  compareChanges(expectedChanges, verifiableChanges);
81095
- compareSeeds(expectedSeeds, args.staticValueSeeds);
81106
+ compareSeeds(expectedSeeds, args.authoredValueSeeds);
81096
81107
  }
81097
81108
  function isDerivedOnlyRefresh(change, stateRecords) {
81098
81109
  if (change.operation !== "update") return false;
@@ -82325,7 +82336,7 @@ var init_general_function_call_ir_source_recompile = __esm({
82325
82336
  });
82326
82337
 
82327
82338
  // ../src/database/project-version-transaction-types.ts
82328
- function isStaticMemberValueSeedInitContent(content) {
82339
+ function isAuthoredValueSeedInitContent(content) {
82329
82340
  return content.init !== void 0;
82330
82341
  }
82331
82342
  var init_project_version_transaction_types = __esm({
@@ -83932,10 +83943,10 @@ function prepareServerOwnedSchemaCommit(args) {
83932
83943
  requiresCompleteSweep,
83933
83944
  contentHashHeads: args.contentHashHeads
83934
83945
  });
83935
- materializeStaticValueSeeds({
83946
+ materializeAuthoredValueSeeds({
83936
83947
  document: applyProjectVersionWriteChanges(postDocument, prepared),
83937
83948
  prepared,
83938
- staticValueSeeds: args.staticValueSeeds ?? []
83949
+ authoredValueSeeds: args.authoredValueSeeds ?? []
83939
83950
  });
83940
83951
  prepareServerOwnedValueInitializerBodies({
83941
83952
  document: args.document,
@@ -84727,13 +84738,13 @@ function drainConstructedGraphValidations(args) {
84727
84738
  });
84728
84739
  }
84729
84740
  }
84730
- function materializeStaticValueSeeds(args) {
84741
+ function materializeAuthoredValueSeeds(args) {
84731
84742
  const pendingGraphValidations = [];
84732
84743
  materializeStaticSeedBindingMembers(args);
84733
84744
  const seedByMemberId = new Map(
84734
- args.staticValueSeeds.map((seed) => [seed.memberId, seed])
84745
+ args.authoredValueSeeds.map((seed) => [seed.memberId, seed])
84735
84746
  );
84736
- if (seedByMemberId.size !== args.staticValueSeeds.length) {
84747
+ if (seedByMemberId.size !== args.authoredValueSeeds.length) {
84737
84748
  throw new Error("Schema commit contains duplicate member value seeds.");
84738
84749
  }
84739
84750
  const consumedSeedMemberIds = /* @__PURE__ */ new Set();
@@ -84891,9 +84902,9 @@ function materializeStaticValueSeeds(args) {
84891
84902
  });
84892
84903
  }
84893
84904
  }
84894
- for (const seed of args.staticValueSeeds) {
84905
+ for (const seed of args.authoredValueSeeds) {
84895
84906
  if (consumedSeedMemberIds.has(seed.memberId)) continue;
84896
- materializeExistingStaticValueSeed({
84907
+ materializeExistingAuthoredValueSeed({
84897
84908
  document: args.document,
84898
84909
  prepared: args.prepared,
84899
84910
  pendingGraphValidations,
@@ -84907,7 +84918,7 @@ function materializeStaticValueSeeds(args) {
84907
84918
  pending: pendingGraphValidations
84908
84919
  });
84909
84920
  }
84910
- function materializeExistingStaticValueSeed(args) {
84921
+ function materializeExistingAuthoredValueSeed(args) {
84911
84922
  const member = args.document.members.find(
84912
84923
  (candidate) => candidate.id === args.seed.memberId
84913
84924
  );
@@ -85008,7 +85019,7 @@ function materializeExistingStaticValueSeed(args) {
85008
85019
  }
85009
85020
  }
85010
85021
  function materializeStaticSeedBindingMembers(args) {
85011
- const bindings = args.staticValueSeeds.flatMap(
85022
+ const bindings = args.authoredValueSeeds.flatMap(
85012
85023
  (seed) => seed.bindingMembers ?? []
85013
85024
  );
85014
85025
  const ids = new Set(bindings.map((binding) => binding.id));
@@ -85329,14 +85340,14 @@ function materializeSeedLocalizableStringWrites(args) {
85329
85340
  return [...args.seededLocalizedTexts, ...generatedTexts];
85330
85341
  }
85331
85342
  function seedValueContent(seed) {
85332
- if (isStaticMemberValueSeedInitContent(seed)) return { init: seed.init };
85343
+ if (isAuthoredValueSeedInitContent(seed)) return { init: seed.init };
85333
85344
  return {
85334
85345
  value: seed.value,
85335
85346
  ...seed.classId === null ? {} : { classId: seed.classId }
85336
85347
  };
85337
85348
  }
85338
85349
  function seedRootRow(member, seed, rootId) {
85339
- if (isStaticMemberValueSeedInitContent(seed)) {
85350
+ if (isAuthoredValueSeedInitContent(seed)) {
85340
85351
  return { id: rootId, memberId: member.id, init: seed.init };
85341
85352
  }
85342
85353
  return {
@@ -85347,7 +85358,7 @@ function seedRootRow(member, seed, rootId) {
85347
85358
  };
85348
85359
  }
85349
85360
  function authoredSeedRowMatchesValue(row, value) {
85350
- if (isStaticMemberValueSeedInitContent(row)) {
85361
+ if (isAuthoredValueSeedInitContent(row)) {
85351
85362
  return isInitValueContent(value) && value.init.code === row.init.code;
85352
85363
  }
85353
85364
  if (isInitValueContent(value)) return false;
@@ -85421,7 +85432,7 @@ function materializeAuthoredSeedRow(args) {
85421
85432
  );
85422
85433
  }
85423
85434
  if (args.authoredRows.has(args.row.id)) args.usedRows.add(args.row.id);
85424
- if (isStaticMemberValueSeedInitContent(args.row)) {
85435
+ if (isAuthoredValueSeedInitContent(args.row)) {
85425
85436
  const initRow = {
85426
85437
  id: args.row.id,
85427
85438
  projectId: args.document.project.id,
@@ -89409,7 +89420,7 @@ function runServerPreparation(args) {
89409
89420
  document,
89410
89421
  contentHashHeads,
89411
89422
  changes: trustedChanges,
89412
- staticValueSeeds: args.staticValueSeeds,
89423
+ authoredValueSeeds: args.authoredValueSeeds,
89413
89424
  // A CLI push is always a trusted-source commit, so the server always
89414
89425
  // expands read-only source conversions for it.
89415
89426
  expandReadOnlySourceConversions: true
@@ -89683,7 +89694,7 @@ import {
89683
89694
  readFileSync as readFileSync14
89684
89695
  } from "node:fs";
89685
89696
  import { dirname as dirname7, join as join17, relative as relative5, sep as sep5 } from "node:path";
89686
- function assignPendingIds(changes, staticValueSeeds, reconstructed3) {
89697
+ function assignPendingIds(changes, authoredValueSeeds, reconstructed3) {
89687
89698
  const assigned = /* @__PURE__ */ new Map();
89688
89699
  const assign = (pendingId2) => {
89689
89700
  const existing = assigned.get(pendingId2);
@@ -89732,7 +89743,7 @@ function assignPendingIds(changes, staticValueSeeds, reconstructed3) {
89732
89743
  collect(change.recordId);
89733
89744
  collect(change.nextData);
89734
89745
  }
89735
- for (const [memberId, seed] of staticValueSeeds) {
89746
+ for (const [memberId, seed] of authoredValueSeeds) {
89736
89747
  collect(memberId);
89737
89748
  collect(seed);
89738
89749
  }
@@ -89778,7 +89789,7 @@ function assignPendingIds(changes, staticValueSeeds, reconstructed3) {
89778
89789
  }
89779
89790
  }
89780
89791
  const rewrittenSeeds = /* @__PURE__ */ new Map();
89781
- for (const [memberId, seed] of staticValueSeeds) {
89792
+ for (const [memberId, seed] of authoredValueSeeds) {
89782
89793
  const rewrittenId = rewrite(memberId);
89783
89794
  if (typeof rewrittenId !== "string") {
89784
89795
  throw new Error(
@@ -89840,7 +89851,7 @@ function assignPendingIds(changes, staticValueSeeds, reconstructed3) {
89840
89851
  reconstructed3.set(key, record3);
89841
89852
  }
89842
89853
  }
89843
- return { assigned, staticValueSeeds: rewrittenSeeds };
89854
+ return { assigned, authoredValueSeeds: rewrittenSeeds };
89844
89855
  }
89845
89856
  function readAcceptedProjectVersionCommitResponse(value) {
89846
89857
  if (!isObjectRecord2(value) || value.kind !== "accepted") return null;
@@ -90310,7 +90321,7 @@ ${blockingErrors.map((error) => ` ${error.message}`).join("\n")}`
90310
90321
  type: "push-plan",
90311
90322
  dryRun: options.dryRun,
90312
90323
  changeCount: status.changes.length,
90313
- staticValueSeedCount: status.staticValueSeeds.size,
90324
+ staticValueSeedCount: status.authoredValueSeeds.size,
90314
90325
  changes: status.changes.map((change) => ({
90315
90326
  kind: change.kind,
90316
90327
  recordKind: change.recordKind,
@@ -90335,9 +90346,9 @@ ${blockingErrors.map((error) => ` ${error.message}`).join("\n")}`
90335
90346
  }
90336
90347
  }
90337
90348
  }
90338
- if (status.staticValueSeeds.size > 0) {
90349
+ if (status.authoredValueSeeds.size > 0) {
90339
90350
  console.log(
90340
- ` ${color.dim(`create ${status.staticValueSeeds.size} member value seed(s)`)}`
90351
+ ` ${color.dim(`create ${status.authoredValueSeeds.size} member value seed(s)`)}`
90341
90352
  );
90342
90353
  }
90343
90354
  }
@@ -90403,7 +90414,7 @@ ${blockingErrors.map((error) => ` ${error.message}`).join("\n")}`
90403
90414
  {
90404
90415
  operation: transactionOperation,
90405
90416
  changes: transportChanges,
90406
- staticValueSeeds: transportSeeds,
90417
+ authoredValueSeeds: transportSeeds,
90407
90418
  stagedFiles,
90408
90419
  sourceBundle: source.bundle,
90409
90420
  pendingIdAssignments: Object.fromEntries(pendingAssignment.assigned),
@@ -90617,11 +90628,11 @@ async function prepareLocalPushArtifactsV4(workspace, status) {
90617
90628
  const source = await createPendingProjectSourceBundleV4(
90618
90629
  workspace,
90619
90630
  status,
90620
- status.staticValueSeeds
90631
+ status.authoredValueSeeds
90621
90632
  );
90622
90633
  const pendingAssignment = assignPendingIds(
90623
90634
  status.changes,
90624
- status.staticValueSeeds,
90635
+ status.authoredValueSeeds,
90625
90636
  status.reconstructed
90626
90637
  );
90627
90638
  const operations = new Set(status.changes.map((change) => change.kind));
@@ -90635,7 +90646,7 @@ async function prepareLocalPushArtifactsV4(workspace, status) {
90635
90646
  intent: createNeoCliPushIntent(change),
90636
90647
  expectedBaseContentHash: change.kind === "create" ? null : change.casBaseHash ?? null
90637
90648
  }));
90638
- const transportSeeds = [...pendingAssignment.staticValueSeeds].map(
90649
+ const transportSeeds = [...pendingAssignment.authoredValueSeeds].map(
90639
90650
  ([memberId, seed]) => ({ memberId, ...seed })
90640
90651
  );
90641
90652
  const preparedFiles = prepareProjectFilePushesV4({
@@ -90654,14 +90665,14 @@ async function prepareLocalPushArtifactsV4(workspace, status) {
90654
90665
  stateRecords: workspace.state.records,
90655
90666
  files: source.files,
90656
90667
  changes: transportChanges,
90657
- staticValueSeeds: transportSeeds,
90668
+ authoredValueSeeds: transportSeeds,
90658
90669
  pendingIdAssignments: Object.fromEntries(pendingAssignment.assigned),
90659
90670
  stagedFiles: preparedFiles
90660
90671
  });
90661
90672
  assertServerPreparationSucceeds({
90662
90673
  workspace,
90663
90674
  changes: transportChanges,
90664
- staticValueSeeds: transportSeeds,
90675
+ authoredValueSeeds: transportSeeds,
90665
90676
  sourceByRecord: status.reconstructed
90666
90677
  });
90667
90678
  return {
@@ -90725,7 +90736,7 @@ function cloneStatusForDryRun(status) {
90725
90736
  return {
90726
90737
  ...status,
90727
90738
  changes: structuredClone(status.changes),
90728
- staticValueSeeds: structuredClone(status.staticValueSeeds),
90739
+ authoredValueSeeds: structuredClone(status.authoredValueSeeds),
90729
90740
  reconstructed: structuredClone(status.reconstructed)
90730
90741
  };
90731
90742
  }
@@ -90743,7 +90754,7 @@ function reportDryRunFailure(error, json) {
90743
90754
  }
90744
90755
  console.error(`Dry run failed: ${message}`);
90745
90756
  }
90746
- async function createPendingProjectSourceBundleV4(workspace, status, staticValueSeeds) {
90757
+ async function createPendingProjectSourceBundleV4(workspace, status, authoredValueSeeds) {
90747
90758
  const records2 = /* @__PURE__ */ new Map();
90748
90759
  for (const [key, state] of Object.entries(workspace.state.records)) {
90749
90760
  records2.set(key, {
@@ -90783,7 +90794,7 @@ async function createPendingProjectSourceBundleV4(workspace, status, staticValue
90783
90794
  (record3) => record3.recordKind === "localization-config"
90784
90795
  );
90785
90796
  const mainLocale = isObjectRecord2(localizationConfig?.data) && typeof localizationConfig.data.mainLocale === "string" ? localizationConfig.data.mainLocale : "en-US";
90786
- for (const seed of staticValueSeeds.values()) {
90797
+ for (const seed of authoredValueSeeds.values()) {
90787
90798
  for (const bindingMember of seed.bindingMembers ?? []) {
90788
90799
  records2.set(`member:${bindingMember.id}`, {
90789
90800
  recordKind: "member",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neocompose/cli",
3
- "version": "0.19.5",
3
+ "version": "0.19.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.19.5 -->
12
+ <!-- reviewed-through-cli: 0.19.6 -->
13
13
 
14
14
  # Neo Compose CLI
15
15
 
@@ -73,7 +73,7 @@ wrappers.
73
73
  The marker near the top of `SKILL.md` must exactly match the package version:
74
74
 
75
75
  ```html
76
- <!-- reviewed-through-cli: 0.19.5 -->
76
+ <!-- reviewed-through-cli: 0.19.6 -->
77
77
  ```
78
78
 
79
79
  The quoted version above is checked too, so this instruction cannot go stale