@neocompose/cli 0.33.0 → 0.33.2

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,28 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.33.2] - 2026-08-19
4
+
5
+ ### Fixed
6
+
7
+ - Preserve authored non-null generic fields while projecting the local schema
8
+ manifest used by `neo script check --all`, so a `T` field read remains `T`
9
+ instead of becoming `T?` from the storage placeholder's structural flags.
10
+ - Compile prospective functions, properties, migrations, and ad-hoc scripts
11
+ against the complete project context, including declared constructors,
12
+ project files, and variants. `neo test` now resolves required Class-header
13
+ constructors instead of incorrectly falling back to their stored fields.
14
+
15
+ ## [0.33.1] - 2026-08-19
16
+
17
+ ### Fixed
18
+
19
+ - Preserve an authored non-null `T` member while recompiling an open generic
20
+ Class from its lowered project records, so `neo test` no longer rejects
21
+ valid generic getters as returning `T?` during animation declaration replay.
22
+ - Identify the actual NeoScript property and getter or setter position when
23
+ prospective replay compilation fails, instead of reporting only the
24
+ unrelated animation value that triggered whole-document validation.
25
+
3
26
  ## [0.33.0] - 2026-08-19
4
27
 
5
28
  ### Added
package/dist/neo.mjs CHANGED
@@ -32824,7 +32824,7 @@ function memberType(member, environment, visiting, field) {
32824
32824
  return typeParameter(
32825
32825
  string2(member.genericParamId, `${field}.genericParamId`),
32826
32826
  environment,
32827
- nullable
32827
+ false
32828
32828
  );
32829
32829
  }
32830
32830
  return { ...unknownType(), nullable };
@@ -61279,7 +61279,14 @@ function memberRuntimeType(record3, context, seen = /* @__PURE__ */ new Set(), g
61279
61279
  }
61280
61280
  return genericParameterLanguageType(
61281
61281
  genericParamId,
61282
- required2,
61282
+ // A Generic schema member is a value-less placeholder, so its stored
61283
+ // `required` is always false even when the authored slot is spelled
61284
+ // `T`. Project-source declarations forbid `T?` member slots because
61285
+ // the concrete binding owns storage nullability. While compiling the
61286
+ // open declaring Class, preserve the authored `T` surface instead of
61287
+ // turning every read into `T?`; closed receivers still take the
61288
+ // concrete binding branch above and retain its real nullability.
61289
+ true,
61283
61290
  context,
61284
61291
  genericEnvironment
61285
61292
  );
@@ -94844,7 +94851,7 @@ function replayAnimationDeclarationInitializersV4(records2, document, fallbackDo
94844
94851
  documentBodiesCompiled = true;
94845
94852
  } catch (error) {
94846
94853
  throw new Error(
94847
- `Animation declaration replay failed for value "${row.id}": ${error instanceof Error ? error.message : String(error)}`,
94854
+ `Animation declaration replay failed for value "${row.id}": ${describePulledProjectBodyCompileError(error)}`,
94848
94855
  { cause: error }
94849
94856
  );
94850
94857
  }
@@ -96098,6 +96105,16 @@ var init_server_preparation_preflight = __esm({
96098
96105
  });
96099
96106
 
96100
96107
  // src/project-source/initializer-replay.ts
96108
+ function describePulledProjectBodyCompileError(error) {
96109
+ const fallback = error instanceof Error ? error.message : String(error);
96110
+ if (!(error instanceof CompileError)) return fallback;
96111
+ const site = pulledBodyCompileSites.get(error);
96112
+ if (site === void 0) return fallback;
96113
+ const position = `${error.line}:${error.column}`;
96114
+ const detailPrefix = `${position}: `;
96115
+ const detail = error.message.startsWith(detailPrefix) ? error.message.slice(detailPrefix.length) : error.message;
96116
+ return `Member "${site.memberName}" (${site.memberId}) ${error.unit ?? "body"} failed at ${position}: ${detail}`;
96117
+ }
96101
96118
  function replayStoredConstructionV4(args) {
96102
96119
  const document = args.document ?? readPulledProjectDocumentV4(args.records);
96103
96120
  const compilationProject = args.compilationProject ?? (args.compileDocumentBodies === true ? createNeoScriptCompilationProject({
@@ -96343,11 +96360,21 @@ function compilePulledProjectDocumentForEvaluationV4(document, compilationProjec
96343
96360
  )
96344
96361
  );
96345
96362
  for (const member of compileArgs.members) {
96346
- compileAuthoredMemberBodies({
96347
- ...compileArgs,
96348
- member,
96349
- thisClass: ownerClassByMemberId.get(member.id) ?? null
96350
- });
96363
+ try {
96364
+ compileAuthoredMemberBodies({
96365
+ ...compileArgs,
96366
+ member,
96367
+ thisClass: ownerClassByMemberId.get(member.id) ?? null
96368
+ });
96369
+ } catch (error) {
96370
+ if (error instanceof CompileError) {
96371
+ pulledBodyCompileSites.set(error, {
96372
+ memberId: member.id,
96373
+ memberName: member.name
96374
+ });
96375
+ }
96376
+ throw error;
96377
+ }
96351
96378
  }
96352
96379
  for (const site of valueInitializerCompilationSites(document).values()) {
96353
96380
  if (isInitValueContent(site.row) && site.row.init.compiled !== void 0) {
@@ -96509,7 +96536,7 @@ function replayWorkspace(records2) {
96509
96536
  state: { records: stateRecords }
96510
96537
  };
96511
96538
  }
96512
- var pulledValueInitializerCompilationSites;
96539
+ var pulledBodyCompileSites, pulledValueInitializerCompilationSites;
96513
96540
  var init_initializer_replay = __esm({
96514
96541
  "src/project-source/initializer-replay.ts"() {
96515
96542
  "use strict";
@@ -96524,6 +96551,7 @@ var init_initializer_replay = __esm({
96524
96551
  init_constructors2();
96525
96552
  init_neoscript_evaluator();
96526
96553
  init_compiler_adapter();
96554
+ pulledBodyCompileSites = /* @__PURE__ */ new WeakMap();
96527
96555
  pulledValueInitializerCompilationSites = /* @__PURE__ */ new WeakMap();
96528
96556
  }
96529
96557
  });
@@ -107110,6 +107138,7 @@ function createCliNeoScriptContext(options) {
107110
107138
  const members = [...options.documents.members];
107111
107139
  const vm = {
107112
107140
  project: options.documents.project,
107141
+ projectFiles: [...options.documents.projectFiles ?? []],
107113
107142
  members,
107114
107143
  classes: [...options.documents.classes],
107115
107144
  enums: [...options.documents.enums],
@@ -107129,7 +107158,9 @@ function createCliNeoScriptContext(options) {
107129
107158
  ...options.functionReturnTypeInfo ? { functionReturnTypeInfo: options.functionReturnTypeInfo } : {},
107130
107159
  ...options.functionArguments ? { functionArguments: options.functionArguments } : {},
107131
107160
  ...options.functionDeferred !== void 0 ? { functionDeferred: options.functionDeferred } : {},
107132
- ...options.functionName ? { functionName: options.functionName } : {}
107161
+ ...options.functionName ? { functionName: options.functionName } : {},
107162
+ ...options.documents.variants?.length ? { variants: [...options.documents.variants] } : {},
107163
+ ...options.documents.variantFolders?.length ? { variantFolders: [...options.documents.variantFolders] } : {}
107133
107164
  });
107134
107165
  if (!options.manifest) return compilerContext;
107135
107166
  const projection = projectSchemaManifest(options.manifest, {
@@ -107768,11 +107799,14 @@ function readDocumentArrays(raw) {
107768
107799
  }
107769
107800
  return {
107770
107801
  project: raw.project,
107802
+ projectFiles: arrayOf2("projectFiles"),
107771
107803
  members: arrayOf2("members"),
107772
107804
  classes: arrayOf2("classes"),
107773
107805
  constructors: arrayOf2("constructors"),
107774
107806
  enums: arrayOf2("enums"),
107775
107807
  interfaces: arrayOf2("interfaces"),
107808
+ variants: arrayOf2("variants"),
107809
+ variantFolders: arrayOf2("variantFolders"),
107776
107810
  values: arrayOf2("values"),
107777
107811
  dialogues: arrayOf2("dialogues"),
107778
107812
  dialogueRecords: arrayOf2("dialogueRecords"),
@@ -107780,7 +107814,6 @@ function readDocumentArrays(raw) {
107780
107814
  dialogueGroups: arrayOf2("dialogueGroups"),
107781
107815
  priorityGroups: arrayOf2("priorityGroups"),
107782
107816
  migrations: arrayOf2("migrations"),
107783
- projectFiles: arrayOf2("projectFiles"),
107784
107817
  localizationConfig: raw.localizationConfig,
107785
107818
  localizedTexts: arrayOf2("localizedTexts")
107786
107819
  };
@@ -108383,12 +108416,19 @@ async function runScript(workspace, command, options, dependencies = {}) {
108383
108416
  unit,
108384
108417
  code: source
108385
108418
  });
108386
- const compileContext = {
108419
+ const compilerProject = {
108387
108420
  project: document.project,
108421
+ projectFiles: document.projectFiles,
108388
108422
  members: document.members,
108389
108423
  classes: document.classes,
108424
+ constructors: document.constructors,
108390
108425
  enums: document.enums,
108391
108426
  interfaces: document.interfaces,
108427
+ variants: document.variants,
108428
+ variantFolders: document.variantFolders
108429
+ };
108430
+ const compileContext = {
108431
+ ...compilerProject,
108392
108432
  thisClass,
108393
108433
  returnTypeInfo: parseReturns(options.returns, document),
108394
108434
  dialogueContext: null
@@ -108437,11 +108477,7 @@ async function runScript(workspace, command, options, dependencies = {}) {
108437
108477
  }
108438
108478
  compiled = compileNeoScriptBodyOrThrow(
108439
108479
  () => compileNSFunction(source, {
108440
- project: document.project,
108441
- members: document.members,
108442
- classes: document.classes,
108443
- enums: document.enums,
108444
- interfaces: document.interfaces,
108480
+ ...compilerProject,
108445
108481
  thisClass,
108446
108482
  returnTypeInfo: nsFunctionDefinition.returnTypeInfo,
108447
108483
  argumentTypes: nsFunctionDefinition.argumentTypes,
@@ -108457,11 +108493,7 @@ async function runScript(workspace, command, options, dependencies = {}) {
108457
108493
  }
108458
108494
  compiled = compileNeoScriptBodyOrThrow(
108459
108495
  () => compileNSSetter(source, {
108460
- project: document.project,
108461
- members: document.members,
108462
- classes: document.classes,
108463
- enums: document.enums,
108464
- interfaces: document.interfaces,
108496
+ ...compilerProject,
108465
108497
  thisClass,
108466
108498
  valueTypeInfo: resolveScriptPropertyReturnTypeInfo(
108467
108499
  setterMember,
@@ -112370,10 +112402,27 @@ async function buildPostPushCompileSchema(workspace, status) {
112370
112402
  }
112371
112403
  return {
112372
112404
  project,
112405
+ projectFiles: [...bucket("project-file").values()],
112373
112406
  members: [...bucket("member").values()],
112374
112407
  classes: [...bucket("class").values()],
112408
+ constructors: [...bucket("constructor").values()],
112375
112409
  enums: [...bucket("enum").values()],
112376
- interfaces: [...bucket("interface").values()]
112410
+ interfaces: [...bucket("interface").values()],
112411
+ variants: [...bucket("variant").values()],
112412
+ variantFolders: [...bucket("variant-folder").values()]
112413
+ };
112414
+ }
112415
+ function postPushCompilerProject(schema) {
112416
+ return {
112417
+ project: schema.project,
112418
+ projectFiles: schema.projectFiles,
112419
+ members: schema.members,
112420
+ classes: schema.classes,
112421
+ constructors: schema.constructors,
112422
+ enums: schema.enums,
112423
+ interfaces: schema.interfaces,
112424
+ variants: schema.variants,
112425
+ variantFolders: schema.variantFolders
112377
112426
  };
112378
112427
  }
112379
112428
  function containingClass(schema, memberId) {
@@ -112405,11 +112454,7 @@ function compileNSPropertyChange(schema, memberData, locator) {
112405
112454
  const code = memberData.code;
112406
112455
  next.getter = compileNeoScriptBodyOrThrow(
112407
112456
  () => compileNSGetter2(code, {
112408
- project: schema.project,
112409
- members: schema.members,
112410
- classes: schema.classes,
112411
- enums: schema.enums,
112412
- interfaces: schema.interfaces,
112457
+ ...postPushCompilerProject(schema),
112413
112458
  thisClass,
112414
112459
  returnTypeInfo,
112415
112460
  dialogueContext: null,
@@ -112426,11 +112471,7 @@ function compileNSPropertyChange(schema, memberData, locator) {
112426
112471
  const setterCode = memberData.setterCode;
112427
112472
  next.setter = compileNeoScriptBodyOrThrow(
112428
112473
  () => compileNSSetter2(setterCode, {
112429
- project: schema.project,
112430
- members: schema.members,
112431
- classes: schema.classes,
112432
- enums: schema.enums,
112433
- interfaces: schema.interfaces,
112474
+ ...postPushCompilerProject(schema),
112434
112475
  thisClass,
112435
112476
  valueTypeInfo: returnTypeInfo,
112436
112477
  implicitMemberAccess: true,
@@ -112455,11 +112496,7 @@ function compileNSFunctionChange(schema, memberData, locator) {
112455
112496
  const thisClass = containingClass(schema, memberData.id);
112456
112497
  next.action = compileNeoScriptBodyOrThrow(
112457
112498
  () => compileNSFunction2(code, {
112458
- project: schema.project,
112459
- members: schema.members,
112460
- classes: schema.classes,
112461
- enums: schema.enums,
112462
- interfaces: schema.interfaces,
112499
+ ...postPushCompilerProject(schema),
112463
112500
  thisClass,
112464
112501
  returnTypeInfo: contract.returnTypeInfo,
112465
112502
  argumentTypes: contract.argumentTypes,
@@ -112799,11 +112836,7 @@ function compileMigrationAction(schema, migrationData, locator) {
112799
112836
  const code = String(migrationData.code);
112800
112837
  return compileNeoScriptBodyOrThrow(
112801
112838
  () => compileNSVoidBody2(code, {
112802
- project: schema.project,
112803
- members: schema.members,
112804
- classes: schema.classes,
112805
- enums: schema.enums,
112806
- interfaces: schema.interfaces,
112839
+ ...postPushCompilerProject(schema),
112807
112840
  thisClass,
112808
112841
  dialogueContext: null,
112809
112842
  migrationContext: true
@@ -112911,7 +112944,7 @@ var init_registry2 = __esm({
112911
112944
  PROJECT_SCHEMA_CONTRACT = Object.freeze({
112912
112945
  formatVersion: 3,
112913
112946
  contractVersion: "3.13",
112914
- cliVersion: "0.33.0",
112947
+ cliVersion: "0.33.2",
112915
112948
  projectFileUploadBatchSize: 32,
112916
112949
  documentRecords: {
112917
112950
  member: {
@@ -116784,10 +116817,14 @@ async function runPendingMigrations(workspace, client, raw, migrations, onlyRef,
116784
116817
  const compiled = pinned !== void 0 && pinned !== null ? pinned : compileNeoScriptBodyOrThrow(
116785
116818
  () => compileNSVoidBody(migrationCode, {
116786
116819
  project: document.project,
116820
+ projectFiles: document.projectFiles,
116787
116821
  members: document.members,
116788
116822
  classes: document.classes,
116823
+ constructors: document.constructors,
116789
116824
  enums: document.enums,
116790
116825
  interfaces: document.interfaces,
116826
+ variants: document.variants,
116827
+ variantFolders: document.variantFolders,
116791
116828
  thisClass,
116792
116829
  dialogueContext: null,
116793
116830
  migrationContext: true
@@ -119506,7 +119543,7 @@ There is no --keep-current: preserving current semantic state defines flatten.
119506
119543
  async function main() {
119507
119544
  const args = parseArgs(process.argv.slice(2));
119508
119545
  if (args.command === "--version") {
119509
- console.log("0.33.0");
119546
+ console.log("0.33.2");
119510
119547
  return;
119511
119548
  }
119512
119549
  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.33.0",
3
+ "version": "0.33.2",
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.33.0 -->
12
+ <!-- reviewed-through-cli: 0.33.2 -->
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.33.0 -->
86
+ <!-- reviewed-through-cli: 0.33.2 -->
87
87
  ```
88
88
 
89
89
  The quoted version above is checked too, so this instruction cannot go stale