@neocompose/cli 0.31.9 → 0.31.10

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,14 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.31.10] - 2026-08-17
4
+
5
+ ### Fixed
6
+
7
+ - Allow a normal pull to merge remote changes while local source contains new
8
+ members whose server-owned identity envelope has not been assigned yet.
9
+ - Recompile locally edited constructors after pull merge instead of rejecting
10
+ stale server IR compiled for their previous parameter list.
11
+
3
12
  ## [0.31.9] - 2026-08-17
4
13
 
5
14
  ### Added
package/dist/neo.mjs CHANGED
@@ -95005,10 +95005,40 @@ function readPulledProjectDocumentV4(records2) {
95005
95005
  const raw = structuredClone(
95006
95006
  pulledProjectDocumentRaw(replayWorkspace(records2))
95007
95007
  );
95008
- return readProjectDocument(completeProspectiveLocalizedTexts(raw), {
95009
- constructors: "authored-or-compiled",
95010
- identities: "prospective"
95011
- });
95008
+ return readProjectDocument(
95009
+ completeProspectiveMemberCreateEnvelopes(
95010
+ completeProspectiveLocalizedTexts(raw)
95011
+ ),
95012
+ {
95013
+ constructors: "authored-or-compiled",
95014
+ identities: "prospective"
95015
+ }
95016
+ );
95017
+ }
95018
+ function completeProspectiveMemberCreateEnvelopes(raw) {
95019
+ const members = raw.members;
95020
+ if (!Array.isArray(members)) return raw;
95021
+ if (!members.some(isPendingMemberWithoutCreateEnvelope)) return raw;
95022
+ const project = raw.project;
95023
+ if (!isObjectRecord2(project) || typeof project.id !== "string") {
95024
+ throw new Error(
95025
+ "Pending source-authored members need the server create envelope, but the project record has no id."
95026
+ );
95027
+ }
95028
+ return {
95029
+ ...raw,
95030
+ members: members.map(
95031
+ (member) => isPendingMemberWithoutCreateEnvelope(member) ? {
95032
+ projectId: project.id,
95033
+ createdAt: 0,
95034
+ updatedAt: 0,
95035
+ ...member
95036
+ } : member
95037
+ )
95038
+ };
95039
+ }
95040
+ function isPendingMemberWithoutCreateEnvelope(value) {
95041
+ return isObjectRecord2(value) && typeof value.id === "string" && value.id.startsWith("__pending__:") && (typeof value.projectId !== "string" || typeof value.createdAt !== "number" || typeof value.updatedAt !== "number");
95012
95042
  }
95013
95043
  function completeProspectiveLocalizedTexts(raw) {
95014
95044
  const localizedTexts = raw.localizedTexts;
@@ -104634,16 +104664,45 @@ function buildEmitRecordSet(document, plans, side) {
104634
104664
  if (data === void 0) continue;
104635
104665
  const serverRecord = document.records.get(key);
104636
104666
  const [recordKind, recordId] = key.split(/:(.+)/, 2);
104667
+ const resolvedRecordKind = serverRecord?.recordKind ?? recordKind;
104668
+ const resolvedRecordId = serverRecord?.recordId ?? recordId;
104637
104669
  records2.set(key, {
104638
- recordKind: serverRecord?.recordKind ?? recordKind,
104639
- recordId: serverRecord?.recordId ?? recordId,
104670
+ recordKind: resolvedRecordKind,
104671
+ recordId: resolvedRecordId,
104640
104672
  contentHash: plan.serverHash,
104641
104673
  deleted: false,
104642
- data
104674
+ data: side === "emit" ? composeProspectivePullRecord(
104675
+ resolvedRecordKind,
104676
+ resolvedRecordId,
104677
+ data,
104678
+ serverRecord
104679
+ ) : data
104643
104680
  });
104644
104681
  }
104645
104682
  return records2;
104646
104683
  }
104684
+ function composeProspectivePullRecord(recordKind, recordId, data, serverRecord) {
104685
+ if (!isSchemaRecordKindV4(recordKind) || !isObjectRecord2(data)) return data;
104686
+ let baseRecord = null;
104687
+ if (serverRecord !== void 0) {
104688
+ if (!isObjectRecord2(serverRecord.data)) {
104689
+ throw new Error(
104690
+ `Cannot compose pulled ${recordKind} record ${JSON.stringify(recordId)} because its server payload is not an object.`
104691
+ );
104692
+ }
104693
+ baseRecord = {
104694
+ recordKind,
104695
+ recordId,
104696
+ data: serverRecord.data
104697
+ };
104698
+ }
104699
+ return composeDocumentRecord(
104700
+ recordKind,
104701
+ recordId,
104702
+ partitionDocumentFields(recordKind, data).authored,
104703
+ baseRecord
104704
+ ).data;
104705
+ }
104647
104706
  var init_pull = __esm({
104648
104707
  "src/commands/pull.ts"() {
104649
104708
  "use strict";
@@ -111415,7 +111474,7 @@ var init_registry2 = __esm({
111415
111474
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
111416
111475
  formatVersion: 3,
111417
111476
  contractVersion: "3.13",
111418
- cliVersion: "0.31.9",
111477
+ cliVersion: "0.31.10",
111419
111478
  projectFileUploadBatchSize: 32,
111420
111479
  documentRecords: {
111421
111480
  member: {
@@ -118010,7 +118069,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
118010
118069
  async function main() {
118011
118070
  const args = parseArgs(process.argv.slice(2));
118012
118071
  if (args.command === "--version") {
118013
- console.log("0.31.9");
118072
+ console.log("0.31.10");
118014
118073
  return;
118015
118074
  }
118016
118075
  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.31.9",
3
+ "version": "0.31.10",
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.31.9 -->
12
+ <!-- reviewed-through-cli: 0.31.10 -->
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.31.9 -->
86
+ <!-- reviewed-through-cli: 0.31.10 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale