@neocompose/cli 0.31.12 → 0.31.14

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,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.31.14] - 2026-08-18
4
+
5
+ ### Fixed
6
+
7
+ - Accept code-only sparse NeoScript function overrides while reading local
8
+ pre-compilation candidates, without relaxing stored document validation.
9
+
10
+ ## [0.31.13] - 2026-08-18
11
+
12
+ ### Fixed
13
+
14
+ - Encode native and NeoScript function overrides with sparse inherited
15
+ signatures, preventing validation from rejecting callable overrides.
16
+
3
17
  ## [0.31.12] - 2026-08-17
4
18
 
5
19
  ### 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
  }
@@ -43261,9 +43263,38 @@ function isMemberOverrideProps(value) {
43261
43263
  function isMemberOverride(value) {
43262
43264
  return isMemberOverrideProps(value);
43263
43265
  }
43266
+ function isUncompiledMemberNSFunctionOverride(value) {
43267
+ const v = value;
43268
+ if (!isMemberOverrideBase(value)) return false;
43269
+ if (v.kind !== 23 /* NSFunction */) return false;
43270
+ if (typeof v.id !== "string") return false;
43271
+ if (typeof v.projectId !== "string") return false;
43272
+ if (!isEpochMillis(v.createdAt)) return false;
43273
+ if (!isEpochMillis(v.updatedAt)) return false;
43274
+ if (v.valueId !== void 0) return false;
43275
+ if (v.returnTypeInfo !== void 0) return false;
43276
+ if (v.argumentTypes !== void 0) return false;
43277
+ if (v.deferred !== void 0) return false;
43278
+ if (v.getter !== void 0) return false;
43279
+ if (v.setterCode !== void 0) return false;
43280
+ if (v.setter !== void 0) return false;
43281
+ if (v.action !== void 0) return false;
43282
+ if (v.required !== void 0 && v.required !== false) return false;
43283
+ if (v.defaultValue !== void 0 && v.defaultValue !== null) return false;
43284
+ if (v.storageKey !== void 0 && v.storageKey !== null) return false;
43285
+ if (v.bodyMode === "ui") {
43286
+ if (!isNSFunctionUIBody(v.uiAction)) return false;
43287
+ return v.code === void 0;
43288
+ }
43289
+ if (v.uiAction !== void 0 && v.uiAction !== null) return false;
43290
+ return typeof v.code === "string" && v.code.length > 0;
43291
+ }
43264
43292
  function isAnyMember(value) {
43265
43293
  return isMember(value) || isMemberOverride(value);
43266
43294
  }
43295
+ function isAnyMemberAuthoredOrCompiled(value) {
43296
+ return isAnyMember(value) || isUncompiledMemberNSFunctionOverride(value);
43297
+ }
43267
43298
  var FunctionMemberNamePattern, FunctionArgumentReservedNames, NSFunctionArgumentReservedNames, DECIMAL_STRING_PATTERN, DECIMAL_MAX_SIGNIFICANT_DIGITS, DECIMAL_MAX_SCALE;
43268
43299
  var init_member_kinds = __esm({
43269
43300
  "../src/models/members/member-kinds.ts"() {
@@ -73589,7 +73620,7 @@ function readProjectDocument(value, options = {}) {
73589
73620
  members: readArrayField(
73590
73621
  value,
73591
73622
  "members",
73592
- isAnyMember
73623
+ options.members === "authored-or-compiled" ? isAnyMemberAuthoredOrCompiled : isAnyMember
73593
73624
  ),
73594
73625
  classes: readArrayField(value, "classes", isNeoSchemaClass),
73595
73626
  constructors: readOptionalArrayField(
@@ -93455,6 +93486,9 @@ function replayAnimationDeclarationInitializersV4(records2, document, fallbackDo
93455
93486
  rootOwners,
93456
93487
  rootKinds
93457
93488
  );
93489
+ const resolvedMembers = new Map(
93490
+ document.members.map((member) => [member.id, member])
93491
+ );
93458
93492
  const pulled = /* @__PURE__ */ new Map();
93459
93493
  for (const record3 of records2) {
93460
93494
  const recordId = record3.data.id;
@@ -93464,7 +93498,10 @@ function replayAnimationDeclarationInitializersV4(records2, document, fallbackDo
93464
93498
  recordId,
93465
93499
  contentHash: "prospective-animation-validation",
93466
93500
  deleted: false,
93467
- data: record3.data
93501
+ // Initializer replay consumes the runtime document shape too. Reuse the
93502
+ // transiently hydrated member instead of feeding sparse callable
93503
+ // overrides back through the strict full-record reader.
93504
+ data: record3.recordKind === "member" ? resolvedMembers.get(recordId) ?? record3.data : record3.data
93468
93505
  });
93469
93506
  }
93470
93507
  const replayDocument = readPulledProjectDocumentV4(pulled);
@@ -93582,6 +93619,11 @@ function prospectiveAnimationDocumentV4(records2) {
93582
93619
  (record3) => record3.recordKind === "class" && (Array.isArray(record3.data.constructorProjections) || declaresAnimationWorldKind(record3.data.system))
93583
93620
  );
93584
93621
  if (!hasAnimationSchema) return null;
93622
+ const memberRecords = new Map(
93623
+ candidates.flatMap(
93624
+ (record3) => record3.recordKind === "member" && typeof record3.data.id === "string" ? [[record3.data.id, record3.data]] : []
93625
+ )
93626
+ );
93585
93627
  let project;
93586
93628
  const classes = [];
93587
93629
  const members = [];
@@ -93602,12 +93644,16 @@ function prospectiveAnimationDocumentV4(records2) {
93602
93644
  }
93603
93645
  classes.push(record3.data);
93604
93646
  } else if (record3.recordKind === "member") {
93605
- if (!isMember(record3.data)) {
93647
+ const member = hydrateProspectiveCallableOverride(
93648
+ record3.data,
93649
+ memberRecords
93650
+ );
93651
+ if (!isMember(member)) {
93606
93652
  throw new Error(
93607
93653
  `Prospective animation validation received an invalid member record ${recordLabel(record3.data)}.`
93608
93654
  );
93609
93655
  }
93610
- members.push(record3.data);
93656
+ members.push(member);
93611
93657
  } else if (record3.recordKind === "value") {
93612
93658
  if (!isMemberValue(record3.data)) {
93613
93659
  throw new Error(
@@ -93641,6 +93687,34 @@ function prospectiveAnimationDocumentV4(records2) {
93641
93687
  });
93642
93688
  return { project, classes, members, values: validationValues };
93643
93689
  }
93690
+ function hydrateProspectiveCallableOverride(data, members) {
93691
+ if (data.kind !== 13 /* Function */ && data.kind !== 23 /* NSFunction */ || typeof data.extendsMemberId !== "string") {
93692
+ return data;
93693
+ }
93694
+ const hydrated = { ...data };
93695
+ for (const field of [
93696
+ "returnTypeInfo",
93697
+ "argumentTypes",
93698
+ "deferred"
93699
+ ]) {
93700
+ if (Object.hasOwn(hydrated, field)) continue;
93701
+ const inherited = resolveProspectiveMemberField(data, field, members);
93702
+ if (inherited !== void 0) hydrated[field] = inherited;
93703
+ }
93704
+ return hydrated;
93705
+ }
93706
+ function resolveProspectiveMemberField(start, field, members) {
93707
+ let current = start;
93708
+ const visited = /* @__PURE__ */ new Set();
93709
+ while (current !== void 0) {
93710
+ if (Object.hasOwn(current, field)) return current[field];
93711
+ const parentId = current.extendsMemberId;
93712
+ if (typeof parentId !== "string" || visited.has(parentId)) return void 0;
93713
+ visited.add(parentId);
93714
+ current = members.get(parentId);
93715
+ }
93716
+ return void 0;
93717
+ }
93644
93718
  function declaresAnimationWorldKind(system) {
93645
93719
  if (!isObjectRecord2(system)) return false;
93646
93720
  const worldKind = system.worldKind;
@@ -95050,7 +95124,8 @@ function readPulledProjectDocumentV4(records2) {
95050
95124
  ),
95051
95125
  {
95052
95126
  constructors: "authored-or-compiled",
95053
- identities: "prospective"
95127
+ identities: "prospective",
95128
+ members: "authored-or-compiled"
95054
95129
  }
95055
95130
  );
95056
95131
  }
@@ -111549,7 +111624,7 @@ var init_registry2 = __esm({
111549
111624
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
111550
111625
  formatVersion: 3,
111551
111626
  contractVersion: "3.13",
111552
- cliVersion: "0.31.12",
111627
+ cliVersion: "0.31.14",
111553
111628
  projectFileUploadBatchSize: 32,
111554
111629
  documentRecords: {
111555
111630
  member: {
@@ -118144,7 +118219,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
118144
118219
  async function main() {
118145
118220
  const args = parseArgs(process.argv.slice(2));
118146
118221
  if (args.command === "--version") {
118147
- console.log("0.31.12");
118222
+ console.log("0.31.14");
118148
118223
  return;
118149
118224
  }
118150
118225
  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.14",
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.14 -->
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.14 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale