@neocompose/cli 0.31.12 → 0.31.13

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,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.31.13] - 2026-08-18
4
+
5
+ ### Fixed
6
+
7
+ - Encode native and NeoScript function overrides with sparse inherited
8
+ signatures, preventing validation from rejecting callable overrides.
9
+
3
10
  ## [0.31.12] - 2026-08-17
4
11
 
5
12
  ### Fixed
package/dist/neo.mjs CHANGED
@@ -35383,9 +35383,11 @@ function memberToDocumentFields(member, baseData3) {
35383
35383
  fields.templateId = member.templateId;
35384
35384
  }
35385
35385
  if (member.kind === "function" || member.kind === "scriptFunction") {
35386
- fields.returnTypeInfo = manifestReturnTypeToDocument(member.returnType);
35387
- fields.argumentTypes = member.arguments.map(manifestArgumentToDocument);
35388
- fields.deferred = member.deferred;
35386
+ if (member.overrideOf === null) {
35387
+ fields.returnTypeInfo = manifestReturnTypeToDocument(member.returnType);
35388
+ fields.argumentTypes = member.arguments.map(manifestArgumentToDocument);
35389
+ fields.deferred = member.deferred;
35390
+ }
35389
35391
  if (member.kind === "scriptFunction" && member.script !== null && member.bodyMode !== "ui") {
35390
35392
  fields.code = member.script.sourceText;
35391
35393
  }
@@ -93455,6 +93457,9 @@ function replayAnimationDeclarationInitializersV4(records2, document, fallbackDo
93455
93457
  rootOwners,
93456
93458
  rootKinds
93457
93459
  );
93460
+ const resolvedMembers = new Map(
93461
+ document.members.map((member) => [member.id, member])
93462
+ );
93458
93463
  const pulled = /* @__PURE__ */ new Map();
93459
93464
  for (const record3 of records2) {
93460
93465
  const recordId = record3.data.id;
@@ -93464,7 +93469,10 @@ function replayAnimationDeclarationInitializersV4(records2, document, fallbackDo
93464
93469
  recordId,
93465
93470
  contentHash: "prospective-animation-validation",
93466
93471
  deleted: false,
93467
- data: record3.data
93472
+ // Initializer replay consumes the runtime document shape too. Reuse the
93473
+ // transiently hydrated member instead of feeding sparse callable
93474
+ // overrides back through the strict full-record reader.
93475
+ data: record3.recordKind === "member" ? resolvedMembers.get(recordId) ?? record3.data : record3.data
93468
93476
  });
93469
93477
  }
93470
93478
  const replayDocument = readPulledProjectDocumentV4(pulled);
@@ -93582,6 +93590,11 @@ function prospectiveAnimationDocumentV4(records2) {
93582
93590
  (record3) => record3.recordKind === "class" && (Array.isArray(record3.data.constructorProjections) || declaresAnimationWorldKind(record3.data.system))
93583
93591
  );
93584
93592
  if (!hasAnimationSchema) return null;
93593
+ const memberRecords = new Map(
93594
+ candidates.flatMap(
93595
+ (record3) => record3.recordKind === "member" && typeof record3.data.id === "string" ? [[record3.data.id, record3.data]] : []
93596
+ )
93597
+ );
93585
93598
  let project;
93586
93599
  const classes = [];
93587
93600
  const members = [];
@@ -93602,12 +93615,16 @@ function prospectiveAnimationDocumentV4(records2) {
93602
93615
  }
93603
93616
  classes.push(record3.data);
93604
93617
  } else if (record3.recordKind === "member") {
93605
- if (!isMember(record3.data)) {
93618
+ const member = hydrateProspectiveCallableOverride(
93619
+ record3.data,
93620
+ memberRecords
93621
+ );
93622
+ if (!isMember(member)) {
93606
93623
  throw new Error(
93607
93624
  `Prospective animation validation received an invalid member record ${recordLabel(record3.data)}.`
93608
93625
  );
93609
93626
  }
93610
- members.push(record3.data);
93627
+ members.push(member);
93611
93628
  } else if (record3.recordKind === "value") {
93612
93629
  if (!isMemberValue(record3.data)) {
93613
93630
  throw new Error(
@@ -93641,6 +93658,34 @@ function prospectiveAnimationDocumentV4(records2) {
93641
93658
  });
93642
93659
  return { project, classes, members, values: validationValues };
93643
93660
  }
93661
+ function hydrateProspectiveCallableOverride(data, members) {
93662
+ if (data.kind !== 13 /* Function */ && data.kind !== 23 /* NSFunction */ || typeof data.extendsMemberId !== "string") {
93663
+ return data;
93664
+ }
93665
+ const hydrated = { ...data };
93666
+ for (const field of [
93667
+ "returnTypeInfo",
93668
+ "argumentTypes",
93669
+ "deferred"
93670
+ ]) {
93671
+ if (Object.hasOwn(hydrated, field)) continue;
93672
+ const inherited = resolveProspectiveMemberField(data, field, members);
93673
+ if (inherited !== void 0) hydrated[field] = inherited;
93674
+ }
93675
+ return hydrated;
93676
+ }
93677
+ function resolveProspectiveMemberField(start, field, members) {
93678
+ let current = start;
93679
+ const visited = /* @__PURE__ */ new Set();
93680
+ while (current !== void 0) {
93681
+ if (Object.hasOwn(current, field)) return current[field];
93682
+ const parentId = current.extendsMemberId;
93683
+ if (typeof parentId !== "string" || visited.has(parentId)) return void 0;
93684
+ visited.add(parentId);
93685
+ current = members.get(parentId);
93686
+ }
93687
+ return void 0;
93688
+ }
93644
93689
  function declaresAnimationWorldKind(system) {
93645
93690
  if (!isObjectRecord2(system)) return false;
93646
93691
  const worldKind = system.worldKind;
@@ -111549,7 +111594,7 @@ var init_registry2 = __esm({
111549
111594
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
111550
111595
  formatVersion: 3,
111551
111596
  contractVersion: "3.13",
111552
- cliVersion: "0.31.12",
111597
+ cliVersion: "0.31.13",
111553
111598
  projectFileUploadBatchSize: 32,
111554
111599
  documentRecords: {
111555
111600
  member: {
@@ -118144,7 +118189,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
118144
118189
  async function main() {
118145
118190
  const args = parseArgs(process.argv.slice(2));
118146
118191
  if (args.command === "--version") {
118147
- console.log("0.31.12");
118192
+ console.log("0.31.13");
118148
118193
  return;
118149
118194
  }
118150
118195
  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.12",
3
+ "version": "0.31.13",
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.12 -->
12
+ <!-- reviewed-through-cli: 0.31.13 -->
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.12 -->
86
+ <!-- reviewed-through-cli: 0.31.13 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale